php效能優化

城裡的野山參發表於2022-04-26

背景

一個專案,甲方要求 TPS 達到 5000。框架是yii2。

解決過程

在此之前,並沒有碰到過此類提出明確效能指標的專案,這次算是頭一次。剛開始拿到這個需求的時候並沒有什麼頭緒,不知從何處下手,現在回過頭來看,出現這樣的情緒非常的正常。
不知道怎麼辦的時候,先找搜尋引擎,查檢視,蒐集下相關的資訊,主要是找找方向。
經過一番搜尋,大致有這麼幾個方面
1.PHP開啟opcache
2.代理伺服器(nginx)配置調整
3.php-fpm配置優化
4.程式碼,業務邏輯優化
5.核心引數優化

有了方向之後,逐條去確認就可以了,根據實際的壓測指標,opcache 的開啟對效能提升很大,具體操作如下

vim php.ini

新增
zend_extension=opcache.so  #這裡要注意的是 zend_extension,不是 extension

php -m 下看到
[Zend Modules]
Opcache
即說明已經開啟

php-fpm 的引數優化

vim php-fpm.conf

pm.max_children               #php-fpm可建立的最大的程式數
pm.start_servers              #php-fpm程式啟動建立的程式數
pm.min_spare_servers          #php-fpm管理的程式數不能小於它,start_servers不能小於它
pm.max_spare_servers          #php-fpm管理的最大程式數

通過對壓測指標(ab測試)以及 top 命令的觀察,此調整也有很明顯的效果,並且 php 對記憶體的消耗並不高,給了我另外一個思路,CPU 核數對效能的影響,後面也測試了不同核數對效能的影響。

多核的影響
前面發現對 php-fpm 的配置進行了大幅的提升之後,記憶體消耗並沒有明顯變化,根據分析,增加 CPU 可能會對效能有影響。

配置對比
8cpu  32g  395
16cpu 16g  831
32cpu 32g  432

壓測的指標很明確,cpu 核數的增加確實會對效能有提升,但也不是越多越好,需要根據資料找到一個合適的配置。

nginx 的配置優化

worker_processes        #一般與CPU核數相同
worker_connection
use epoll

實際的壓測指標也有不小的提升

核心引數優化

net.ipv4.tcp_max_tw_buckets 
net.ipv4.tcp_sack
net.ipv4.tcp_window_scaling
...

這裡的配置較多,有提升,幅度不大,聊勝於無。

經過上面的這些優化之後,較最初的測試指標提升到2.x倍。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
城裡的野山參

相關文章