Linux已成為事實上企業(yè)級服務(wù)器OS的首選,PostgreSQL在Linux上的”裝機量”不在少數(shù),在對數(shù)據(jù)庫的性能進行優(yōu)化和調(diào)整時,同時也必須考慮到Linux的優(yōu)化和調(diào)整.
本節(jié)簡單介紹了Linux性能監(jiān)控中的兩個容易混淆的概念:CPU使用率和平均負載.
日常使用中最為常見的性能監(jiān)控工是top,下面來看看top的輸出:
專注于為中小企業(yè)提供網(wǎng)站設(shè)計、成都做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)遼陽縣免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
top - 14:20:02 up 2:19, 3 users, load average: 0.00, 0.01, 0.07
Tasks: 126 total, 1 running, 125 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.7 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3873760 total, 288164 free, 87888 used, 3497708 buff/cache
KiB Swap: 1048572 total, 970292 free, 78280 used. 2952064 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 193748 3452 2240 S 0.7 0.1 0:05.85 systemd
917 dbus 20 0 32780 1028 704 S 0.7 0.0 0:00.30 dbus-daemon
17 root rt 0 0 0 0 S 0.3 0.0 0:09.25 migration/2
559 root 20 0 0 0 0 S 0.3 0.0 0:17.53 kworker/2:2
912 root 20 0 24204 1020 864 S 0.3 0.0 0:00.36 systemd-logind
915 root 20 0 216908 476 440 S 0.3 0.0 0:00.04 abrt-watch-log
....
輸出的第1行
top - 14:20:02 up 2:19, 3 users, load average: 0.00, 0.01, 0.07
其中l(wèi)oad average: 0.00, 0.01, 0.07是過去1分鐘/5分鐘/15分鐘的load average(平均負載).
這個平均負載是什么意思呢?按大神Brendan Gregg的說法,平均負載是指系統(tǒng)可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù),也就是平均活躍進程數(shù),它和CPU使用并沒有直接的關(guān)系.可運行狀態(tài)進程包括正在使用CPU或者正在等待CPU的進程,不可中斷狀態(tài)是指正處于內(nèi)核態(tài)不可中斷關(guān)鍵流程中的進程,比如硬件設(shè)備的I/O響應(yīng)等,通過top或ps命令看的D狀態(tài)進程就是這種狀態(tài).
輸出的第3行
%Cpu(s): 0.2 us, 0.7 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
這是CPU使用率,其中us為用戶態(tài)使用占比,sy是系統(tǒng)態(tài)占比,ni是使用nice加權(quán)進程分配的用戶態(tài)占比,id是空閑占比,wa是等待使用CPU占用,hi是硬中斷占比,si是軟中斷占比,st(steal)是虛擬機使用占比,這些項加起來應(yīng)為100%.
為了更好理解平均負載和CPU使用率,以高速公路收費站來打個比喻,假設(shè)某高速收費站有8個收費口.
1.如果沒有車通過,那么收費站的負載為0;
2.如果同時只有4輛車繳費通過,那么負載為4;
3.如果同時有8輛車,那么負載為8;
4.如果有8輛車在繳費,同時每個收費口又有1輛車在等待,那么負載為16,這時候其實收費站已過載;
5.如果有8輛車在繳費,同時每個收費口還有(n-1)*8(n>3)輛車在等待,那么負載將會是n*8,這時候收費站已嚴重過載,會出現(xiàn)嚴重擁堵;
這是平均負載,下面說說CPU使用率.
1.如果收費口和車主全部使用ETC繳費,那么使用率很高;
2.如果某些收費口使用人工收費,但支持微信或支付寶,車主只需要刷卡就走,準備繳費的時間不長,因此使用率也不低;
3.如果某些收費口使用人工收費,但只能現(xiàn)金收費,那掏錢/找錢這些無用功占比就較高,這樣使用率就變得較低.
通過這個比喻可以看出,平均負載和使用率并沒有必然的關(guān)系,負載高CPU使用率不一定高,CPU使用率高負載并不見得會高.
下面是使用benchmarksql對PG進行壓力下使用top的輸出:
top - 14:51:33 up 2:50, 3 users, load average: 22.34, 9.89, 3.81
Tasks: 153 total, 7 running, 146 sleeping, 0 stopped, 0 zombie
%Cpu(s): 7.9 us, 5.2 sy, 0.0 ni, 23.3 id, 47.6 wa, 0.0 hi, 16.0 si, 0.0 st
KiB Mem : 3873760 total, 139744 free, 418508 used, 3315508 buff/cache
KiB Swap: 1048572 total, 969552 free, 79020 used. 2620448 avail Mem
...
top - 14:49:49 up 2:49, 3 users, load average: 14.47, 4.19, 1.48
Tasks: 153 total, 2 running, 151 sleeping, 0 stopped, 0 zombie
%Cpu0 : 20.2 us, 23.0 sy, 0.0 ni, 28.7 id, 19.9 wa, 0.0 hi, 8.2 si, 0.0 st
%Cpu1 : 13.5 us, 29.2 sy, 0.0 ni, 19.6 id, 28.5 wa, 0.0 hi, 9.3 si, 0.0 st
%Cpu2 : 12.9 us, 19.3 sy, 0.0 ni, 16.4 id, 11.1 wa, 0.0 hi, 40.4 si, 0.0 st
%Cpu3 : 15.1 us, 25.8 sy, 0.0 ni, 19.7 id, 29.4 wa, 0.0 hi, 10.0 si, 0.0 st
KiB Mem : 3873760 total, 133432 free, 435336 used, 3304992 buff/cache
KiB Swap: 1048572 total, 970816 free, 77756 used. 2601620 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10337 benchma+ 20 0 4612656 222272 5376 S 42.7 5.7 0:40.99 java
10448 benchma+ 20 0 789004 52556 20408 S 14.0 1.4 0:00.93 postgres
10356 benchma+ 20 0 757376 179348 176640 D 9.7 4.6 0:04.15 postgres
10365 benchma+ 20 0 757384 194680 191904 D 9.3 5.0 0:05.12 postgres
10375 benchma+ 20 0 757452 183908 181172 D 9.3 4.7 0:04.51 postgres
10358 benchma+ 20 0 757340 190880 188144 D 8.7 4.9 0:04.90 postgres
10357 benchma+ 20 0 757448 169860 167092 D 8.3 4.4 0:04.14 postgres
10352 benchma+ 20 0 757388 185012 182236 S 8.0 4.8 0:04.63 postgres
10354 benchma+ 20 0 757376 177416 174676 D 7.7 4.6 0:04.23 postgres
10367 benchma+ 20 0 757356 178524 175796 D 7.3 4.6 0:04.25 postgres
...
可以看出近一分鐘的平均負載飆升到14.47,而CPU邏輯內(nèi)核個數(shù)不過4個,已超出系統(tǒng)負荷.
而CPU使用率中的us部分不過30%上下,大部分CPU在idle/wait上.
參考資料
Linux Load Averages: Solving the Mystery