swoole http server 效能優化

2021-08-25 08:38:38 字數 2160 閱讀 9094

上線了乙個基於 swoole http server 的服務以後,發現這個服務的請求耗時監控毛刺十分嚴重,介面耗時波動比較大,經過一段時間的分析,發現這個服務 response 包十分大,有些 response 包高達1 ~ 2m,甚至更大,這樣就很清楚了,因為包太多,導致服務相應波動比較大。

這裡稍微解釋下,為什麼 response 包會導致相應時間波動,這裡主要有兩個方面的影響,第一是包大會導致 swoole 之間程序通訊更加耗時,並占用更多資源,第二是包大會導致 swoole 的 reactor 執行緒發包更加耗時,關於 reactor 的解釋,摘自

swoole的主程序是乙個多執行緒的程式。其中有一組很重要的執行緒,稱之為reactor執行緒。它就是真正處理tcp連線,收發資料的執行緒。 swoole的主線程在accept新的連線後,會將這個連線分配給乙個固定的reactor執行緒,並由這個執行緒負責監聽此socket。在socket可讀時讀取資料,並進行協議解析,將請求投遞到worker程序。在socket可寫時將資料傳送給tcp客戶端。

那麼怎麼優化呢?

其實很簡單,那就是直接在 swoole 裡開啟 gzip,這裡摘自 swoole 文件

啟用http gzip壓縮。壓縮可以減小html內容的尺寸,有效節省網路頻寬,提高響應時間。必須在write/end傳送內容之前執行gzip,否則會丟擲錯誤。swoole_http_response->gzip(int le

vel=

1); lev

el=1

);level 壓縮等級,範圍是1-9,等級越高壓縮後的尺寸越小,但cpu消耗更多。預設為1,呼叫gzip方法後,底層會自動新增http編碼頭,php**中不應當再行設定相關http頭

剛開始我是採用這個方式,確實有些效果,但是效果還不是很明顯,然後我想到了乙個新的方案,就是 http chunk + gzip,這個 swoole 本身是僅提供了chunk的支援,chunk+gzip需要自己實現,實現也很簡單

使用php壓縮相應內容,然後使用 swoole_http_response->write 分段傳送,上線之後效果很明顯,耗時監控毛刺少了很多。

有些機智的同學或許會有這個疑問,swoole http server 一般情況下,會被 nginx 反向**,nginx 普遍會開啟 gzip,那麼問題來了,swoole 把資料 gzip 了,nginx 會不會把資料二次壓縮。

當然不會了,這可是nginx,來,雖然nginx的文件裡並沒有說明gzip不會被二次壓縮,但是我在原始碼裡找到了相關邏輯

src/http/modules/ngx_http_gzip_filter_module.c,略去無關**,下面函式呼叫ngx_http_gzip_ok檢測是否是gzip

src/http/ngx_http_core_module.c,略去無關**,ngx_http_gzip_ok根據http header檢測是否是gzip

從上述兩塊**可以看出,nginx 並不會對 gzip 的包二次壓縮。

所以,放心大膽的使用吧。

最後,雖然這篇文章,講的是針對swoole http server 做的乙個優化,但是這個思路,對於其他http server 也同樣適用。

FLASH ActionScript 效能優化

一.圖形方面的優化 1.減少同時在螢幕上物體的個數 2.儘量減少螢幕需要重畫的範圍。3.盡量避免全屏滾動 4.保持幀數在16 20,每一幀都連續,比將幀數設定的很高,但是每一幀的計算超過幀時間,讓人感覺更舒服。5.如果乙個物體不需要顯示,盡量將他從螢幕上刪除,而不是將他設定成不可見。因為即使不可見的...

Flink State Rescale效能優化

2017年社群有一篇部落格就比較深入的介紹了operator 和 keyed state的rescale的實現,感興趣的話可以去了解下。這兩張圖對比了是否基於keygroup來划區的乙個差別,社群中的版本使用的是基於keygroup的版本實現的,可以看到可以減少對於資料的random的訪問。但是從b...

調優 Nginx效能調優

一.nginx優化配置 1.主配置檔案優化 注 部分配置詳解 worker processes 8 nginx程序數,建議按照cpu數目來指定,一般為它的倍數。worker cpu affinity 00000001 00000010 00000100 00001000 00010000 00100...