国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux中怎么理解系統負載

2024-08-27 23:55:09
字體:
來源:轉載
供稿:網友
  這篇文章主要介紹“Linux中怎么理解系統負載”,在日常操作中,相信很多人在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

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永城市| 禹州市| 类乌齐县| 汽车| 赤城县| 商水县| 察隅县| 镇赉县| 宿松县| 陕西省| 天气| 南宁市| 汶上县| 庄河市| 永胜县| 杭州市| 莎车县| 临猗县| 闽侯县| 黔东| 阳江市| 二连浩特市| 双城市| 武城县| 胶南市| 惠州市| 共和县| 顺平县| 晋州市| 宁国市| 紫云| 大安市| 涟源市| 临海市| 梁山县| 壤塘县| 庐江县| 门头沟区| 博乐市| 罗江县| 昭觉县|