Linux 經常使用性能排查命令

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

  • uptime
  • dmesg | tail
  • vmstat 1
  • mpstat -P ALL 1
  • pidstat 1
  • iostat -xz 1
  • free -m
  • sar -n DEV 1
  • sar -n TCP,ETCP 1
  • top

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

 

uptimejava

$ uptime
23:51:26 up 21:31,  1 user,  load average: 30.02, 26.43, 19.02

這個命令能夠快速查看機器的負載狀況。在Linux系統中,這些數據表示等待CPU資源的進程和阻塞在不可中斷IO進程(進程狀態爲D)的數量。這些數據可讓咱們對系統資源使用有一個宏觀的瞭解。node

命令的輸出分別表示1分鐘、5分鐘、15分鐘的平均負載狀況。經過這三個數據,能夠了解服務器負載是在趨於緊張仍是區域緩解。若是1分鐘平均負載很高,而15分鐘平均負載很低,說明服務器正在命令高負載狀況,須要進一步排查CPU資源都消耗在了哪裏。反之,若是15分鐘平均負載很高,1分鐘平均負載較低,則有多是CPU資源緊張時刻已通過去。linux

上面例子中的輸出,能夠看見最近1分鐘的平均負載很是高,且遠高於最近15分鐘負載,所以咱們須要繼續排查當前系統中有什麼進程消耗了大量的資源。能夠經過下文將會介紹的vmstat、mpstat等命令進一步排查。ios

 

dmesg | taildocker

$ dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.  Check SNMP counters.

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

 

vmstat 1緩存

複製代碼

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

複製代碼

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 1
Linux 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  %idle
07:38:50 PM  all  98.47   0.00   0.75    0.00   0.00   0.00    0.00    0.00    0.00   0.78
07:38:50 PM    0  96.04   0.00   2.97    0.00   0.00   0.00    0.00    0.00    0.00   0.99
07:38:50 PM    1  97.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   2.00
07:38:50 PM    2  98.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   1.00
07: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 1
Linux 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  Command
07:41:03 PM     0         9    0.00    0.94    0.00    0.94     1  rcuos/0
07:41:03 PM     0      4214    5.66    5.66    0.00   11.32    15  mesos-slave
07:41:03 PM     0      4354    0.94    0.94    0.00    1.89     8  java
07:41:03 PM     0      6521 1596.23    1.89    0.00 1598.11    27  java
07:41:03 PM     0      6564 1571.70    7.55    0.00 1579.25    28  java
07:41:03 PM 60004     60154    0.94    4.72    0.00    5.66     9  pidstat
07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:04 PM     0      4214    6.00    2.00    0.00    8.00    15  mesos-slave
07:41:04 PM     0      6521 1590.00    1.00    0.00 1591.00    27  java
07:41:04 PM     0      6564 1573.00   10.00    0.00 1583.00    28  java
07:41:04 PM   108      6718    1.00    0.00    0.00    1.00     0  snmp-pass
07:41:04 PM 60004     60154    1.00    4.00    0.00    5.00     9  pidstat

複製代碼

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

 

iostat -xz 1

複製代碼

$ iostat -xz 1
Linux 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.21
Device:   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.09
xvdb        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.25
xvdc        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.26
dm-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.04
dm-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.00
dm-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
[...]

複製代碼

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

  • r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數和每秒讀寫數據量(千字節)。讀寫量過大,可能會引發性能問題。
  • await:IO操做的平均等待時間,單位是毫秒。這是應用程序在和磁盤交互時,須要消耗的時間,包括IO等待和實際操做的耗時。若是這個數值過大,多是硬件設備遇到了瓶頸或者出現故障。
  • avgqu-sz:向設備發出的請求平均數量。若是這個數值大於1,多是硬件設備已經飽和(部分前端硬件設備支持並行寫入)。
  • %util:設備利用率。這個數值表示設備的繁忙程度,經驗值是若是超過60,可能會影響IO性能(能夠參照IO操做平均等待時間)。若是到達100%,說明硬件設備已經飽和。

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

 

free –m

$ free -m
             total       used       free     shared    buffers     cached
Mem:        245998      24545     221453         83         59        541
-/+ buffers/cache:      23944     222053
Swap:            0          0          0

