記錄乙個多核CPU負載不均衡問題

2021-07-24 15:38:10 字數 1953 閱讀 3183

在一台多核cpu的web伺服器上,存在負載不均衡問題,其中,其中cpu0的負載明顯高於其他cpux,進一步調查表明php-fpm的嫌疑最大

讓我們在一台四核伺服器上取樣分析一下資料確認看看是否存在負載不均衡問題:

shell> mpstat -p all 1 10

cpu %usr %nice %sys %iowait %irq %soft ... %idle

all 17.57 0.03 1.78 0.00 0.35 0.23 ... 80.04

0 43.17 0.00 4.12 0.00 1.41 1.00 ... 50.30

1 9.80 0.00 0.81 0.00 0.00 0.00 ... 89.39

2 9.31 0.00 1.20 0.00 0.00 0.00 ... 89.49

3 7.94 0.10 0.80 0.00 0.00 0.00 ... 91.16

如上命令的含義就是每秒一次mpstat,一共取樣10次取平均值,可以明顯看出cpu0的空閒idel明顯小於其他cpux,而且大部分消耗在user上面

再讓我們通過pidstat來確認一下是不是php-frm導致的cpu0負載問題:

shell> pidstat | grep php-fpm | awk '' | sort | uniq -c

157 0

34 1

34 2

32 3

可見分配給cpu0的php-fpm程序比其他三個cpux總和還要多,為什麼大部分程序被分配給cpu0?可能是作業系統偏愛使用cpu0的原因,但是問題總要解決,既然php-fpm沒有類似nginx那麼cpu親緣性繫結的指令,那麼我們可以使用taskset繫結php-fpm程序到固定的cpux來解決問題:

#!/bin/bash

cpus=$(grep -c "processor" /proc/cpuinfo)

pids=$(ps -aux|grep "php-fpm[:] pool"|awk 'print $2}')

let i=0

for pid in $pids;do

cpu=$(echo "$i%$cpus"|bc)

let i++

taskset -pc $cpu $pid

done

如上指令碼執行後,我們再來看各個cpu負載分配情況:

shell> mpstat -p all 1 10

cpu %usr %nice %sys %iowait %irq %soft ... %idle

all 15.73 0.03 1.61 0.00 0.20 0.23 ... 82.20

0 16.28 0.10 1.62 0.10 0.81 0.91 ... 80.18

1 16.16 0.10 1.51 0.00 0.00 0.10 ... 82.13

2 14.46 0.10 1.71 0.00 0.00 0.00 ... 83.73

3 15.95 0.00 1.71 0.00 0.00 0.00 ... 82.35

終於平均了,不過需要提醒的是,一旦php-fpm處理請求數超過了max-requests的設定,那麼對應的程序將自動重啟,先前的taskset設定也將失效,所以為了一直有效,我們需要把taskset指令碼新增到cron配置中去,例如每分鐘自動設定一遍

多核CPU上python多執行緒並行的乙個假象

多核cpu上python多執行緒並行的乙個假象 python cn 華蟒使用者組,cpyug 郵件列表 上 關於 python 多執行緒是否能用到多核的問題 相關討論 本機環境 2核cpu,linux 2.6,python 2.6.2 在python上開啟多個執行緒,由於gil的存在,每個單獨執行緒...

乙個快速檢測系統CPU負載的小程式

在對伺服器進行維護時,有時也遇到由於系統 cpu 利用率 負載過高導致業務中斷的情況。伺服器上可能執行多個程序,檢視單個程序的 cpu 都是正常的,但是整個系統的 cpu 負載可能是異常的。通過指令碼對系統 cpu 負載進行時時監控,可以在異常時及時傳送告警,便於維護人員及時處理,預防事故發生。下面...

負載均衡實現,乙個網域名稱對應多個IP位址

負載均衡實現,乙個網域名稱對應多個ip位址 使用負載均衡實現,傳統和常規做法,其他方式需要特殊處理。dns輪詢,或者自己做解析 1 乙個網域名稱設定多個dns服務或者伺服器進行解析,同乙個網域名稱的每個解析都指向不同的ip位址,這樣應答快的dns優先進行解析,這樣就能保證最快定向到指定的 空間去。如...