您好,登錄后才能下訂單哦!
前言:
最近在騰訊云買了臺學(xué)生機(jī)打算搭個博客玩玩,由于空間還在備案中,于是就想著先把環(huán)境(LNMP+phpmyadmin+wordpress)部署好,環(huán)境很順利,但晚上重新連上云服務(wù)器敲命令時那延時真是叫一個痛苦啊,思來想去覺得八成是內(nèi)存被耗盡了,于是開始排查優(yōu)化之旅
查看內(nèi)存使用情況:
# free -m total used free shared buffers cached Mem: 996 933 63 0 74 268 -/+ buffers/cache: 284 712 Swap: 0 0 0
果然,內(nèi)存幾乎被吃盡,看看哪些亂來的進(jìn)程吃了我的內(nèi)存
# ps -A --sort -rss -o comm,pmem,pcpu |uniq -c |head -10 1 COMMAND %MEM %CPU 1 mysqld 9.1 0.0 1 php-fpm 3.6 0.9 1 php-fpm 3.4 0.9 1 php-fpm 3.4 0.8 1 php-fpm 3.4 0.9 2 php-fpm 3.4 0.8 2 php-fpm 3.4 0.6 1 php-fpm 3.4 0.8 3 php-fpm 3.4 0.9 # ps aux | grep php-fpm |wc -l 22
除去以root身份運(yùn)行的作為管理各個php-fpm進(jìn)程的 master 進(jìn)程與grep進(jìn)程,php-fpm竟然有多達(dá)20個占用3.4M的php-fpm進(jìn)程
先把mysqld放一邊,我們發(fā)現(xiàn)很大一部分的內(nèi)存都被 php-fpm 進(jìn)程吞了,看來有必要對 php-fpm 做個優(yōu)化了
優(yōu)化前,我們有必要了解一下 php-fpm 這個組件,以及php-fpm在 nginx 環(huán)境下必不可缺的原因
php-fpm:php-FastCGI Process Manager
我們知道apache與php結(jié)合的方式有3種: (找機(jī)會對這3種方式做個詳細(xì)介紹)
1.配置apache,將php解釋器作為cgi腳本
2.將php直接裝載進(jìn)apache模塊
3.使用fastcgi
[注]apache默認(rèn)使用第二種方式
但是,Nginx不支持對外部程序的直接調(diào)用或者解析,并且Nginx默認(rèn)就不支持cgi模式,所以通常Nginx都是使用 fastcgi 的方式與php結(jié)合
簡單介紹fast-cgi
fast-cgi在安裝后一旦啟用將 監(jiān)聽在TCP的某個套接字 上,通常表現(xiàn)為 127.0.0.1:9000 ,于是現(xiàn)在客戶端瀏覽器訪問一個動態(tài)網(wǎng)頁(如index.php)時發(fā)生的行為:nginx將用戶的http請求接進(jìn)來,發(fā)現(xiàn)用戶請求的是一個php腳本,于是交給fastcgi分析處理,處理完畢后(經(jīng)過php解釋器解釋與從mysql中取數(shù)據(jù))將結(jié)果回送給nginx,nginx最后將靜態(tài)內(nèi)容返回給客戶端,所以我們能感受到fast-cgi的一大好處是:將動態(tài)腳本的解釋過程從nginx抽出,使得nginx只需專注于與客戶端交互靜態(tài)資源,而將動態(tài)php腳本分析統(tǒng)統(tǒng)扔給fast-cgi,這樣一來能將動態(tài)腳本分析過程從nginx進(jìn)程中解放出來從而增強(qiáng)nginx的并發(fā)能力,二來當(dāng)php掛了不至于讓nginx一起掛了
介紹完fast-cgi的重要性,只是希望告訴大家雖然現(xiàn)在php-fpm占用了不少的內(nèi)存空間,但可不能將其打入冷宮,隨隨便便把它們kill或者將php-fpm服務(wù)停掉了(這樣你的網(wǎng)站將無法訪問),下面先介紹一下php-fpm配置文件一些重要參數(shù)的含義,然后再針對性得做些優(yōu)化措施
由于我是rpm安裝的php-fpm,所以得先找找相關(guān)配置文件
# rpm -qc php-fpm /etc/logrotate.d/php-fpm /etc/php-fpm.conf /etc/php-fpm.d/www.conf /etc/sysconfig/php-fpm
根據(jù)上方ps的提示,我們這里應(yīng)當(dāng)重點(diǎn)優(yōu)化php-fpm與www相關(guān)的參數(shù)
# cat /etc/php-fpm.d/www.conf | grep -v "^;" [www] listen = 127.0.0.1:9000 listen.allowed_clients = 127.0.0.1 user = apache group = apache pm = dynamic # pm模式 pm.max_children = 20 # 最大可創(chuàng)建的子進(jìn)程的數(shù)量 pm.start_servers = 10 # 隨著php-fpm-master一起啟動時創(chuàng)建的子進(jìn)程數(shù)目 pm.min_spare_servers = 5 # 服務(wù)器空閑時最小php-fpm進(jìn)程數(shù)量 pm.max_spare_servers = 20 # 服務(wù)器空閑時最大php-fpm進(jìn)程數(shù)量 slowlog = /var/log/php-fpm/www-slow.log # 慢查詢?nèi)罩敬娣怕窂?php_admin_value[error_log] = /var/log/php-fpm/www-error.log php_admin_flag[log_errors] = on php_value[session.save_handler] = files php_value[session.save_path] = /var/lib/php/session
pm的三種模式:
static 表示我們創(chuàng)建固定數(shù)量的php-fpm子進(jìn)程,所以只有 pm.max_children=20 參數(shù)生效。啟動php-fpm時會一次性全部啟動21(1個主+20個子)個進(jìn)程
dynamic 表示啟動進(jìn)程是動態(tài)分配的,子進(jìn)程的數(shù)量隨著請求量的變化以及上述一些參數(shù)限制動態(tài)變化著
ondemand 該模式下按需分配、銷毀子進(jìn)程,子進(jìn)程捆綁了空閑計(jì)時器 pm.process_idle_timeout 一旦空閑時間計(jì)時器超時就將子進(jìn)程kill
所以,現(xiàn)在結(jié)合php-fpm的默認(rèn)配置就能解釋:上面用ps輸出發(fā)現(xiàn)系統(tǒng)跑著20個php-fpm子進(jìn)程的原因了
我這個小小站,根據(jù) pm.start_servers=10 剛啟動php-fpm時會產(chǎn)生1個主進(jìn)程以及10個子進(jìn)程,當(dāng)這10個子進(jìn)程對用戶的大量動態(tài)請求忙不過來時,將不斷啟動新的php-fpm子進(jìn)程以滿足需要,但根據(jù) pm.max_children=20 系統(tǒng)最多只會產(chǎn)生20個子進(jìn)程,而由于 pm.max_spare_servers=20 假設(shè)某時間段內(nèi),網(wǎng)站一直沒人訪問,但卻仍需維護(hù)著20個子進(jìn)程,對于像我這種小小站而言,子進(jìn)程的空閑數(shù)量過多了,所以這也是一個優(yōu)化點(diǎn),嘮叨這么多怕大家反而暈頭轉(zhuǎn)向的,不妨瞅瞅我隨手畫的圖加深理解
大家有了這些知識做鋪墊,想必php-fpm的優(yōu)化技巧不用我說也能猜到一二了吧(如果看官依然懵逼那只能說“看來我這水平還不夠”)
優(yōu)化方案1:pm模式使用dynamic
配置要點(diǎn)
# vim /etc/php-fpm.d/www.conf pm = dynamic pm.max_children = 8 pm.start_servers = 3 pm.min_spare_servers = 3 pm.max_spare_servers = 5
重啟 php-fpm 并查看內(nèi)存占用情況
# service php-fpm restart 停止 php-fpm: [確定] 正在啟動 php-fpm: [確定] # free -m total used free shared buffers cached Mem: 996 410 585 0 90 111 -/+ buffers/cache: 209 787 Swap: 0 0 0
現(xiàn)在內(nèi)存使用量的確舒服多了,順便看看初始時啟用的子進(jìn)程數(shù)目
# ps aux | grep php-fpm | wc -l 5
5-2=3符合我們上方 pm.start_servers=3 的修改
此時nginx尚未配置頁面緩存,所以可以不斷刷新站點(diǎn)來測試(讓僅有的3個fpm進(jìn)程忙不過來)看看內(nèi)存占用情況,下面貼出測試后的現(xiàn)象
# free -m total used free shared buffers cached Mem: 996 517 478 0 90 112 -/+ buffers/cache: 314 681 Swap: 0 0 0
# ps aux | grep php-fpm | wc -l 7
系統(tǒng)當(dāng)前運(yùn)行的php-fpm子進(jìn)程個數(shù)也符合我們設(shè)置的 pm.max_spare_servers=5 (最大空閑進(jìn)程數(shù))
優(yōu)化方案2:pm模式使用 ondemand
配置要點(diǎn)
# vim /etc/php-fpm.d/www.conf pm = ondemand
網(wǎng)站在某刻有大量請求涌入時,內(nèi)存占用情況
# free -m total used free shared buffers cached Mem: 996 765 231 0 90 112 -/+ buffers/cache: 561 435 Swap: 0 0 0
網(wǎng)站平穩(wěn)時(沒人訪問)系統(tǒng)只跑了個 php-fpm master 進(jìn)程(因?yàn)樽舆M(jìn)程由于閑置時間過長而被kill掉了)所以此時內(nèi)存占用也就大大降低啦
# ps aux | grep php-fpm root 29549 0.0 0.6 317072 6148 ? Ss 10:16 0:00 php-fpm: master process (/etc/php-fpm.conf) root 30099 0.0 0.0 103272 884 pts/0 S+ 10:28 0:00 grep php-fpm # free -m total used free shared buffers cached Mem: 996 414 582 0 91 115 -/+ buffers/cache: 207 789 Swap: 0 0 0
看到這里,想必各位看官也能自己總結(jié)出php-fpm各模式下的優(yōu)缺點(diǎn)以及php-fpm的優(yōu)化技巧了吧
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。