free命令能夠查看系統內存的使用狀況,-m參數表示按照兆字節展現。最後兩列分別表示用於IO緩存的內存數,和用於文件系統頁緩存的內存數。須要注意的是,第二行-/+ buffers/cache,看上去緩存佔用了大量內存空間。這是Linux系統的內存使用策略,儘量的利用內存,若是應用程序須要內存,這部份內存會當即被回收並分配給應用程序。所以,這部份內存通常也被當成是可用內存。

若是可用內存很是少,系統可能會動用交換區(若是配置了的話),這樣會增長IO開銷(能夠在iostat命令中提現),下降系統性能。

 

sar -n DEV 1

複製代碼

$ sar -n DEV 1
Linux 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   %ifutil
12:16:49 AM      eth0  18763.00   5032.00  20686.42    478.30      0.00      0.00      0.00      0.00
12:16:49 AM        lo     14.00     14.00      1.36      1.36      0.00      0.00      0.00      0.00
12:16:49 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:16:49 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
12:16:50 AM      eth0  19763.00   5101.00  21999.10    482.56      0.00      0.00      0.00      0.00
12:16:50 AM        lo     20.00     20.00      3.25      3.25      0.00      0.00      0.00      0.00
12:16:50 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

複製代碼

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

 

sar -n TCP,ETCP 1

複製代碼

$ sar -n TCP,ETCP 1
Linux 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/s
12:17:20 AM      1.00      0.00  10233.00  18846.00
12:17:19 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
12:17:20 AM      0.00      0.00      0.00      0.00      0.00
12:17:20 AM  active/s passive/s    iseg/s    oseg/s
12:17:21 AM      1.00      0.00   8359.00   6039.00
12:17:20 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
12:17:21 AM      0.00      0.00      0.00      0.00      0.00

複製代碼

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

  • active/s:每秒本地發起的TCP鏈接數,既經過connect調用建立的TCP鏈接;
  • passive/s:每秒遠程發起的TCP鏈接數,即經過accept調用建立的TCP鏈接;
  • retrans/s:每秒TCP重傳數量;

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

 

top

複製代碼

$ top
top - 00:15:40 up 21:56,  1 user,  load average: 31.09, 29.87, 29.92
Tasks: 871 total,   1 running, 868 sleeping,   0 stopped,   2 zombie
%Cpu(s): 96.8 us,  0.4 sy,  0.0 ni,  2.7 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  25190241+total, 24921688 used, 22698073+free,    60448 buffers
KiB Swap:        0 total,        0 used,        0 free.   554208 cached Mem
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 20248 root      20   0  0.227t 0.012t  18748 S  3090  5.2  29812:58 java
  4213 root      20   0 2722544  64640  44232 S  23.5  0.0 233:35.37 mesos-slave
 66128 titancl+  20   0   24344   2332   1172 R   1.0  0.0   0:00.07 top
  5235 root      20   0 38.227g 547004  49996 S   0.7  0.2   2:02.74 java
  4299 root      20   0 20.015g 2.682g  16836 S   0.3  1.1  33:14.42 java
     1 root      20   0   33620   2920   1496 S   0.0  0.0   0:03.82 init
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd
     3 root      20   0       0      0      0 S   0.0  0.0   0:05.35 ksoftirqd/0
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     6 root      20   0       0      0      0 S   0.0  0.0   0:06.94 kworker/u256:0
     8 root      20   0       0      0      0 S   0.0  0.0   2:38.05 rcu_sched

複製代碼

top命令包含了前面好幾個命令的檢查的內容。好比系統負載狀況(uptime)、系統內存使用狀況(free)、系統CPU使用狀況(vmstat)等。所以經過這個命令,能夠相對全面的查看系統負載的來源。同時,top命令支持排序,能夠按照不一樣的列排序,方便查找出諸如內存佔用最多的進程、CPU佔用率最高的進程等。

可是,top命令相對於前面一些命令,輸出是一個瞬間值,若是不持續盯着,可能會錯過一些線索。這時可能須要暫停top命令刷新,來記錄和比對數據。

 

 

 

################### cpu性能查看 ################
一、查看物理cpu個數:
cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l

