用十條命令在一分鐘內檢查Linux服務器性能[轉]

概述html

經過執行如下命令,能夠在1分鐘內對系統資源使用狀況有個大體的瞭解。前端

  • uptimejava

  • dmesg | tailios

  • vmstat 1docker

  • mpstat -P ALL 1後端

  • pidstat 1緩存

  • iostat -xz 1服務器

  • free -m網絡

  • sar -n DEV 1ide

  • sar -n TCP,ETCP 1

  • top

其中一些命令須要安裝sysstat包,有一些由procps包提供。這些命令的輸出,有助於快速定位性能瓶頸,檢查出全部資源(CPU、內存、磁盤IO等)的利用率(utilization)、飽和度(saturation)和錯誤(error)度量,也就是所謂的USE方法

下面咱們來逐一介紹下這些命令,有關這些命令更多的參數和說明,請參照命令的手冊。

dmesg | tail

該命令會輸出系統日誌的最後10行。示例中的輸出,能夠看見一次內核的oom kill和一次TCP丟包。這些日誌能夠幫助排查性能問題。千萬不要忘了這一步。

vmstat 1

$ vmstat 1procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st34  0    0 200889792  73708 591828    0    0     0     5    6   10 96  1  3  0  032  0    0 200889920  73708 591860    0    0     0   592 13284 4282 98  1  1  0  032  0    0 200890112  73708 591860    0    0     0     0 9501 2154 99  1  0  0  032  0    0 200889568  73712 591856    0    0     0    48 11900 2459 99  0  0  0  032  0    0 200890208  73712 591860    0    0     0     0 15898 4840 98  1  1  0  0^C

vmstat(8) 命令,每行會輸出一些系統核心指標,這些指標可讓咱們更詳細的瞭解系統狀態。後面跟的參數1,表示每秒輸出一次統計信息,表頭提示了每一列的含義,這幾介紹一些和性能調優相關的列:

  • r:等待在CPU資源的進程數。這個數據比平均負載更加可以體現CPU負載狀況,數據中不包含等待IO的進程。若是這個數值大於機器CPU核數,那麼機器的CPU資源已經飽和。

  • free:系統可用內存數(以千字節爲單位),若是剩餘內存不足,也會致使系統性能問題。下文介紹到的free命令,能夠更詳細的瞭解系統內存的使用狀況。

  • si, so:交換區寫入和讀取的數量。若是這個數據不爲0,說明系統已經在使用交換區(swap),機器物理內存已經不足。

  • us, sy, id, wa, st:這些都表明了CPU時間的消耗,它們分別表示用戶時間(user)、系統(內核)時間(sys)、空閒時間(idle)、IO等待時間(wait)和被偷走的時間(stolen,通常被其餘虛擬機消耗)。

上述這些CPU時間,可讓咱們很快了解CPU是否出於繁忙狀態。通常狀況下,若是用戶時間和系統時間相加很是大,CPU出於忙於執行指令。若是IO等待時間很長,那麼系統的瓶頸可能在磁盤IO。

示例命令的輸出能夠看見,大量CPU時間消耗在用戶態,也就是用戶應用程序消耗了CPU時間。這不必定是性能問題,須要結合r隊列,一塊兒分析。

mpstat -P ALL 1

$ mpstat -P ALL 1Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU)07:38:49 PM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice  %idle07:38:50 PM  all  98.47   0.00   0.75    0.00   0.00   0.00    0.00    0.00    0.00   0.7807:38:50 PM    0  96.04   0.00   2.97    0.00   0.00   0.00    0.00    0.00    0.00   0.9907:38:50 PM    1  97.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   2.0007:38:50 PM    2  98.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   1.0007:38:50 PM    3  96.97   0.00   0.00    0.00   0.00   0.00    0.00    0.00    0.00   3.03[...]

該命令能夠顯示每一個CPU的佔用狀況,若是有一個CPU佔用率特別高,那麼有多是一個單線程應用程序引發的。

pidstat 1

$ pidstat 1Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)07:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command07:41:03 PM     0         9    0.00    0.94    0.00    0.94     1  rcuos/007:41:03 PM     0      4214    5.66    5.66    0.00   11.32    15  mesos-slave07:41:03 PM     0      4354    0.94    0.94    0.00    1.89     8  java07:41:03 PM     0      6521 1596.23    1.89    0.00 1598.11    27  java07:41:03 PM     0      6564 1571.70    7.55    0.00 1579.25    28  java07:41:03 PM 60004     60154    0.94    4.72    0.00    5.66     9  pidstat07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command07:41:04 PM     0      4214    6.00    2.00    0.00    8.00    15  mesos-slave07:41:04 PM     0      6521 1590.00    1.00    0.00 1591.00    27  java07:41:04 PM     0      6564 1573.00   10.00    0.00 1583.00    28  java07:41:04 PM   108      6718    1.00    0.00    0.00    1.00     0  snmp-pass07:41:04 PM 60004     60154    1.00    4.00    0.00    5.00     9  pidstat^C

