Linux性能檢測常用的10個基本命令
本文的內(nèi)容主要來自對Netflix的一篇技術(shù)博客( 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后的數(shù)字分別表示計算機在1min、5min、15min內(nèi)的平均負載。
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
打印內(nèi)核環(huán)形緩存區(qū)中的內(nèi)容,可以用來查看一些錯誤;
上面的例子中,顯示進程18694 因引內(nèi)存越界被kill掉以及TCP request被丟棄的錯誤。通過dmesg可以快速判斷是否有導致系統(tǒng)性能異常的問題。
3. 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
- ^C123456789
打印進程、內(nèi)存、交換分區(qū)、IO和CPU等的統(tǒng)計信息;
vmstat的格式如下
- > vmstat [options] [delay [count]]
vmstat***次輸出表示從開機到vmstat運行時的平均值;剩余輸出的都是在指定的時間間隔內(nèi)的平均值,上述例子中delay的值設(shè)置為1,除***次以外,剩余的都是1秒統(tǒng)計一次,count未設(shè)置,將會一直循環(huán)打印。
- $ vmstat 10 3
- procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
- r b swpd free buff cache si so bi bo in cs us sy id wa st
- 1 0 0 2527112 1086888 13720228 0 0 1 14 2 1 1 1 99 0 0
- 0 0 0 2527156 1086888 13719856 0 0 0 104 3003 4901 0 0 99 0 0
- 0 0 0 2526412 1086888 13719904 0 0 0 10 3345 4870 0 1 99 0 0123456
上述的例子中delay設(shè)置為10,count設(shè)置為3,表示每行打印10秒內(nèi)的平均值,只打印3次。
需要檢查的列
- r:表示正在運行或者等待CPU調(diào)度的進程數(shù)。因為該列數(shù)據(jù)不包含I/O的統(tǒng)計信息,因此可以用來檢測CPU是否飽和。若r列中的數(shù)字大于CPU的核數(shù),表示CPU已經(jīng)處于飽和狀態(tài)。
- free:當前剩余的內(nèi)存;
- si, so:交換分區(qū)換入和換出的個數(shù),若換入換出個數(shù)大于0,表示內(nèi)存不足;
- us, sy, id, wa:CPU的統(tǒng)計信息,分別表示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 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
- 04:03:55 PM all 3.67 0.00 0.61 0.71 0.00 0.00 0.00 0.00 0.00 95.02
- 04:03:55 PM 0 3.52 0.00 0.57 0.76 0.00 0.00 0.00 0.00 0.00 95.15
- 04:03:55 PM 1 3.83 0.00 0.61 0.71 0.00 0.00 0.00 0.00 0.00 94.85
- 04:03:55 PM 2 3.80 0.00 0.61 0.60 0.00 0.00 0.00 0.00 0.00 94.99
- 04:03:55 PM 3 3.68 0.00 0.58 0.60 0.00 0.00 0.00 0.00 0.00 95.13
- 04:03:55 PM 4 3.54 0.00 0.57 0.60 0.00 0.00 0.00 0.00 0.00 95.30
- [...]1234567891011
該命令用于每秒打印一次每個CPU的統(tǒng)計信息,可用于查看CPU的調(diào)度是否均勻。
5. 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
- ^C123456789101112131415161718
該命令用于打印各個進程對CPU的占用情況,類似top命令中顯示的內(nèi)容。pidstat的優(yōu)勢在于,可以滾動的打印進程運行情況,而不像top那樣會清屏。
上述例子中,%CPU中兩個java進程的cpu利用率分別達到了1590%和1573%,表示java進程占用了16顆CPU。
6. iostat -xz 1
類似vmstat,***次輸出的是從系統(tǒng)開機到統(tǒng)計這段時間的采樣數(shù)據(jù);
- $ 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
- [...]
- ^C123456789101112131415
檢查列
- r/s, w/s, rkB/s, wkB/s,表示每秒向I/O設(shè)備發(fā)出的reads、writes、read Kbytes、write Kbytes的數(shù)量。
- await,表示應用程序排隊等待和被服務的平均I/O時間,該值若大于預期的時間,這表示I/O設(shè)備處于飽和狀態(tài)或者異常。
- avgqu-sz,表示請求被發(fā)送給I/O設(shè)備的平均時間,若該值大于1,則表示I/O設(shè)備可能已經(jīng)飽和;
- %util,每秒設(shè)備的利用率;若該利用率超過60%,則表示設(shè)備出現(xiàn)性能異常;
7. free -m
- $ free -m
- total used free shared buffers cached
- Mem: 245998 24545 221453 83 59 541
- -/+ buffers/cache: 23944 222053
- Swap: 0 0 012345
檢查的列:
- 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的使用率過高,系統(tǒng)存在性能問題。
Linux中會用free內(nèi)存作為cache,若應用程序需要分配內(nèi)存,系統(tǒng)能夠快速的將cache占用的內(nèi)存回收,因此free的內(nèi)存包含cache占用的部分。
8. sar -n DEV 1
sar是System Activity Reporter的縮寫,系統(tǒng)活動狀態(tài)報告。
-n { keyword [,…] | ALL },用于報告網(wǎng)絡統(tǒng)計數(shù)據(jù)。keyword可以是以下的一個或者多個: DEV, EDEV, NFS, NFSD, SOCK, IP, EIP, ICMP, EICMP, TCP, ETCP, UDP, SOCK6, IP6, EIP6, ICMP6, EICMP6 和UDP6。
-n DEV 1, 每秒統(tǒng)計一次網(wǎng)絡的使用情況;
-n EDEV 1,每秒統(tǒng)計一次錯誤的網(wǎng)絡信息;
- $ sar -n DEV 1
- Linux 3.10.0-229.el7.x86_64 (localhost.localdomain) 05/31/2018 _x86_64_ (16 CPU)
- 03:54:57 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 03:54:58 PM ens32 3286.00 7207.00 283.34 18333.90 0.00 0.00 0.00
- 03:54:58 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 03:54:58 PM vethe915e51 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 03:54:58 PM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 03:54:58 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
- 03:54:59 PM ens32 3304.00 7362.00 276.89 18898.51 0.00 0.00 0.00
- 03:54:59 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 03:54:59 PM vethe915e51 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- 03:54:59 PM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- ^C123456789101112131415
- IFACE ,網(wǎng)絡接口名稱;
- rxpck/s ,每秒接收到包數(shù);
- txpck/s ,每秒傳輸?shù)膱髷?shù);(transmit packages)
- rxkB/s ,每秒接收的千字節(jié)數(shù);
- txkB/s ,每秒發(fā)送的千字節(jié)數(shù);
- rxcmp/s ,每秒接收的壓縮包的數(shù)量;
- txcmp/s ,每秒發(fā)送的壓縮包的數(shù)量;
- rxmcst/s,每秒接收的組數(shù)據(jù)包數(shù)量;
9. sar -n TCP,ETCP 1
該命令可以用于粗略的判斷網(wǎng)絡的吞吐量,如發(fā)起的網(wǎng)絡連接數(shù)量和接收的網(wǎng)絡連接數(shù)量;
- TCP, 報告關(guān)于TCPv4網(wǎng)絡流量的統(tǒng)計信息;
- ETCP, 報告有關(guān)TCPv4網(wǎng)絡錯誤的統(tǒng)計信息;
- $ 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 PM active/s passive/s iseg/s oseg/s
- 04:16:44 PM 0.00 2.00 15.00 13.00
- 04:16:45 PM 0.00 3.00 126.00 203.00
- 04:16:46 PM 0.00 0.00 99.00 99.00
- 04:16:47 PM 0.00 0.00 18.00 9.00
- 04:16:48 PM 0.00 0.00 5.00 6.00
- 04:16:49 PM 0.00 0.00 1.00 1.00
- 04:16:50 PM 0.00 1.00 4.00 4.00
- 04:16:51 PM 0.00 3.00 171.00 243.00
- ^C12345678910111213
檢測的列:
- active/s: Number of locally-initiated TCP connections per second (e.g., via connect()),發(fā)起的網(wǎng)絡連接數(shù)量;
- passive/s: Number of remotely-initiated TCP connections per second (e.g., via accept()),接收的網(wǎng)絡連接數(shù)量;
- retrans/s: Number of TCP retransmits per second,重傳的數(shù)量;
10. top
top命令包含更多的指標統(tǒng)計,相當于一個綜合命令。
- $ 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_sched12345678910111213141516171819
11. 總結(jié)
下面的圖片很好的展示了各個命令的主要作用,如使用vmstat查看系統(tǒng)的整體性能,mpstat用于查看cpu的性能,pidstat用于查看進程的狀態(tài),iostat用于查看io的狀態(tài),free用于產(chǎn)看內(nèi)存的狀態(tài),sar用于產(chǎn)看網(wǎng)絡的狀態(tài)等。
image.png
Linux常用性能工具一覽
Linux Performance Tools
參考
- 性能不好怎么辦?對著清單擼一遍
- Linux Performance Analysis in 60,000 Milliseconds
- Netflix常用性能測試工具視頻教程