概要:負(fù)載診斷流程
- 觀察load average (平均負(fù)載)
- 觀察CPU、I/O是否存在瓶頸
從load avgerage等總括性的數(shù)據(jù)著手叁巨,參考CPU使用率和I/O等待時(shí)間等具體的數(shù)字蜂林,從而自頂向下快速排查各進(jìn)程狀態(tài)送粱。
概念:什么是負(fù)載?
負(fù)載可以分為兩大部分:CPU負(fù)載似谁、I/O 負(fù)載 哼蛆。
load average
uptime
top
cat /proc/loadavg
load average:0.65, 1.49, 1.76 (負(fù)載很低)
load average:3.49, 3.67, 3.75 (負(fù)載一般)
load average:33.20, 18.39, 15.21 (負(fù)載高)
load average:70.25, 80.50, 95.38 (負(fù)載非常高构拳,需要干預(yù))
load average:7.89, 11.42, 13.42 (當(dāng)前負(fù)載趨于下降)
load average:17.89, 13.28, 4.45 (當(dāng)前負(fù)載趨于上升)
依次時(shí)過去1分鐘咆爽,5分鐘,15分鐘內(nèi)置森,單位時(shí)間的等待任務(wù)數(shù)斗埂,也就是表示平均有多少任務(wù)正處于等待狀態(tài)。在load average較高的情況下凫海,就說明等待運(yùn)行的任務(wù)較多呛凶,因此輪到該任務(wù)運(yùn)行的等待時(shí)間就會(huì)出現(xiàn)較大延遲,即反映了此時(shí)負(fù)載較高行贪。
linux內(nèi)核的進(jìn)程調(diào)度器(Process Scheduler)
負(fù)責(zé)決定任務(wù)運(yùn)行的優(yōu)先級(jí)漾稀,以及讓任務(wù)等待或使之重新開始等核心工作。調(diào)度器劃分并管理進(jìn)程(Process)的狀態(tài)建瘫。例如:
等待分配CPU資源的狀態(tài)
等待磁盤輸入輸出完畢的狀態(tài)
進(jìn)程描述符的狀態(tài)
|進(jìn)程狀態(tài)|PS Stat|說明|
|------|-----------------|
|TASK_RUNNING|R(Run)|運(yùn)行狀態(tài)崭捍。只要CPU空閑,隨時(shí)都可以開始啰脚。|
|TASK_INTERRUPTIBLE|S(Sleep)|可中斷的等待狀態(tài)殷蛇。例如系統(tǒng)睡眠或來自于用戶輸入的等待等。|
|TASK_UNINTERRUPTIBLE|D(Disk Sleep)|不可中斷的等待狀態(tài)。主要為短時(shí)間恢復(fù)時(shí)的等待狀態(tài)粒梦。例如磁盤輸入輸出的等待|
|TASK_STOPPED||響應(yīng)暫停信號(hào)而運(yùn)行中斷的狀態(tài)亮航。直到恢復(fù)(Resume)前都不會(huì)被調(diào)度|
|TASK_ZOMBIE|Z(Zombie)|僵死狀態(tài)。雖然子進(jìn)程已經(jīng)終止(exit),但父進(jìn)程尚未執(zhí)行wait(),因此該進(jìn)程的資源沒有被系統(tǒng)釋放|
- TASK_RUNNING正在運(yùn)行
- TASK_RUNNING (等待狀態(tài)匀们,加權(quán)換算)
- TASK_INTERRUPTIBLE(等待狀態(tài)缴淋,加權(quán)換算)
- TASK_UNINTERRUPTIBLE(等待狀態(tài),不加權(quán)換算)
load average 表示“等待進(jìn)程的平均數(shù)”泄朴,除了“TASK_RUNNING正在運(yùn)行”宴猾,其它三個(gè)都是等待狀態(tài)。TASK_INTERRUPTIBLE不被換算叼旋。即只換算“雖然需要即刻運(yùn)行處理仇哆,但是無論如何都必須等待”。
load average所描述的負(fù)載就是:需要運(yùn)行處理夫植,但又必需等待隊(duì)列前的進(jìn)程處理完成的進(jìn)程個(gè)數(shù)讹剔。具體來說:要么等待授予CPU運(yùn)行權(quán)限,要么等待磁盤I/O完成详民。
- 內(nèi)核函數(shù):kernei/timer.c的calc-load();
- 調(diào)用周期:每次計(jì)時(shí)器中斷(centos為4ms)
CPU 還是 I/O ?
load average的數(shù)字只是表示等待的任務(wù)數(shù)延欠,僅根據(jù)load average并不能判斷具體是CPU負(fù)載高還是I/O負(fù)載高。
CPU密集型程序
I/O密集型程序
Sar (System Activity Reporter)
CPU使用率和I/O等待時(shí)間都是在不斷變化的沈跨,可以通過sar 命令來確認(rèn)這些指標(biāo)由捎。該工具包含在sysstat軟件包內(nèi)。
$ sar
Linux 04/17/16 _x86\_64_ (24 CPU)
00:00:01 CPU %user %nice %system %iowait %steal %idle
00:10:02 all 1.26 0.00 0.55 0.00 0.00 98.19
00:20:01 all 1.58 0.00 1.04 0.00 0.00 97.38
00:30:01 all 1.23 0.00 0.56 0.00 0.00 98.21
00:40:01 all 1.59 0.00 1.01 0.00 0.00 97.40
00:50:01 all 1.35 0.00 0.59 0.00 0.00 98.06
01:00:01 all 1.63 0.00 1.10 0.00 0.00 97.27
01:10:01 all 1.22 0.00 0.54 0.00 0.00 98.24
01:20:01 all 1.68 0.00 1.06 0.00 0.00 97.25
01:30:01 all 1.23 0.00 0.54 0.00 0.00 98.23
$ sar 1 10
18:54:58 %usr %sys %wio %idle
18:54:59 18 3 0 79
18:55:00 46 14 0 40
18:55:01 38 13 0 49
18:55:02 17 4 0 79
18:55:03 11 4 0 85
18:55:04 12 5 0 83
18:55:05 20 4 0 76
18:55:06 22 3 0 75
18:55:07 21 4 0 75
18:55:08 17 4 0 79
輸出參數(shù):
- %user:用戶(一般的應(yīng)用軟件運(yùn)作模式)CPU資源
- %system:系統(tǒng)(內(nèi)核運(yùn)作)占用CPU資源
- %iowait:I/O等待率饿凛。
進(jìn)程詳細(xì)
$ ps auxw
test 1551 0.2 0.1 6452 4776 ? S 19:25 0:00 Test.pl CTP00004.PRS00034 1 300
test 1553 2.6 0.4 18196 16424 ? S 19:25 0:00 /Test.pl 00001.PRS00034
test 1555 2.6 0.4 18168 16396 ? S 19:25 0:00 /Test.pl 00002.PRS00034
test 1557 2.8 0.4 18132 16432 ? S 19:25 0:00 /Test.pl 00004.PRS00034
test 1606 0.0 0.0 50060 916 ? Sl 19:25 0:00 /bin/PingTest -f CTP00004
test 1612 2.5 0.4 18156 16452 ? S 19:25 0:00 /Test.pl 00014.PRS00034
test 1629 2.1 0.4 18416 16696 ? S 19:25 0:00 /Test.pl 00015.PRS00034
test 2253 2.7 0.3 12868 11160 ? R 19:25 0:00 -w mrtg MRTG\_00027.cfg log
test 2254 3.6 0.3 12864 11184 ? S 19:25 0:00 -w mrtg MRTG\_00028.cfg log
test 2261 2.4 0.2 12640 11004 ? S 19:25 0:00 -w mrtg MRTG\_00030.cfg log
輸出參數(shù):
- %CPU:該進(jìn)程的CPU使用率
- %memb:物理內(nèi)存百分比
- VSZ狞玛、RSS:虛擬/物理內(nèi)存
- STAT:進(jìn)程狀態(tài)(非常重要)
- TIME:CPU占用時(shí)間
SWAP吞吐
$sar -W
17:20:01 pswpin/s pswpout/s
17:30:01 0.00 0.00
17:40:01 0.00 0.00
17:50:01 0.00 0.00
18:00:01 0.00 0.00
18:10:01 0.00 0.00
18:20:01 0.00 0.00
18:30:01 0.00 0.00
18:40:01 0.00 0.00
18:50:02 0.00 0.00
19:00:01 0.00 0.00
19:10:02 0.00 0.00
Average: 0.00 0.00
輸出參數(shù):
- pswpin/s:每秒系統(tǒng)換入的頁面數(shù)
- pswpout/s:每秒系統(tǒng)換出的頁面數(shù)
發(fā)生頻繁的交換時(shí),服務(wù)器的吞吐量性能會(huì)大幅下降涧窒。
vmstat(Report Virtual Memory Statistics)
實(shí)時(shí)確認(rèn)CPU使用率及實(shí)際的I/O等待時(shí)間
$ vmstat
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s2 s2 s2 s2 in sy cs us sy id
0 0 0 45411448 17973032 140 1470 13 41 33 0 0 -0 -0 -0 -0 2753 313459 4984 16 3 81
解決方案
優(yōu)化的真正工作是“找出系統(tǒng)瓶頸并加以解決”心肪,我們所能做的就是“充分發(fā)揮硬/軟件本來的性能,解決可能存在的問題”纠吴。例如硬鞍,同樣是I/O問題,我們可以通過增加內(nèi)存來緩解戴已,也可以調(diào)整調(diào)度方案來優(yōu)化(時(shí)間換空間)固该,但是更多的情況是,優(yōu)化應(yīng)用程序的I/O算法效果更佳糖儡。
最后伐坏,重溫一句經(jīng)典格言
別臆斷,請(qǐng)監(jiān)控
擴(kuò)展閱讀:Linux 操作系統(tǒng)
- 《Linus Torvalds:Just for Fun》
- Linux 常用命令一百條
- Linux 性能診斷:負(fù)載評(píng)估
- Linux 性能診斷:快速檢查單(Netflix版)
- Linux 性能診斷:薦書|《圖解性能優(yōu)化》
- Linux 性能診斷:Web應(yīng)用性能優(yōu)化
- 操作系統(tǒng)原理 | How Linux Works(一):How the Linux Kernel Boots
- 操作系統(tǒng)原理 | How Linux Works(二):User Space & RAM
- 操作系統(tǒng)原理 | How Linux Works(三):Memory
推薦:電子書《Linux Perf Master》
發(fā)表在GitBook平臺(tái)休玩,歡迎訂閱著淆、下載、批評(píng)指正:
https://www.gitbook.com/book/riboseyim/linux-perf-master/details