記一次PHP最佳化案例

玻璃窗起霧了發表於2021-02-02

網站架構簡介:

現在很多的企業都是使用 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章