本文的內(nèi)容主要來自對Netflix的一篇技術(shù)博客( Linux Performance Analysis in 60,000 Milliseconds(可能需要翻墻才能訪問) )泽论,并添加了一些自己的理解逾苫,僅供參考呜袁。
一但壮、常用檢測性能的10個基本命令
1. uptime
$ uptime
23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02
該命令可以大致的看出計算機(jī)的整體負(fù)載情況,load average后的數(shù)字分別表示計算機(jī)在1min、5min、15min內(nèi)的平均負(fù)載。
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.
打印內(nèi)核環(huán)形緩存區(qū)中的內(nèi)容扫俺,可以用來查看一些錯誤;
上面的例子中固翰,顯示進(jìn)程18694 因引內(nèi)存越界被kill掉以及TCP request被丟棄的錯誤狼纬。通過dmesg可以快速判斷是否有導(dǎo)致系統(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
^C
打印進(jìn)程、內(nèi)存疗琉、交換分區(qū)冈欢、IO和CPU等的統(tǒng)計信息;
vmstat的格式如下
vmstat [options] [delay [count]]
vmstat第一次輸出表示從開機(jī)到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 0
上述的例子中delay設(shè)置為10邻吭,count設(shè)置為3,表示每行打印10秒內(nèi)的平均值宴霸,只打印3次囱晴。
需要檢查的列
- r:表示正在運行或者等待CPU調(diào)度的進(jìn)程數(shù)。因為該列數(shù)據(jù)不包含I/O的統(tǒng)計信息猖败,因此可以用來檢測CPU是否飽和速缆。若r列中的數(shù)字大于CPU的核數(shù)降允,表示CPU已經(jīng)處于飽和狀態(tài)恩闻。
- free:當(dāng)前剩余的內(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
[...]
該命令用于每秒打印一次每個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
^C
該命令用于打印各個進(jìn)程對CPU的占用情況础倍,類似top命令中顯示的內(nèi)容。pidstat的優(yōu)勢在于胎挎,可以滾動的打印進(jìn)程運行情況沟启,而不像top那樣會清屏忆家。
上述例子中,%CPU中兩個java進(jìn)程的cpu利用率分別達(dá)到了1590%和1573%德迹,表示java進(jìn)程占用了16顆CPU芽卿。
6. iostat -xz 1
類似vmstat,第一次輸出的是從系統(tǒng)開機(jī)到統(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
[...]
^C
檢查列
- r/s, w/s, rkB/s, wkB/s蹬竖,表示每秒向I/O設(shè)備發(fā)出的reads、writes流酬、read Kbytes币厕、write Kbytes的數(shù)量。
- await芽腾,表示應(yīng)用程序排隊等待和被服務(wù)的平均I/O時間沐寺,該值若大于預(yù)期的時間扒袖,這表示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 0
檢查的列:
- 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,若應(yīng)用程序需要分配內(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)絡(luò)統(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)絡(luò)的使用情況;
-n EDEV 1强岸,每秒統(tǒng)計一次錯誤的網(wǎng)絡(luò)信息锻弓;
$ 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
^C
- IFACE ,網(wǎng)絡(luò)接口名稱蝌箍;
- 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)絡(luò)的吞吐量,如發(fā)起的網(wǎng)絡(luò)連接數(shù)量和接收的網(wǎng)絡(luò)連接數(shù)量沛婴;
- TCP, 報告關(guān)于TCPv4網(wǎng)絡(luò)流量的統(tǒng)計信息;
- ETCP, 報告有關(guān)TCPv4網(wǎng)絡(luò)錯誤的統(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
^C
檢測的列:
- active/s: Number of locally-initiated TCP connections per second (e.g., via connect())吼畏,發(fā)起的網(wǎng)絡(luò)連接數(shù)量;
- passive/s: Number of remotely-initiated TCP connections per second (e.g., via accept())嘁灯,接收的網(wǎng)絡(luò)連接數(shù)量泻蚊;
- retrans/s: Number of TCP retransmits per second,重傳的數(shù)量丑婿;
10. top
top命令包含更多的指標(biāo)統(tǒng)計性雄,相當(dā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_sched
11. 總結(jié)
下面的圖片很好的展示了各個命令的主要作用枯冈,如使用vmstat查看系統(tǒng)的整體性能毅贮,mpstat用于查看cpu的性能办悟,pidstat用于查看進(jìn)程的狀態(tài)尘奏,iostat用于查看io的狀態(tài),free用于產(chǎn)看內(nèi)存的狀態(tài)病蛉,sar用于產(chǎn)看網(wǎng)絡(luò)的狀態(tài)等炫加。