摘自 IBM 非原創(chuàng)
簡(jiǎn)單介紹
- 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包提供。
uptime
- 可以快速查看機(jī)器的負(fù)載情況
$ uptime
19:19 up 1 day, 10:12, 5 users, load averages: 2.02 1.97 1.84
在Linux系統(tǒng)中,這些數(shù)據(jù)表示等待CPU資源的進(jìn)程和阻塞在不可中斷IO進(jìn)程(進(jìn)程狀態(tài)為D)的數(shù)量。
這些數(shù)據(jù)可以讓我們對(duì)系統(tǒng)資源使用有一個(gè)宏觀的了解。
- 如果1分鐘平均負(fù)載很高,而15分鐘平均負(fù)載很低,說(shuō)明服務(wù)器正在命令高負(fù)載情況,需要進(jìn)一步排查CPU資源都消耗在了哪里。反之,如果15分鐘平均負(fù)載很高,1分鐘平均負(fù)載較低,則有可能是CPU資源緊張時(shí)刻已經(jīng)過(guò)去。
dmesg | tail
- 輸出系統(tǒng)日志的最后10行
$ 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.
- 可以看見(jiàn)一次內(nèi)核的oom kill和一次TCP丟包。這些日志可以幫助排查性能問(wèn)題。千萬(wàn)不要忘了這一步
vmstat 1
- 每秒輸出一些系統(tǒng)核心指標(biāo),持續(xù)輸出
$ vmstat 1
- 每秒統(tǒng)計(jì) 1 次,總共統(tǒng)計(jì) 10 次
$ vmstat 1 10
介紹一些和性能調(diào)優(yōu)相關(guān)的列
-
r:
等待在CPU資源的進(jìn)程數(shù)。這個(gè)數(shù)據(jù)比平均負(fù)載更加能夠體現(xiàn)CPU負(fù)載情況,數(shù)據(jù)中不包含等待IO的進(jìn)程。如果這個(gè)數(shù)值大于機(jī)器CPU核數(shù),那么機(jī)器的CPU資源已經(jīng)飽和。
-
free:
系統(tǒng)可用內(nèi)存數(shù)(以千字節(jié)為單位),如果剩余內(nèi)存不足,也會(huì)導(dǎo)致系統(tǒng)性能問(wèn)題。下文介紹到的free命令,可以更詳細(xì)的了解系統(tǒng)內(nèi)存的使用情況。
-
si, so:
交換區(qū)寫入和讀取的數(shù)量。如果這個(gè)數(shù)據(jù)不為0,說(shuō)明系統(tǒng)已經(jīng)在使用交換區(qū)(swap),機(jī)器物理內(nèi)存已經(jīng)不足。
-
us, sy, id, wa, st:
這些都代表了CPU時(shí)間的消耗,它們分別表示用戶時(shí)間(user)、系統(tǒng)(內(nèi)核)時(shí)間(sys)、空閑時(shí)間(idle)、IO等待時(shí)間(wait)和被偷走的時(shí)間(stolen,一般被其他虛擬機(jī)消耗)。
上述這些CPU時(shí)間,可以讓我們很快了解CPU是否出于繁忙狀態(tài)。一般情況下,如果用戶時(shí)間和系統(tǒng)時(shí)間相加非常大,CPU出于忙于執(zhí)行指令。如果IO等待時(shí)間很長(zhǎng),那么系統(tǒng)的瓶頸可能在磁盤IO。
mpstat -P ALL 1
- 該命令可以顯示每個(gè)邏輯CPU的占用情況,如果有一個(gè)CPU占用率特別高,那么有可能是一個(gè)單線程應(yīng)用程序引起的。
$ mpstat -P ALL 1
pidstat 1
- pidstat命令輸出進(jìn)程的CPU占用率,該命令會(huì)持續(xù)輸出,并且不會(huì)覆蓋之前的數(shù)據(jù),可以方便觀察系統(tǒng)動(dòng)態(tài)。
$ 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
- 如上的輸出,可以看見(jiàn)兩個(gè)JAVA進(jìn)程占用了將近1600%的CPU時(shí)間,既消耗了大約16個(gè)CPU核心的運(yùn)算資源
iostat -xz 1
- iostat命令主要用于查看機(jī)器磁盤IO情況
$ 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:
分別表示每秒讀寫次數(shù)和每秒讀寫數(shù)據(jù)量(千字節(jié))。讀寫量過(guò)大,可能會(huì)引起性能問(wèn)題。
-
await:
IO操作的平均等待時(shí)間,單位是毫秒。這是應(yīng)用程序在和磁盤交互時(shí),需要消耗的時(shí)間,包括IO等待和實(shí)際操作的耗時(shí)。如果這個(gè)數(shù)值過(guò)大,可能是硬件設(shè)備遇到了瓶頸或者出現(xiàn)故障。
-
avgqu-sz:
向設(shè)備發(fā)出的請(qǐng)求平均數(shù)量。如果這個(gè)數(shù)值大于1,可能是硬件設(shè)備已經(jīng)飽和(部分前端硬件設(shè)備支持并行寫入)。
-
%util:
設(shè)備利用率。這個(gè)數(shù)值表示設(shè)備的繁忙程度,經(jīng)驗(yàn)值是如果超過(guò)60,可能會(huì)影響IO性能(可以參照IO操作平均等待時(shí)間)。如果到達(dá)100%,說(shuō)明硬件設(shè)備已經(jīng)飽和。
如果顯示的是邏輯設(shè)備的數(shù)據(jù),那么設(shè)備利用率不代表后端實(shí)際的硬件設(shè)備已經(jīng)飽和。值得注意的是,即使IO性能不理想,也不一定意味這應(yīng)用程序性能會(huì)不好,可以利用諸如預(yù)讀取、寫緩存等策略提升應(yīng)用性能。
free -m
- 可以查看系統(tǒng)內(nèi)存的使用情況, -m參數(shù)表示按照兆字節(jié)展示
$ free -m
total used free shared buffers cached
Mem: 245998 24545 221453 83 59 541
-/+ buffers/cache: 23944 222053
Swap: 0 0 0
最后兩列分別表示用于IO緩存的內(nèi)存數(shù),和用于文件系統(tǒng)頁(yè)緩存的內(nèi)存數(shù)。需要注意的是,第二行-/+ buffers/cache,看上去緩存占用了大量?jī)?nèi)存空間。這是Linux系統(tǒng)的內(nèi)存使用策略,盡可能的利用內(nèi)存,如果應(yīng)用程序需要內(nèi)存,這部分內(nèi)存會(huì)立即被回收并分配給應(yīng)用程序。因此,這部分內(nèi)存一般也被當(dāng)成是可用內(nèi)存。
- 如果可用內(nèi)存非常少,系統(tǒng)可能會(huì)動(dòng)用交換區(qū)(如果配置了的話),這樣會(huì)增加IO開(kāi)銷(可以在iostat命令中提現(xiàn)),降低系統(tǒng)性能
sar -n DEV 1
- sar命令在這里用于查看TCP連接狀態(tài)
$ 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
字段含義:
-
active/s:
每秒本地發(fā)起的TCP連接數(shù),既通過(guò)connect調(diào)用創(chuàng)建的TCP連接;
-
passive/s:
每秒遠(yuǎn)程發(fā)起的TCP連接數(shù),即通過(guò)accept調(diào)用創(chuàng)建的TCP連接;
-
retrans/s:
每秒TCP重傳數(shù)量;
TCP連接數(shù)可以用來(lái)判斷性能問(wèn)題是否由于建立了過(guò)多的連接,進(jìn)一步可以判斷是主動(dòng)發(fā)起的連接,還是被動(dòng)接受的連接。TCP重傳可能是因?yàn)榫W(wǎng)絡(luò)環(huán)境惡劣,或者服務(wù)器壓力過(guò)大導(dǎo)致丟包。
top
- top命令包含了前面好幾個(gè)命令的檢查的內(nèi)容.
- 比如系統(tǒng)負(fù)載情況(uptime)、系統(tǒng)內(nèi)存使用情況(free)、系統(tǒng)CPU使用情況(vmstat)等。
- 因此通過(guò)這個(gè)命令,可以相對(duì)全面的查看系統(tǒng)負(fù)載的來(lái)源。
- 同時(shí),top命令支持排序,可以按照不同的列排序,方便查找出諸如內(nèi)存占用最多的進(jìn)程、CPU占用率最高的進(jìn)程等。
Processes: 319 total, 2 running, 317 sleeping, 1163 threads 20:19:01
Load Avg: 2.28, 2.05, 1.99 CPU usage: 4.55% user, 6.23% sys, 89.20% idle
SharedLibs: 176M resident, 46M data, 19M linkedit.
MemRegions: 46532 total, 2652M resident, 126M private, 839M shared.
PhysMem: 7048M used (1197M wired), 1141M unused.
VM: 857G vsize, 627M framework vsize, 108522(0) swapins, 131439(0) swapouts.
Networks: packets: 1105387/1215M in, 785149/77M out.
Disks: 479919/31G read, 404844/49G written.
PID COMMAND %CPU TIME #TH #WQ #PORT MEM PURG CMPRS PGRP PPID
56978 top 4.0 00:00.53 1/1 0 20 2544K 0B 0B 56978 51030
56975 quicklookd 0.0 00:00.09 4 1 88 4256K 32K 0B 56975 1
56720 mdworker 0.0 00:00.07 3 1 49 3032K 0B 0B 56720 1
56719 mdworker 0.0 00:00.06 3 1 49 2936K 0B 0B 56719 1
56677 Google Chrom 0.2 01:17.58 20 2 162 99M 0B 0B 435 435
56664 ocspd 0.0 00:00.02 2 1 35 1612K 0B 0B 56664 1
56340 com.apple.Co 0.0 00:00.06 2 2 38 400K 0B 2464K 56340 1
56317 netbiosd 0.0 00:00.06 2 2 30 1036K 0B 1480K 56317 1
56147 com.apple.sp 0.0 00:00.04 2 1 48 336K 0B 2032K 56147 1
56107 mdworker 0.0 00:00.18 3 1 58 3216K 0B 1876K 56107 1
56093 MTLCompilerS 0.0 00:00.09 2 2 32 11M 0B 8192B 56093 1
56072 mdworker 0.0 00:02.51 4 1 47 12M 0B 676K 56072 1
56071 mdworker 0.0 00:02.52 4 1 47 14M 0B 428K 56071 1
56070 mdworker 0.0 00:02.79 4 1 54 15M 0B 2140K 56070 1
-但是,top命令相對(duì)于前面一些命令,輸出是一個(gè)瞬間值,如果不持續(xù)盯著,可能會(huì)錯(cuò)過(guò)一些線索。這時(shí)可能需要暫停top命令刷新,來(lái)記錄和比對(duì)數(shù)據(jù)。
總結(jié)
排查系統(tǒng)性能的命令其實(shí)還有很多工具,這里就不多做介紹了,因?yàn)槲沂煜さ囊簿瓦@么幾個(gè)哈哈。