Linux效能檢測常用的10個基本命令
本文的內容主要來自對Netflix的一篇技術部落格( Linux Performance Analysis in 60,000 Milliseconds (https://medium.com/netflix-techblog/linux-performance-analysis-in-60-000-milliseconds-accc10403c55),並添加了一些自己的理解,僅供參考。
1. uptime
$ uptime 23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.0212
該命令可以大致的看出計算機的整體負載情況,load average後的數字分別表示計算機在1min、5min、15min內的平均負載。
2. dmesg | tail
$ 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.123456
列印核心環形快取區中的內容,可以用來檢視一些錯誤;
上面的例子中,顯示程序18694 因引記憶體越界被kill掉以及TCP request被丟棄的錯誤。通過dmesg可以快速判斷是否有導致系統性能異常的問題。
3. vmstat 1
$ vmstat 1 procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu----- rb swpdfreebuffcachesisobiboincs us sy id wa st 3400 20088979273708 5918280005610 961300 3200 20088992073708 591860000592 13284 4282 981100 3200 20089011273708 5918600000 9501 2154 991000 3200 20088956873712 59185600048 11900 2459 990000 3200 20089020873712 5918600000 15898 4840 981100 ^C123456789
vmstat的格式如下
> vmstat [options] [delay [count]]vmstat第一次輸出表示從開機到vmstat執行時的平均值;剩餘輸出的都是在指定的時間間隔內的平均值,上述例子中delay的值設定為1,除第一次以外,剩餘的都是1秒統計一次,count未設定,將會一直迴圈列印。
$ vmstat 10 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- rbswpdfreebuffcachesisobiboincs us sy id wa st 100 2527112 1086888 13720228001142111 9900 000 2527156 1086888 13719856000104 3003 490100 9900 000 2526412 1086888 1371990400010 3345 487001 9900123456
上述的例子中delay設定為10,count設定為3,表示每行列印10秒內的平均值,只打印3次。
需要檢查的列
r:表示正在執行或者等待CPU排程的程序數。因為該列資料不包含I/O的統計資訊,因此可以用來檢測CPU是否飽和。若r列中的數字大於CPU的核數,表示CPU已經處於飽和狀態。
free:當前剩餘的記憶體;
si, so:交換分割槽換入和換出的個數,若換入換出個數大於0,表示記憶體不足;
us, sy, id, wa:CPU的統計資訊,分別表示user time、system time(kernel)、idle、wait I/O。I/O處理所用的時間包含在system time中,因此若system time超過20%,則I/O可能存在瓶頸或異常;
4. mpstat -P ALL 1
$ mpstat -P ALL Linux 3.10.0-229.el7.x86_64 (localhost.localdomain)05/30/2018_x86_64_(16 CPU) 04:03:55 PMCPU%usr%nice%sys %iowait%irq%soft%steal%guest%gnice%idle 04:03:55 PMall3.670.000.610.710.000.000.000.000.0095.02 04:03:55 PM03.520.000.570.760.000.000.000.000.0095.15 04:03:55 PM13.830.000.610.710.000.000.000.000.0094.85 04:03:55 PM23.800.000.610.600.000.000.000.000.0094.99 04:03:55 PM33.680.000.580.600.000.000.000.000.0095.13 04:03:55 PM43.540.000.570.600.000.000.000.000.0095.30 [...]1234567891011
該命令用於每秒列印一次每個CPU的統計資訊,可用於檢視CPU的排程是否均勻。
5. pidstat 1
$ pidstat 1 Linux 3.13.0-49-generic (titanclusters-xxxxx)07/14/2015_x86_64_(32 CPU) 07:41:02 PMUIDPID%usr %system%guest%CPUCPUCommand 07:41:03 PM090.000.940.000.941rcuos/0 07:41:03 PM042145.665.660.0011.3215mesos-slave 07:41:03 PM043540.940.940.001.898java 07:41:03 PM06521 1596.231.890.00 1598.1127java 07:41:03 PM06564 1571.707.550.00 1579.2528java 07:41:03 PM 60004601540.944.720.005.669pidstat 07:41:03 PMUIDPID%usr %system%guest%CPUCPUCommand 07:41:04 PM042146.002.000.008.0015mesos-slave 07:41:04 PM06521 1590.001.000.00 1591.0027java 07:41:04 PM06564 1573.0010.000.00 1583.0028java 07:41:04 PM10867181.000.000.001.000snmp-pass 07:41:04 PM 60004601541.004.000.005.009pidstat ^C123456789101112131415161718
該命令用於列印各個程序對CPU的佔用情況,類似top命令中顯示的內容。pidstat的優勢在於,可以滾動的列印程序執行情況,而不像top那樣會清屏。
上述例子中,%CPU中兩個java程序的cpu利用率分別達到了1590%和1573%,表示java程序佔用了16顆CPU。
6. iostat -xz 1
類似vmstat,第一次輸出的是從系統開機到統計這段時間的取樣資料;
$ 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.960.003.730.030.0622.21 Device:rrqm/swrqm/sr/sw/srkB/swkB/s avgrq-sz avgqu-szawait r_await w_awaitsvctm%util xvda0.000.230.210.184.522.0834.370.009.9813.805.422.440.09 xvdb0.010.001.028.94127.97598.53145.790.000.431.780.280.250.25 xvdc0.010.001.028.86127.79595.94146.500.000.451.820.300.270.26 dm-00.000.000.692.3210.4731.6928.010.013.230.713.980.130.04 dm-10.000.000.000.940.013.788.000.33345.840.04346.810.010.00 dm-20.000.000.090.071.350.3622.500.002.550.235.621.780.03 [...] ^C123456789101112131415
檢查列
r/s, w/s, rkB/s, wkB/s,表示每秒向I/O裝置發出的reads、writes、read Kbytes、write Kbytes的數量。
await,表示應用程式排隊等待和被服務的平均I/O時間,該值若大於預期的時間,這表示I/O裝置處於飽和狀態或者異常。
avgqu-sz,表示請求被髮送給I/O裝置的平均時間,若該值大於1,則表示I/O裝置可能已經飽和;
%util,每秒裝置的利用率;若該利用率超過60%,則表示裝置出現效能異常;
7. free -m
$ free -m totalusedfreesharedbufferscached Mem:245998245452214538359541 -/+ buffers/cache:23944222053 Swap:00012345
檢查的列:
-
buffers: For the buffer cache, used for block device I/O.
-
cached: For the page cache, used by file systems.
若buffers和cached接近0,說明I/O的使用率過高,系統存在效能問題。
Linux中會用free記憶體作為cache,若應用程式需要分配記憶體,系統能夠快速的將cache佔用的記憶體回收,因此free的記憶體包含cache佔用的部分。
8. sar -n DEV 1
sar是System Activity Reporter的縮寫,系統活動狀態報告。
-n { keyword [,…] | ALL },用於報告網路統計資料。keyword可以是以下的一個或者多個: DEV, EDEV, NFS, NFSD, SOCK, IP, EIP, ICMP, EICMP, TCP, ETCP, UDP, SOCK6, IP6, EIP6, ICMP6, EICMP6 和UDP6。
-n DEV 1, 每秒統計一次網路的使用情況;
-n EDEV 1,每秒統計一次錯誤的網路資訊;
$ sar -n DEV 1 Linux 3.10.0-229.el7.x86_64 (localhost.localdomain)05/31/2018_x86_64_(16 CPU) 03:54:57 PMIFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s 03:54:58 PMens323286.007207.00283.3418333.900.000.000.00 03:54:58 PMlo0.000.000.000.000.000.000.00 03:54:58 PM vethe915e510.000.000.000.000.000.000.00 03:54:58 PMdocker00.000.000.000.000.000.000.00 03:54:58 PMIFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s 03:54:59 PMens323304.007362.00276.8918898.510.000.000.00 03:54:59 PMlo0.000.000.000.000.000.000.00 03:54:59 PM vethe915e510.000.000.000.000.000.000.00 03:54:59 PMdocker00.000.000.000.000.000.000.00 ^C123456789101112131415
-
IFACE ,網路介面名稱;
-
rxpck/s ,每秒接收到包數;
-
txpck/s ,每秒傳輸的報數;(transmit packages)
-
rxkB/s ,每秒接收的千位元組數;
-
txkB/s ,每秒傳送的千位元組數;
-
rxcmp/s ,每秒接收的壓縮包的數量;
-
txcmp/s ,每秒傳送的壓縮包的數量;
-
rxmcst/s,每秒接收的組資料包數量;
9. sar -n TCP,ETCP 1
該命令可以用於粗略的判斷網路的吞吐量,如發起的網路連線數量和接收的網路連線數量;
-
TCP, 報告關於TCPv4網路流量的統計資訊;
-
ETCP, 報告有關TCPv4網路錯誤的統計資訊;
$ sar -n TCP,ETCP 1 Linux 3.10.0-514.26.2.el7.x86_64 (aushop)05/31/2018_x86_64_(2 CPU) 04:16:27 PMactive/s passive/siseg/soseg/s 04:16:44 PM0.002.0015.0013.00 04:16:45 PM0.003.00126.00203.00 04:16:46 PM0.000.0099.0099.00 04:16:47 PM0.000.0018.009.00 04:16:48 PM0.000.005.006.00 04:16:49 PM0.000.001.001.00 04:16:50 PM0.001.004.004.00 04:16:51 PM0.003.00171.00243.00 ^C12345678910111213
檢測的列:
-
active/s: Number of locally-initiated TCP connections per second (e.g., via connect()),發起的網路連線數量;
-
passive/s: Number of remotely-initiated TCP connections per second (e.g., via accept()),接收的網路連線數量;
-
retrans/s: Number of TCP retransmits per second,重傳的數量;
10. top
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 USERPRNIVIRTRESSHR S%CPU %MEMTIME+ COMMAND 20248 root2000.227t 0.012t18748 S30905.229812:58 java 4213 root200 27225446464044232 S23.50.0 233:35.37 mesos-slave 66128 titancl+2002434423321172 R1.00.00:00.07 top 5235 root200 38.227g 54700449996 S0.70.22:02.74 java 4299 root200 20.015g 2.682g16836 S0.31.133:14.42 java 1 root2003362029201496 S0.00.00:03.82 init 2 root200000 S0.00.00:00.02 kthreadd 3 root200000 S0.00.00:05.35 ksoftirqd/0 5 root0 -20000 S0.00.00:00.00 kworker/0:0H 6 root200000 S0.00.00:06.94 kworker/u256:0 8 root200000 S0.00.02:38.05 rcu_sched12345678910111213141516171819
11. 總結
下面的圖片很好的展示了各個命令的主要作用,如使用vmstat檢視系統的整體效能,mpstat用於檢視cpu的效能,pidstat用於檢視程序的狀態,iostat用於檢視io的狀態,free用於產看記憶體的狀態,sar用於產看網路的狀態等。

原文釋出時間為:2018-09-17 本文作者: 良許Linux 本文來自雲棲社群合作伙伴“ 良許Linux ”,瞭解相關資訊可以關注“ 良許Linux ”。