二、查看每一個物理cpu中的core個數:
cat /proc/cpuinfo |grep "cpu cores"|wc -l

三、邏輯cpu的個數:
cat /proc/cpuinfo |grep "processor"|wc -l

物理cpu個數*核數=邏輯cpu個數(不支持超線程技術的狀況下)

############## 內存查看 #############
一、查看內存使用狀況:
free -m
             total       used       free     shared    buffers     cached
Mem:          3949       2519       1430          0        189       1619
-/+ buffers/cache:        710       3239
Swap:         3576          0       3576

total:內存總數
used:已經使用的內存數
free:空閒內存數
shared:多個進程共享的內存總額
- buffers/cache:(已用)的內存數,即used-buffers-cached
+ buffers/cache:(可用)的內存數,即free+buffers+cached

Buffer Cache用於針對磁盤塊的讀寫;Page Cache用於針對文件inode的讀寫,這些Cache能有效地縮短I/O系統調用的時間。

對於操做系統來講free/used是系統可用/佔用的內存;而對於應用程序來講-/+ buffers/cache是可用/佔用內存,由於buffers/cache很快就會被使用。咱們工做時候應該從應用角度來看。

######## 硬盤查看 ############
一、查看硬盤及分區信息:
fdisk -l

二、查看文件系統的磁盤空間佔用狀況:
df -h

三、查看硬盤的I/O性能(每隔一秒顯示一次,顯示5次):
iostat -x 1 5
iostat是含在套裝systat中的,能夠用yum -y install systat來安裝。
常關注的參數:
若是%util接近100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。
若是idle小於70%,I/O的壓力就比較大了,說明讀取進程中有較多的wait。

四、查看linux系統中某目錄的大小:
du -sh /root

如發現某個分區空間接近用完,能夠進入該分區的掛載點,用如下命令找出佔用空間最多的文件或目錄,而後按照從大到小的順序,找出系統中佔用最多空間的前10個文件或目錄:
du -cksh *|sort -rn|head -n 10

################# 查看平均負載 #######################
有時候系統響應很慢,但又找不到緣由,這時就要查看平均負載了,看它是否有大量的進程在排隊等待。
最簡單的命令:
uptime
查看過去的1分鐘、5分鐘和15分鐘內進程隊列中的平均進程數量。
還有動態命令:
top
咱們只關心如下部分:
top - 21:33:09 up  1:00,  1 user,  load average: 0.00, 0.01, 0.05
若是每一個邏輯cpu當前的活動進程不大於3,則系統性能良好;
若是每一個邏輯cpu當前的活動進程不大於4,表示能夠接受;
若是每一個邏輯cpu當前的活動進程大於5,則系統性能問題嚴重。
通常計算方法:負載值/邏輯cpu個數

還能夠結合vmstat命令來判斷系統是否繁忙,其中:
procs
r:等待運行的進程數。
b:處在非中斷睡眠狀態的進程數。
w:被交換出去的可運行的進程數。
memeory
swpd:虛擬內存使用狀況,單位爲KB。
free:空閒的內存,單位爲KB。
buff:被用來做爲緩存的內存數,單位爲KB。
swap
si:從磁盤交換到內存的交換頁數量,單位爲KB。
so:從內存交換到磁盤的交換頁數量,單位爲KB。
io
bi:發送到塊設備的塊數,單位爲KB。
bo:從塊設備接受的塊數,單位爲KB。
system
in:每秒的中斷數,包括時鐘中斷。
cs:每秒的環境切換次數。
cpu
按cpu的總使用百分比來顯示。
us:cpu使用時間。
sy:cpu系統使用時間。
id:閒置時間。
標準狀況下r和b的值應該爲:
r<5,b=0
假設輸出的信息中:
若是r常常大於3或4,且id常常少於50,表示cpu的負荷太重。
pi、po長期不等於0,表示內存不足。
bi常常不等於0,且在b中的隊列大於2或3,表示io的性能很差。

############ 其餘參數 ######################
查看內核版本號:
uname -a
簡化命令:
uname -r
查看系統是32位仍是64位的:
file /sbin/init
查看發行版:
cat /etc/issue
或lsb_release -a
查看系統已載入的相關模塊:
lsmod
查看pci設置:
lspci
相關文章
相關標籤/搜索