背景
一個專案,甲方要求 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 協議》,轉載必須註明作者和本文連結