久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      Linux命令拾遺之理解系統(tǒng)負(fù)載(整理分享)

      本篇文章給大家?guī)?lái)了Linux中負(fù)載的概念與問(wèn)題診斷方法相關(guān)知識(shí),其中包括了負(fù)載是什么以及線程狀態(tài)等,希望對(duì)大家有幫助。

      Linux命令拾遺之理解系統(tǒng)負(fù)載(整理分享)

      一般在類unix系統(tǒng)上,都會(huì)有系統(tǒng)負(fù)載(load average)這個(gè)指標(biāo),用來(lái)形容系統(tǒng)的繁忙程度,值越大則代表系統(tǒng)越繁忙。

      查看負(fù)載

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

      我們關(guān)注load average后的3個(gè)值,分別代表1分鐘、5分鐘、15分鐘的系統(tǒng)平均負(fù)載,如果1分鐘值>5分鐘值>15分鐘值,則代表近15分鐘內(nèi)系統(tǒng)壓力越來(lái)越大,反之亦然。

      同樣,在top命令的第一行,也能看到系統(tǒng)負(fù)載,它的含義和uptime是一樣的。

      負(fù)載是什么

      一般來(lái)說(shuō),系統(tǒng)線程基本都在這3個(gè)狀態(tài)上:運(yùn)行中,可運(yùn)行,阻塞等待,其中,運(yùn)行中的線程正在CPU上跑,可運(yùn)行的線程等待CPU調(diào)度,而阻塞的線程等待鎖釋放或io完成。

      在傳統(tǒng)unix系統(tǒng)上(如BSD),系統(tǒng)負(fù)載由正在運(yùn)行的線程以及可運(yùn)行的線程這2個(gè)部分組成。

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

      而Linux擴(kuò)大了負(fù)載的定義,如下:

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

      因?yàn)長(zhǎng)inux認(rèn)為,雖然D狀態(tài)的線程并不消耗CPU資源,但是它會(huì)消耗磁盤、網(wǎng)卡等硬件資源以及鎖這樣的軟件資源,因此它也應(yīng)該被用來(lái)計(jì)算系統(tǒng)負(fù)載,想來(lái)也合理,畢竟系統(tǒng)負(fù)載是用來(lái)描述整個(gè)系統(tǒng)的繁忙程度的,而不僅僅是CPU的。

      線程狀態(tài)D

      在Linux里面,線程有如下常見(jiàn)狀態(tài):

      • R: 正在運(yùn)行或可運(yùn)行狀態(tài)

      • S: 睡眠狀態(tài),被阻塞等待喚醒

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

      這里面的R與D狀態(tài)的線程會(huì)影響系統(tǒng)負(fù)載,因此,當(dāng)系統(tǒng)負(fù)載較高時(shí),可以通過(guò)如下命令了解是哪些線程導(dǎo)致的:

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

      小實(shí)驗(yàn):將系統(tǒng)負(fù)載升到100

      # 使用vfork函數(shù)創(chuàng)建一個(gè)子進(jìn)程,子進(jìn)程如果不調(diào)用exec系統(tǒng)調(diào)用,它的狀態(tài)會(huì)一直是D。

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

      等待1分鐘,就會(huì)發(fā)現(xiàn)系統(tǒng)負(fù)載升到了快100,如下:

      $ uptime 20:24:42 up 29 days,  7:32,  1 user,  load average: 99.94, 74.82, 35.87 # 可以看到很多D狀態(tài)的進(jìn)程 $ 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

      如上,通過(guò)ps命令可以看到線程狀態(tài),還有一個(gè)wchan字段,它顯示的是線程當(dāng)前被阻塞在什么內(nèi)核函數(shù)上,這能看出一些蛛絲馬跡。

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

      # 寫入一個(gè)w即可,需要root權(quán)限執(zhí)行 $ echo w > /proc/sysrq-trigger # 然后內(nèi)核會(huì)把D狀態(tài)線程調(diào)用棧輸出到內(nèi)核日志,這可以通過(guò)dmesg查看 $ dmesg

      Linux命令拾遺之理解系統(tǒng)負(fù)載(整理分享)

      這里就能很清楚的看到,是由于vfork系統(tǒng)調(diào)用引起的負(fù)載上升。

      之前介紹過(guò)bcc工具集里的offcputime工具,它可以用來(lái)繪制offcpu火焰圖,同樣的,診斷高負(fù)載問(wèn)題時(shí),也可以用這個(gè)工具,傳一個(gè)參數(shù),讓其只關(guān)注D狀態(tài)線程的offcpu行為即可,如下:

      # ubuntu安裝bcc工具集 $ sudo apt install bpfcc-tools # 使用root身份進(jìn)入bash $ sudo bash # --state 2用于指定抓取TASK_UNINTERRUPTIBLE即D狀態(tài)線程的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命令拾遺之理解系統(tǒng)負(fù)載(整理分享)

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)