昨晚和一位讀者伴侶一起接頭了一個(gè)問(wèn)題:在一臺(tái)多核 CPU 的 Web
處事器上,存在負(fù)載不平衡問(wèn)題,個(gè)中 CPU0 的負(fù)載明明高于其它 CPUx,進(jìn)一法式查表白 PHP-FPM 的嫌疑很大。話(huà)說(shuō)以前我曾經(jīng)記錄過(guò)軟間斷導(dǎo)致過(guò)雷同的問(wèn)題,可是本例中可以解除嫌疑。
讓我們?cè)谝慌_(tái)四查
處事器上采樣闡明一下數(shù)據(jù)確認(rèn)一下是否存在負(fù)載不平衡問(wèn)題:
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
如上呼吁的寄義是每秒運(yùn)行一次 mpstat,一共采樣 10 次,可以明明看出 CPU0 的空閑 idle 明明小于其它 CPUx,并且大部門(mén)都耗損在了用戶(hù)態(tài) usr 上面。
再讓我們通過(guò) pidstat 來(lái)確認(rèn)一下是不是 PHP-FPM 導(dǎo)致的 CPU0 負(fù)載問(wèn)題:
shell> pidstat | grep
php-fpm | awk '{print $(NF-1)}' | sort | uniq -c
157 0
34 1
34 2
32 3
可見(jiàn)分派給 CPU0 的 PHP-FPM 歷程比其他三個(gè) CPUx 總和還要多。為什么大部門(mén)歷程被分派給了 CPU0?我?;秀焙幸恍┯∠笫且?yàn)椴倏v系統(tǒng)偏幸利用 CPU0,但我臨時(shí)也沒(méi)找到理論上的按照,假如有人知道,貧苦匯報(bào)我。
問(wèn)題總要辦理,既然 PHP-FPM 沒(méi)有雷同 Nginx 那樣 CPU 親緣性綁定的指令,那么我們可以通過(guò) taskset 手動(dòng)綁定 PHP-FPM 歷程到牢靠的 CPUx 來(lái)辦理問(wèn)題:
#!/bin/bash
CPUS=$(grep -c CPU /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)
taskset -pc $CPU $PID
let i++
done
如上劇本運(yùn)行后,讓我們?cè)賮?lái)看看各個(gè) CPU 負(fù)載分派環(huán)境如何:
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 處理懲罰的請(qǐng)求數(shù)高出 max_requests 的配置,那么對(duì)應(yīng)的歷程將自動(dòng)重啟,先前的 taskset 配置也將失效,所覺(jué)得告終果,我們大概需要把 taskset 劇本添加到 CRON 設(shè)置中去,譬喻每分鐘自動(dòng)配置一遍!
本文把 PHP-FPM 歷程平均分派給了 0,
國(guó)外域名
免費(fèi)域名,1,2,3 四個(gè) CPU,實(shí)際操縱的時(shí)候可以更機(jī)動(dòng)一些,好比前文我們提過(guò),系統(tǒng)老是偏幸利用 CPU0,假如 CPU0 的負(fù)載已經(jīng)很高了的話(huà),那么我們不妨把 PHP-FPM 歷程平均分派給 1,2,3 三個(gè) CPU。