Swoole 4.0:一次 qps 提升之旅(一)
源起
最近基於swoole的一個mvc開發框架做了一個專案,完成之後對其中一個介面例行做了一次壓測,本機上得到qps是3600,由於介面功能比較簡單,所以又花了點時間用beego和spring boot實現了相同的功能,也壓測了一下,最終對比如下:
swoole: 3600qps
beego: 2200 qps
spring: 600qps
(ps: 無意比較優劣,應該是用beego和spring boot的姿勢不對)
swoole的結果符合預期,後來經過一翻折騰(加了一些邏輯,完善了一些底層框架程式碼),再一壓這個介面,qps下降到了2300
真是一頓操作猛如虎,效能下降35%啊
優化
做為一個有追求的phper,這是不能忍的,必需找到原因並解決之,但光喊口號是不行的,必需有方法, 一般我們會通過幾種方式分析:
-
日誌法:通過各種日誌,檢視耗時,找出相應的問題,但這種方法有幾個缺點:
-
粒度太粗,不好控制
-
侵入性太強,需要人工打點
-
效能指標不夠,只能分析出大致的耗時,但不能分割槽i/o, cpu時間乖
-
xdebug:是我認為目前最牛逼的效能分析工具,可以無侵入式的詳細的記錄完整的呼叫鏈,唯一的遺憾是與swoole不相容
-
xhprof: facebook出口的一款效能分析工具,簡單易用,問題是:後期不維護了,對現在的php版本以及swoole支援度都不好
-
第三方的apm工具: 不可控,也不如前面2位,對swoole支援也不好
除了打日誌,好像在swoole下陷入的僵局了,一翻尋覓,發現了一個網站:https://tideways.com/,維護並持續更新xhprof,使之能支援php7,又一翻折騰,發現也支援在swoole下跑
安裝 tideways_xhprof
github: https://github.com/shenzhe/php-xhprof-extension
clone程式碼到本地
執行:
phpize ./configure make make install
標準的安裝過程,產生tideways_xhprof.so,加入到php.ini中
判斷有沒有安裝成功:
php -m |grep xhprof
輸出
tideways_xhprof, 表示安裝成功
使用 tideways_xhprof
也比較簡單
在onRequest回撥最開始一行輸入:
tideways_xhprof_enable( TIDEWAYS_XHPROF_FLAGS_MEMORY
| TIDEWAYS_XHPROF_FLAGS_CPU );
表示開啟分析,
中間執行你的業務邏輯
在最後一行輸入
file_put_contents( '/tmp/xhprof/' . uniqid() . '.msg-api.xhprof', serialize(tideways_xhprof_disable()) );
把分析的結果存入到檔案中,以待分析
其中:
'/tmp/xhprof/' . uniqid() . '.msg-api.xhprof'
是最終分析檔案的地址,可自行修改
然後執行你的介面,最後會在 /tmp/xhprof 資料夾下看到如下的檔案:
這些檔案記錄的就是這個介面整體的分析資料
找出最新的檔案,用vim開啟一看:
肉眼肯定是沒法看,這就需要藉助視覺化的工具了:
視覺化 tideways_xhprof
由於輸出的檔案格式和之前的xhprof完全一樣,所以我這邊直接藉助了原本xhprof提供的工具
github: https://github.com/phacility/xhprof
最終上面的分析檔案視覺化後如下:
下一篇,將詳細介紹如何安裝xhprof視覺化工具,以及我們要看什麼指標,怎麼通過這些指標來指導來做優化,並最終提升的程式的效能
檢視原文,可獲取我修改版的tideways_xhprof,增加了兩個方法,以支援RINIT和RSHUTDOWN中做的一些事情:
tideways_xhprof_swoole_init();
tideways_xhprof_swoole_end();
這樣可以更好的支援swoole, readme裡有介紹使用方法
----------偉大的分割線-----------
PHP飯米粒(phpfamily) 由一群靠譜的人建立,願為PHPer帶來一些值得細細品味的精神食糧!
飯米粒只發原創或授權發表的文章,不轉載網上的文章
所發的文章,均可找到原作者進行溝通。
也希望各位多多打賞(算作稿費給文章作者),更希望大家多多投搞。
投稿請聯絡:
本文由 桶哥 授權 飯米粒 釋出,轉載請註明本來源資訊和以下的二維碼(長按可識別二維碼關注)