記一次PHP最佳化案例
網站架構簡介:
現在很多的企業都是使用 lnmp 或者 lamp 來做企業的 網站伺服器架構,這兩種網站的服務架構,我們都是比較熟悉的;基於 nginx 的效能優於 Apache ,現階段的很多公司,都是逐漸把 Apache 替換成 nginx ,畢竟 nginx 的自帶的高可用配置,反向代理等等功能相當突出。
Lnmp 網站伺服器架構 , 其實就是 linx+nginx+mysql+php 架構體系,架構安裝我就不多說了。接下來我們來談談,我遇到案例吧
案例:
有一天,後臺的同事,說後臺訪問很慢,而且有時候出現 502 錯誤。然後反饋給技術上級,接著又找到我處理一下(那時在喝著茶),然後我知道又有事幹了。
分析:
然後我直接找到那個同事,問問是不是網路原因啊,我也叫其他的同事,訪問一下,還是出現訪問忙的問題。這時我就知道事情沒那麼簡單了。 公司應用的是 lnmp 網站伺服器架構 , 以前沒有做太多的最佳化,接下來我們需要最佳化網站的服務架構了
一、案例分析。
我們可以想到,既然是訪問緩慢,有時候直接訪問不了,以前是沒問題的,到現在就突然出現了問題,那必定是我們的 nginx 與 php 響應不過來導致的,原因可能是其他域名網站的使用者連線數巨增導致的。那我們找到問題的根源解決並最佳化就可以了。接著憑著自己的經驗與百度,去解決問題。
二、問題解決與過程分析
1 、 Nginx 最佳化:
1 、檢視 nginx 的日誌,找出錯誤
$ cat /usr/local/nginx/logs/error.log | grep error
沒發現錯誤,正常
檢視後臺域名的 access.logs
$ cat /var/log/ access _nging.log | grep error
( 這裡沒及時截到圖,日誌是被刷了,本地做了日誌切割,並定時刪除了 )
發現日誌日誌裡面可以找到 error 錯誤資訊,並且有十幾個 502 錯誤。找到出現的問題了 。
2 、問題分析以及 nginx 最佳化
1 、 nginx 開啟檔案數限制導致的。
1) 、首先我們想到可能的原因 nginx 的開啟檔案書的問題,增加 nginx 的開啟檔案數
進入 nginx 配置檔案,發現開啟檔案數為 4096, 果不其然,開啟檔案數沒有調到最佳,可能是這個原因導致的。我們需要把 4096 改為 51200 ;儲存重新載入 nginx
# vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 51200;
events {
worker_connections 51200;
}
#service nginx relaod
2 )、 Linux 系統檔案限制
我們改了 nginx 的開啟檔案配置,不一定有用,我們需要看一下系統的限制的開啟檔案數
# ulimit –n
我們可以看到系統的檔案開啟數量也是 4096 ,接下來,我們更改一下系統的開啟檔案數,並配置永久生效。
進入配置檔案
# vim /etc/security/limits.conf
更改引數:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
注:系統限制可以隨便改,我只要比 nginx 的開啟檔案數大就好。
3 、 nginx 的 fastcgi 連線時間太短導致的。
一般 nginx 響應 php , 都是透過 FastCGI 介面來呼叫,所以 fastcgi 引數配置很重要, 當 HTTP 伺服器每次遇到動態程式時,可以將其直接交付給 FastCGI 程式來執行,然後將得到的結果返回給瀏覽器 ,而很多 php 的網頁都是採用動態程式。所以 fastcgi 的配置,也起的至關重要的作用。所以這是一個最佳化不可缺少的一部分。
進入 nginx.conf 配置檔案
# vim /usr/local/nginx/conf/nginx.conf
把 fastcgi 的 connect 、 send 、 read 的引數的時間改成 300 ,配置如下 :
重新載入nginx
#service nginx reload
4 、訪問域名測試。
重新訪問域名,發現網頁已經載入出來了,持續訪問了幾次,發現訪問還是有點慢,雖然訪問穩定了。到這裡,我們就可以把問題指向到php裡面了,繼續下一步的php最佳化。
2 、Php最佳化:
1 、檢視php日誌
首先,我們需要跟nginx的操作一樣,需要先檢視一下日誌。
#tail -n 100 /usr/local/php/var/log/php-fpm.log
在日誌裡面我們可以發現,php日誌出現警告
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)
從告警的意思,我們知道php出現告警了,而且是叫我們增加php的, pm.start_servers, or pm.min/max_spare_servers 的值。
2 、原因分析
首先我們,看到日誌只是出現這個警告,證明還不是很嚴重,至於為什麼出現 這個警告,接下來我們一起分析一下。
首先我們很明確的知道, pm.start_servers, 、 pm.min/max_spare_servers 在php裡面是起著啥作用先,為什麼會出現這個警告。我先把的以前的配置引數貼一下。
接下來我們分析一下這幾個引數的作用:
引數分析:
· pm= dynamic 表示php啟用的動態模式 注: php有動態和靜態(static)兩種工作模式,預設是動態模式。
· pm.max_children 表示靜態下最大執行緒數
· pm.start_servers 表示動態下啟動時的執行緒數,該引數大於pm.min_spare_servers,小於pm.max_spare_servers
· pm.min_spare_servers 表示動態下最小空閒執行緒數
· pm.max_spare_servers 表示動態下最大空閒執行緒數
工作模式:
Static 模式
當工作模式設定為靜態後,就只有pm.max_children項有效,即表示php-fpm工作時一直保持的執行緒數。
Dynamic 模式
動態模式下,與他相關的引數有 pm.start_servers 、 pm.min_spare_servers 、 pm.max_spare_servers ,分別表示開啟的 php 程式數,最小的程式數、與最大的程式數。
模式比較:
靜態模式 的話,比較適合一些記憶體比較大一點的伺服器,8G及以上的,因為 對於比較大記憶體的伺服器來說,設定為靜態的話會提高效率 。
動態模式 適合小記憶體機器,靈活分配程式,省記憶體。可以讓php自動增加和減少程式數,不過動態建立回收程式對伺服器也是一種消耗。
3 、php引數最佳化
首先我們需要考慮一下問題,如何去除錯引數,達到最佳化的目的呢,一般來說 開始的時候一個 php-fpm 程式只佔用 3M 左右記憶體 ,但是執行一段時間後就會上升到 20-40M ,這是因為 PHP 程式在執行完成後,或多或少會產生記憶體的洩露。
所以按理來說 php 的最大的程式數,大概是本地記憶體 /40 ,因為也要考慮系統佔用記憶體的的這種情況,我們不能直接把除處理的結果,當成的最大程式數,不然你會死翹翹的。
我的伺服器是 8G 記憶體的,所以按理來說是,最大的 php 程式數是 200 左右,所以按這個引數我做了一下調整:
採用靜態模式,最大程式數設為125-150之間,搞定。
重新載入php
#service php-fpm relod
檢視程式數:
# netstat -anpo | grep php-fpm | wc -l
128
效果達到了
4 、結果
重新訪問,發現訪問php頁面快了很多,檢視日誌,沒出現告警了,後臺訪問也好了。
3 、壓測
一個網站的效能好不好,承受量有多高,這個我們可以透過壓測去,去獲取資料,我這裡簡單介紹ab工具來做壓測,用法如下
ab -n 1000000 -c 10000 http:// 域名 /test.php ( 一個php檔案)
-n 參數列示 你壓力測試 總量
-c 參數列示 你的模擬的併發使用者數
Ab 壓力測試工具,是apache自帶的,用起來也方便,只要本地有,就可以遠端測你的伺服器的效能了。個人覺得還是可以了,下面是模擬一千個使用者訪問100000次的結果,但然你自己壓測的時候,慢慢的提升引數,測試你的網站的瓶頸。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992957/viewspace-2755593/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 記錄一次 postgresql 最佳化案例( 巢狀迴圈改HASH JOIN )SQL巢狀
- 一次系統延遲性最佳化案例
- 記一次介面最佳化操作
- 記一次JAVA 程式最佳化之旅Java
- 記一次前端效能優化的案例前端優化
- 記一次遷移和效能最佳化
- 記錄一次 postgresql 最佳化案例( volatility 自定義函式無法並行查詢 )SQL函式並行
- 記錄工作過程中一次業務最佳化
- 記一次遠端協助的排錯案例
- PHP介面案例PHP
- 一次Oracle診斷案例-Spfile案例Oracle
- union all 最佳化案例
- 記一次生產慢sql索引最佳化及思考SQL索引
- 記一次Oracle Sql最佳化經歷--消耗過多CPUOracleSQL
- php函式案例PHP函式
- 記一次儲存問題導致的rac故障案例
- 記一次PHP的Invalid binding type問題PHP
- 記錄一次CTF解題PHP反序列化PHP
- oracle一次卡頓案例(三)Oracle
- oracle一次卡頓案例(四)Oracle
- php 反射機制案例PHP反射
- SQL最佳化案例-使用with as最佳化Subquery Unnesting(七)SQL
- PHP引擎php.ini引數最佳化PHP
- 記錄一次 PHP-fpm 佔 CPU 100% 修復PHP
- 記一次 PHP artisan 命令無任何反應的問題PHP
- SQL最佳化案例-union代替or(九)SQL
- 線上最佳化之案例實戰
- OB_MYSQL UPDATE 最佳化案例MySql
- Oracle "腦殘" CBO 最佳化案例Oracle
- 一次expdp/impdp遷移案例
- 一次成功的優化案例優化
- PHP效能最佳化大全(整理)PHP
- php-fpm的最佳化PHP
- 完整的php微服務案例PHP微服務
- PHP匯出報表(案例)PHP
- 壓測平臺 - 記錄一次百億級資料查詢最佳化
- 線上業務最佳化之案例實戰
- Sql 巢狀迴圈最佳化案例SQL巢狀