1. 程式人生 > >Linux系統排查——CPU負載篇

Linux系統排查——CPU負載篇

stdout 0.00 swap stat cpu 隨筆 2.7 bin tasks

 本隨筆介紹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資源。

2. 使用w查看系統負載

# w
  19:29:47 up 49 days,  7:38,  1 user,  load average: 0.42, 0.46, 0.41
 USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
openstac pts/1    10.14.16.25      19:21    1.00s  0.19s  0.03s sshd: openstack [priv]

使用 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命令的截圖示意,默認情況下,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資源。

3. iostat命令

  iostat命令可以查看系統分區的IO使用情況

4. iostat命令查看系統IO占用

# iostat
Linux 3.13.0-55-generic (ISeR-Server1)     08/12/2015     _x86_64_    (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           4.62    0.02    2.20    0.55    0.00   92.60

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               5.91         4.16       130.04   17735179  554343984

在第2行系統發行版本下面的第4、5行,可以看到與top命令中CPU使用情況類似的信息,

  第7行,可以看到一些IO指標:

    tps: 每秒I/O傳輸請求量;

    kB_read/s:每秒讀取多少KB;

    kB_wrtn/s:每秒寫多少KB;

    kB_read:一共讀了多少KB;

    kB_wrtn:一共寫了多少KB。

  iostat命令屬於sysstat工具包,由於我們的機器只掛載了一塊硬盤,因此不能體現不同設備的I/O區別。

4. iotop命令

  iotop命令類似於top命令,但是顯示的是各個進程的I/O情況,對於定位I/O操作較重的進程有比較大的作用。

5. iotop命令與進程的IO狀況

Total DISK READ :       0.00 B/s | Total DISK WRITE :     972.38 K/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:     995.35 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                 
 1651 be/4 mysql       0.00 B/s  953.24 K/s  0.00 %  6.71 % mysqld
  189 be/3 root        0.00 B/s    0.00 B/s  0.00 %  1.50 % [jbd2/sda2-8]
 3492 be/4 mysql       0.00 B/s    7.66 K/s  0.00 %  0.80 % mysqld
 3475 be/4 mysql       0.00 B/s    3.83 K/s  0.00 %  0.52 % mysqld
 1539 be/4 mysql       0.00 B/s    0.00 B/s  0.00 %  0.30 % mysqld
 2419 be/4 mysql       0.00 B/s    3.83 K/s  0.00 %  0.24 % mysqld
 3085 be/4 mysql       0.00 B/s    3.83 K/s  0.00 %  0.22 % mysqld

這裏可以看到不同任務的讀寫強度。

二、 sysstat工具與負載歷史回放

  很多系統負載過高的時候我們是無法立即獲知或者立即解決的,當檢測到或者知道歷史的高負載狀況時,可能需要回放歷史監控數據,這時 sar 命令就派上用場了,sar命令同樣來自sysstat工具包,可以記錄系統的CPU負載、I/O狀況和內存使用記錄,便於歷史數據的回放。

  Ubuntu系統上,sysstat的配置文件在/etc/default/sysstat,sysstat默認關閉,通過將該文件中的ENABLED改為"true"啟用;歷史日誌的存放位置為/var/log/sysstat

  Red Hat系統上,sysstat的配置文件在/etc/sysconfig/sysstat文件,歷史日誌的存放位置為/var/log/sa

  兩種系統上,統計信息都是每10分鐘記錄一次,每天的23:59會分割統計文件,這些操作的頻率都在/etc/cron.d/sysstat文件配置。

1. sar命令查看CPU、內存和磁盤記錄

  默認情況下,sar命令顯示當天的統計信息,不帶參數顯示CPU統計信息,參數-r顯示收集的內存記錄,-b顯示磁盤I/O

6. 使用sar命令查看當天CPU使用

# sar
Linux 3.13.0-55-generic (ISeR-Server1)     08/12/2015     _x86_64_    (4 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:05:01 AM     all      3.83      0.02      4.24      0.61      0.00     91.30
12:15:01 AM     all      3.57      0.02      4.28      0.58      0.00     91.54
12:25:01 AM     all      3.83      0.02      5.16      0.60      0.00     90.39
12:35:01 AM     all      3.98      0.02      5.66      0.58      0.00     89.76
12:45:01 AM     all      3.86      0.02      5.26      0.59      0.00     90.28
12:55:01 AM     all      3.77      0.02      5.19      0.60      0.00     90.42

  7. 使用sar命令查看當天內存使用

# sar -r
Linux 3.13.0-55-generic (ISeR-Server1)     08/12/2015     _x86_64_    (4 CPU)

12:00:01 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
12:05:01 AM   6420736   5839392     47.63    242640   1366912   6811944     55.56   4324000   1202152        24
12:15:01 AM   6423128   5837000     47.61    242640   1367348   6830944     55.72   4320608   1202400        48
12:25:01 AM   6430984   5829144     47.55    242640   1367548   6814980     55.59   4314376   1202468        48
12:35:01 AM   6422924   5837204     47.61    242640   1367848   6817224     55.60   4321604   1202576        48
12:45:01 AM   6427300   5832828     47.58    242640   1368056   6822240     55.65   4318412   1202572        28

8. 使用sar命令查看當天IO統計記錄

# sar -b
Linux 3.13.0-55-generic (ISeR-Server1)     08/12/2015     _x86_64_    (4 CPU)

12:00:01 AM       tps      rtps      wtps   bread/s   bwrtn/s
12:05:01 AM      7.44      0.00      7.44      0.00    279.22
12:15:01 AM      6.45      0.00      6.45      0.00    255.84
12:25:01 AM      6.59      0.00      6.59      0.00    260.20
12:35:01 AM      6.51      0.00      6.51      0.00    261.42
12:45:01 AM      6.42      0.00      6.42      0.00    255.79

2. 使用sar查看指定時間、指定日期的歷史記錄

9. 使用參數-s和-e限定查看的時間

# sar -s 20:00:00
Linux 3.13.0-55-generic (ISeR-Server1)     08/12/2015     _x86_64_    (4 CPU)

08:05:01 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
08:15:01 PM     all      3.98      0.02      6.07      0.58      0.00     89.34
08:25:01 PM     all      4.32      0.02      5.74      0.58      0.00     89.34
Average:        all      4.15      0.02      5.91      0.58      0.00     89.34

  9 只查看當天20:00:00後的CPU統計記錄

10. 使用參數-f查看本月內之前某一天的歷史統計信息

# sar -f /var/log/sysstat/sa08
Linux 3.13.0-55-generic (ISeR-Server1)     08/08/2015     _x86_64_    (4 CPU)

12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:05:01 AM     all      3.65      0.02      2.79      0.60      0.00     92.94
12:15:01 AM     all      3.45      0.02      3.03      0.56      0.00     92.94
12:25:01 AM     all      3.43      0.02      3.25      0.56      0.00     92.74
12:35:01 AM     all      3.44      0.01      3.09      0.56      0.00     92.89
12:45:01 AM     all      3.25      0.02      1.35      0.55      0.00     94.83
12:55:01 AM     all      3.36      0.02      1.77      0.56      0.00     94.29

sysstat工具只存儲1個月內的系統使用記錄,每天的記錄以saN為文件名保存在相應的日誌目錄中,這裏我們查看本月8號的CPU使用記錄。

Linux系統排查——CPU負載篇