站長資訊網
最全最豐富的資訊網站

Linux命令拾遺之理解系統負載(整理分享)

本篇文章給大家帶來了Linux中負載的概念與問題診斷方法相關知識,其中包括了負載是什么以及線程狀態等,希望對大家有幫助。

Linux命令拾遺之理解系統負載(整理分享)

一般在類unix系統上,都會有系統負載(load average)這個指標,用來形容系統的繁忙程度,值越大則代表系統越繁忙。

查看負載

$ uptime 19:59:57 up 29 days,  7:08,  1 user,  load average: 0.57, 0.26, 0.18

我們關注load average后的3個值,分別代表1分鐘、5分鐘、15分鐘的系統平均負載,如果1分鐘值>5分鐘值>15分鐘值,則代表近15分鐘內系統壓力越來越大,反之亦然。

同樣,在top命令的第一行,也能看到系統負載,它的含義和uptime是一樣的。

負載是什么

一般來說,系統線程基本都在這3個狀態上:運行中,可運行,阻塞等待,其中,運行中的線程正在CPU上跑,可運行的線程等待CPU調度,而阻塞的線程等待鎖釋放或io完成。

在傳統unix系統上(如BSD),系統負載由正在運行的線程以及可運行的線程這2個部分組成。

它能很好的說明CPU的飽和情況,比如4核的CPU,如果負載一直高于4,那說明CPU資源飽和了。

而Linux擴大了負載的定義,如下:

Linux負載由正在運行的線程和可運行的線程,以及D狀態的線程(一般是等待io完成)這3個部分組成。

因為Linux認為,雖然D狀態的線程并不消耗CPU資源,但是它會消耗磁盤、網卡等硬件資源以及鎖這樣的軟件資源,因此它也應該被用來計算系統負載,想來也合理,畢竟系統負載是用來描述整個系統的繁忙程度的,而不僅僅是CPU的。

線程狀態D

在Linux里面,線程有如下常見狀態:

  • R: 正在運行或可運行狀態

  • S: 睡眠狀態,被阻塞等待喚醒

  • D: 不可中斷睡眠狀態,一般是等待io完成

這里面的R與D狀態的線程會影響系統負載,因此,當系統負載較高時,可以通過如下命令了解是哪些線程導致的:

ps -eLo pid,tid,stat,comm | grep -E " R|D"

小實驗:將系統負載升到100

# 使用vfork函數創建一個子進程,子進程如果不調用exec系統調用,它的狀態會一直是D。

$ cat uninterruptible.c  int main() {     vfork();     sleep(600);     return 0; } # 編譯成可執行程序 $ gcc -o uninterruptible uninterruptible.c # 運行100個程序 $ for i in {1..100}; do ./uninterruptible &; done

等待1分鐘,就會發現系統負載升到了快100,如下:

$ uptime 20:24:42 up 29 days,  7:32,  1 user,  load average: 99.94, 74.82, 35.87 # 可以看到很多D狀態的進程 $ ps -eLo pid,tid,stat,pcpu,wchan:32,comm | grep " D" 3774195 3774195 D     0.0 do_fork                          uninterruptible 3774196 3774196 D     0.0 do_fork                          uninterruptible 3774197 3774197 D     0.0 do_fork                          uninterruptible 3774198 3774198 D     0.0 do_fork                          uninterruptible

如上,通過ps命令可以看到線程狀態,還有一個wchan字段,它顯示的是線程當前被阻塞在什么內核函數上,這能看出一些蛛絲馬跡。

另外,通過/proc/sysrq-trigger可以看到D線程阻塞時的代碼路徑,如下:

# 寫入一個w即可,需要root權限執行 $ echo w > /proc/sysrq-trigger # 然后內核會把D狀態線程調用棧輸出到內核日志,這可以通過dmesg查看 $ dmesg

Linux命令拾遺之理解系統負載(整理分享)

這里就能很清楚的看到,是由于vfork系統調用引起的負載上升。

之前介紹過bcc工具集里的offcputime工具,它可以用來繪制offcpu火焰圖,同樣的,診斷高負載問題時,也可以用這個工具,傳一個參數,讓其只關注D狀態線程的offcpu行為即可,如下:

# ubuntu安裝bcc工具集 $ sudo apt install bpfcc-tools # 使用root身份進入bash $ sudo bash # --state 2用于指定抓取TASK_UNINTERRUPTIBLE即D狀態線程的offcpu棧 $ offcputime-bpfcc -K --state 2 -f 60  > d_state_offcpu_stack.out # 繪制為offcpu火焰圖 $ awk '{ print $1, $2 / 1000 }' d_state_offcpu_stack.out | ./FlameGraph/flamegraph.pl --color=io --countname=ms > d_state_offcpu.svg

Linux命令拾遺之理解系統負載(整理分享)

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
中日韩无砖码一线二线| 国产午夜精品一区二区三区极品| 97精品国产91久久久久久| 亚洲av日韩综合一区二区三区 | 国产精品亚洲专区在线播放| 2021久久国自产拍精品| 999这里只有精品| 精品精品国产高清a毛片牛牛| 丰满人妻熟妇乱又仑精品| 亚洲精品乱码久久久久久不卡| 亚洲日韩精品国产3区| 亚洲欧洲中文日韩av乱码| 国产精品久久久久毛片真精品| 国精产品一品二品国精品69xx| 91情侣在线精品国产免费| 国产网站麻豆精品视频| 亚洲精品国产肉丝袜久久| 97精品久久天干天天蜜| 久久精品蜜芽亚洲国产AV| 久久久久久九九99精品| 少妇精品久久久一区二区三区| 亚洲2022国产成人精品无码区| 久久精品视频观看| 久久精品国产亚洲AV网站| 亚洲AV永久无码精品| 久久精品视频一区二区三区| 免费精品99久久国产综合精品| 精品午夜久久福利大片| 久久精品国产半推半就| 亚洲国产精品嫩草影院在线观看| 亚洲av永久无码精品秋霞电影影院| 久久99热狠狠色精品一区| 久久亚洲国产精品一区二区| 亚洲第一极品精品无码久久| 亚洲αv在线精品糸列| 亚洲综合精品一二三区在线| 99精品久久99久久久久久| 91精品国产三级在线观看| 亚洲精品视频观看| 国产精品吹潮香蕉在线观看| 成人区精品一区二区不卡亚洲|