php-fpm進程利用CPU不均問題的優化過程

爲了試驗一下atlas用php準備構造一些數據,發現100個表總是一個表一個表的插入數據,然後發現另一個有意思的問題,就是CPU使用情況不是均勻的,請教運維後發現是php-fpm的親和性問題。

讓在一臺四核服務器上採樣分析一下數據確認一下是否存在負載不均衡問題:

shell > mpstat -P ALL 1 10

如上命令的含義是每秒運行一次 mpstat,一共採樣 10 次,可以明顯看出 CPU0 的空閒 idle 明顯小於其它 CPUx,而且大部分都消耗在了用戶態 usr 上面。

再讓我們通過 pidstat 來確認一下是不是 PHP-FPM 導致的 CPU0 負載問題:

shell> pidstat | grep php-fpm | awk'{print $(NF-1)}' | sort | uniq -c

可見分配給 CPU0 的 PHP-FPM 進程比其他三個 CPUx 總和還要多。爲什麼大部分進程被分配給了 CPU0?我模模糊糊有一些印象是因爲操作系統偏愛使用 CPU0,但我暫時也沒找到理論上的根據,如果有人知道,麻煩告訴我。

問題總要解決,既然 PHP-FPM 沒有類似 Nginx 那樣 CPU 親緣性綁定的指令,那麼我們可以通過 taskset 手動綁定 PHP-FPM 進程到固定的 CPUx 來解決問題:

如上腳本運行後,讓我們再來看看各個 CPU 負載分配情況如何:

shell > mp  stat -P ALL1 10

終於平均了,不過需要提醒的是,一旦 PHP-FPM 處理的請求數超過 max_requests 的設置,那麼對應的進程將自動重啓,先前的 taskset 設置也將失效,所以爲了效果,我們可能需要把 taskset 腳本添加到 CRON 配置中去,例如每分鐘自動設置一遍

不過運維告訴我,請求上去後服務器每個CPU的負載分佈自動平衡了



作者:笨尛孩你誰啊
鏈接:https://www.jianshu.com/p/c78a6be69dff
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章