記錄一次PHP最佳化案例

藏色散人
發布: 2023-04-09 18:08:02
轉載
3149 人瀏覽過

網站架構簡介:
現在很多的企業都是使用lnmp或lamp來做企業的網站伺服器架構,這兩種網站的服務架構,我們都是比較熟悉的;基於nginx的性能優於Apache,現階段的很多公司,都是逐漸把Apache替換成nginx,畢竟nginx的自帶的高可用配置,反向代理等等功能相當突出。

Lnmp網站伺服器架構,其實就是linx nginx mysql php架構體系,架構安裝我就不多說了。接下來我們來談談,我遇到案例吧

案例:

有一天,後台的同事,說後台訪問很慢,而且有時候出現502錯誤。然後回饋給技術上級,接著又找到我處理一下(那時在喝著茶),然後我知道又有事乾了。

分析:

然後我直接找到那個同事,問問是不是網路原因啊,我也叫其他的同事,訪問一下,還是出現訪問忙的問題。這時我就知道事情沒那麼簡單了。公司應用的是lnmp網站伺服器架構,以前沒有做太多的優化,接下來我們需要優化網站的服務架構了

一、案例分析。

我們可以想到,既然是訪問緩慢,有時候直接訪問不了,以前是沒問題的,到現在就突然出現了問題,那必定是我們的nginx與php響應不過來導致的,原因可能是其他網域網站的用戶連線數大大增加導致的。那我們找到問題的根源解決並優化就可以了。接著憑著自己的經驗與百度,去解決問題。

二、問題解決與流程分析

1Nginx優化:

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, 或 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  (一个php文件)

-n参数表示 你压力测试 总量

-c参数表示 你的模拟的并发用户数

Ab压力测试工具,是apache自带的,用起来也方便,只要本地有,就可以远程测你的服务器的性能了。个人觉得还是可以了,下面是模拟一千个用户访问100000次的结果,但然你自己压测的时候,慢慢的提升参数,测试你的网站的瓶颈。

以上是記錄一次PHP最佳化案例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!