pidstat命令輸出進程的CPU佔用率,該命令會持續輸出,而且不會覆蓋以前的數據,能夠方便觀察系統動態。如上的輸出,能夠看見兩個JAVA進程佔用了將近1600%的CPU時間,既消耗了大約16個CPU核心的運算資源。

iostat -xz 1

$ iostat -xz 1Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle          73.96    0.00    3.73    0.03    0.06   22.21Device:   rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda        0.00     0.23    0.21    0.18     4.52     2.08    34.37     0.00    9.98   13.80    5.42   2.44   0.09xvdb        0.01     0.00    1.02    8.94   127.97   598.53   145.79     0.00    0.43    1.78    0.28   0.25   0.25xvdc        0.01     0.00    1.02    8.86   127.79   595.94   146.50     0.00    0.45    1.82    0.30   0.27   0.26dm-0        0.00     0.00    0.69    2.32    10.47    31.69    28.01     0.01    3.23    0.71    3.98   0.13   0.04dm-1        0.00     0.00    0.00    0.94     0.01     3.78     8.00     0.33  345.84    0.04  346.81   0.01   0.00dm-2        0.00     0.00    0.09    0.07     1.35     0.36    22.50     0.00    2.55    0.23    5.62   1.78   0.03[...]^C

iostat命令主要用於查看機器磁盤IO狀況。該命令輸出的列,主要含義是:

  • r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數和每秒讀寫數據量(千字節)。讀寫量過大,可能會引發性能問題。

  • await:IO操做的平均等待時間,單位是毫秒。這是應用程序在和磁盤交互時,須要消耗的時間,包括IO等待和實際操做的耗時。若是這個數值過大,多是硬件設備遇到了瓶頸或者出現故障。

  • avgqu-sz:向設備發出的請求平均數量。若是這個數值大於1,多是硬件設備已經飽和(部分前端硬件設備支持並行寫入)。

  • %util:設備利用率。這個數值表示設備的繁忙程度,經驗值是若是超過60,可能會影響IO性能(能夠參照IO操做平均等待時間)。若是到達100%,說明硬件設備已經飽和。

若是顯示的是邏輯設備的數據,那麼設備利用率不表明後端實際的硬件設備已經飽和。值得注意的是,即便IO性能不理想,也不必定意味這應用程序性能會很差,能夠利用諸如預讀取、寫緩存等策略提高應用性能。

sar -n DEV 1

$ sar -n DEV 1Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015     _x86_64_    (32 CPU)12:16:48 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil12:16:49 AM      eth0  18763.00   5032.00  20686.42    478.30      0.00      0.00      0.00      0.0012:16:49 AM        lo     14.00     14.00      1.36      1.36      0.00      0.00      0.00      0.0012:16:49 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.0012:16:49 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil12:16:50 AM      eth0  19763.00   5101.00  21999.10    482.56      0.00      0.00      0.00      0.0012:16:50 AM        lo     20.00     20.00      3.25      3.25      0.00      0.00      0.00      0.0012:16:50 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00^C

sar命令在這裏能夠查看網絡設備的吞吐率。在排查性能問題時,能夠經過網絡設備的吞吐量,判斷網絡設備是否已經飽和。如示例輸出中,eth0網卡設備,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,沒有達到1Gbit/sec的硬件上限。

sar -n TCP,ETCP 1

$ sar -n TCP,ETCP 1Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)12:17:19 AM  active/s passive/s    iseg/s    oseg/s12:17:20 AM      1.00      0.00  10233.00  18846.0012:17:19 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s12:17:20 AM      0.00      0.00      0.00      0.00      0.0012:17:20 AM  active/s passive/s    iseg/s    oseg/s12:17:21 AM      1.00      0.00   8359.00   6039.0012:17:20 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s12:17:21 AM      0.00      0.00      0.00      0.00      0.00^C

sar命令在這裏用於查看TCP鏈接狀態,其中包括:

  • active/s:每秒本地發起的TCP鏈接數,既經過connect調用建立的TCP鏈接;

  • passive/s:每秒遠程發起的TCP鏈接數,即經過accept調用建立的TCP鏈接;

  • retrans/s:每秒TCP重傳數量;

TCP鏈接數能夠用來判斷性能問題是否因爲創建了過多的鏈接,進一步能夠判斷是主動發起的鏈接,仍是被動接受的鏈接。TCP重傳多是由於網絡環境惡劣,或者服務器壓力過大致使丟包。

相關文章
相關標籤/搜索