本隨筆介紹CPU負載的排查手段。
查看系統負載的工具:uptime,w,都能查看系統負載,系統平均負載是處於運行或不可打擾狀態的進程的平均數,
- 可運行:運行態,占用CPU,或就緒態,等待CPU調度。
- 不可打擾:阻塞,正在等待I/O
例1. 使用uptime查看系統負載.
# uptime 19:26:17 up 49 days, 7:34, 1 user, load average: 0.67, 0.51, 0.41
這里我們關注的是最后三列,即系統1分鍾、5分鍾、15分鍾內的平均負載,判斷一個系統負載是否偏高需要計算單核CPU的平均負載,等於這里uptime命令顯示的系統平均負載 / CPU核數,一般以0.7為比較合適的值。偏高說明有比較多的進程在等待使用CPU資源。
使用 w 命令也可以查看類似的信息,w 命令還提供了當前登錄用戶,以及正在執行的操作等信息。
系統負載可以是CPU密集型的,也可以是RAM密集型和I/O密集型的,CPU密集型的系統比I/O密集型的系統響應度更好,因為I/O密集型的系統的磁盤I/O可能完全飽和,導致登錄就很費事。
2. top命令
top命令不僅可以查看當前系統的平均負載,還可以查看不同進程對於CPU、內存等資源的使用情況,在內存排障部分我們也將介紹top命令。
例3. 使用top命令查看CPU使用率
top - 19:36:00 up 49 days, 7:44, 1 user, load average: 0.34, 0.38, 0.40 Tasks: 216 total, 3 running, 213 sleeping, 0 stopped, 0 zombie %Cpu(s): 4.0 us, 6.1 sy, 0.0 ni, 88.0 id, 1.5 wa, 0.0 hi, 0.4 si, 0.0 st KiB Mem: 12260128 total, 6160704 used, 6099424 free, 331448 buffers KiB Swap: 0 total, 0 used, 0 free. 1393220 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3460 ntp 20 0 33508 2180 1536 S 47.2 0.0 5765:44 ntpd 12781 ceilome+ 20 0 137464 60096 4740 S 5.0 0.5 833:30.17 ceilometer-agen 2816 rabbitmq 20 0 2482652 274620 2612 S 1.7 2.2 1222:49 beam.smp 1501 mysql 20 0 655848 310788 9928 S 1.0 2.5 368:28.78 mysqld 2781 nova 20 0 355508 104096 3944 S 1.0 0.8 284:42.22 nova-conductor 410 root 39 19 0 0 0 S 0.7 0.0 409:22.74 kipmi0 2782 nova 20 0 356304 105000 3936 S 0.7 0.9 249:34.72 nova-conductor 19305 glance 20 0 182964 88608 4800 S 0.7 0.7 461:00.03 glance-api
用top或者ps命令會輸出PRI/PR、NI、%ni/%nice這三種指標值,這些到底是什么東西?先給出大概的解釋如下:
PRI :進程優先權,代表這個進程可被執行的優先級,其值越小,優先級就越高,越早被執行
NI :進程Nice值,代表這個進程的優先值
%nice :改變過優先級的進程的占用CPU的百分比 (呵呵,這句好難理解是吧,不急慢慢來^_^)
RI是比較好理解的,即進程的優先級,或者通俗點說就是程序被CPU執行的先后順序,此值越小進程的優先級別越高。那NI呢?就是我們所要說的nice值了,其表示進程可被執行的優先級的修正數值。如前面所說,PRI值越小越快被執行,那么加入nice值后,將會使得PRI變為:PRI(new)=PRI(old)+nice。由此看出,PR是根據NICE排序的,規則是NICE越小PR越前(小,優先權更大),即其優先級會變高,則其越快被執行。如果NICE相同則進程uid是root的優先權更大。
在LINUX系統中,Nice值的范圍從-20到+19(不同系統的值范圍是不一樣的),正值表示低優先級,負值表示高優先級,值為零則表示不會調整該進程的優先級。具有最高優先級的程序,其nice值最低,所以在LINUX系統中,值-20使得一項任務變得非常重要;與之相反,如果任務的nice為+19,則表示它是一個高尚的、無私的任務,允許所有其他任務比自己享有寶貴的CPU時間的更大使用份額,這也就是nice的名稱的來意。
進程在創建時被賦予不同的優先級值,而如前面所說,nice的值是表示進程優先級值可被修正數據值,因此,每個進程都在其計划執行時被賦予一個nice值,這樣系統就可以根據系統的資源以及具體進程的各類資源消耗情況,主動干預進程的優先級值。在通常情況下,子進程會繼承父進程的nice值,比如在系統啟動的過程中,init進程會被賦予0,其他所有進程繼承了這個nice值(因為其他進程都是init的子進程)。
對nice值一個形象比喻,假設在一個CPU輪轉中,有2個runnable的進程A和B,如果他們的nice值都為0,假設內核會給他們每人分配1k個cpu時間片。但是假設進程A的為0,但是B的值為-10,那么此時CPU可能分別給A和B分配1k和1.5k的時間片。故可以形象的理解為,nice的值影響了內核分配給進程的cpu時間片的多少,時間片越多的進程,其優先級越高,其優先級值(PRI)越低。%nice,就是改變過優先級的進程的占用CPU的百分比,如上例中就是0.5k/2.5k=1/5=20%。
由此可見,進程nice值和進程優先級不是一個概念,但是進程nice值會影響到進程的優先級變化。
進程的nice值是可以被修改的,修改命令分別是nice和renice。
1、nice命令就是設置一個要執行command進程的nice值,其命令格式是 nice –n adjustment command command_option,如果這里不指定adjustment,則默認為10。
2、renice命令就是設置一個已經在運行的進程的nice值,假設一運行進程本來nice值為0,renice為3后,則這個運行進程的nice值就為3了。
說明:如果用戶設置的nice值超過了nice的邊界值(LINUX為-20到+19),系統就取nice的邊界值作為進程的nice值。
舉例如下:
對非root用戶,只能將其底下的進程的nice值變大而不能變小。若想變小,得要有相應的權限。
[oracle@perf_dbc ~]$ nice
0
[oracle@perf_dbc ~]$ nice -n 3 ls
agent bin important_bak logs statistics_import.log TMP_FORUM_STATS.dmp TMP_TAOBAO_STATS.dmp TMP_TBCAT_STATS.dmp top.dmp worksh
[oracle@perf_dbc ~]$ nice -n -3 ls
nice: cannot set priority: Permission denied
對root用戶,可以給其子進程賦予更小的nice值。
[root@dbbak root]# nice
0
[root@dbbak root]# nice -n -3 ls
192.168.205.191.txt anaconda-ks.cfg clariion.log Desktop disk1 emc.sh File_sort install.log install.log.syslog log OPS rhel_os_soft root_link_name
同樣,renice的執行也必須要有相應的權限方可執行。
例3給出了一個top命令的截圖示意,默認情況下,top命令是以CPU使用率由高到低排序顯示進程信息的,在 top 信息界面按 K 鍵,並輸入想要終止的PID,就可以直接殺死指定進程。
top的 -b 選項開啟批處理模式,將每次刷新全部打印到stdout
top的 -n 選項指定退出top命令前刷新多少次信息。
top命令的輸出:
第1行:與uptime相同;
第3行:當前的CPU運行情況:
us:非nice用戶進程占用CPU的比率
sy:內核、內核進程占用CPU的比率;
ni:如果一些用戶進程修改過優先級,這里顯示這些進程占用CPU時間的比率;
id:CPU空閑比率,如果系統緩慢而這個值很高,說明系統慢的原因不是CPU負載高;
wa:CPU等待執行I/O操作的時間比率,該指標可以用來排查磁盤I/O的問題,通常結合wa和id判斷
hi:CPU處理硬件終端所占時間的比率;
si:CPU處理軟件終端所占時間的比率;
st:流逝的時間,虛擬機中的其他任務所占CPU時間的比率;
用戶進程占比高,wa低,說明系統緩慢的原因在於進程占用大量CPU,通常還會伴有較低的id,說明CPU空轉時間很少;
wa低,id高,可以排除CPU資源瓶頸的可能。
wa高,說明I/O占用了大量的CPU時間,需要檢查交換空間的使用,交換空間位於磁盤上,性能遠低於內存,當內存耗盡開始使用交換空間時,將會給性能帶來嚴重影響,所以對於性能要求較高的服務器,一般建議關閉交換空間。另一方面,如果內存充足,但wa很高,說明需要檢查哪個進程占用了大量的I/O資源。
