前言
如果性能測(cè)試的目標(biāo)服務(wù)器是linux系統(tǒng),在如何使用linux自帶的命令來(lái)實(shí)現(xiàn)性能測(cè)試過(guò)程的監(jiān)控分析呢?
對(duì)于日常性能測(cè)試來(lái)講,在linux下或是類(lèi)Unix系統(tǒng),我們必須掌握以下常用的指標(biāo)查看命令。
- ps
- pstree
- top
- free
- vmstat
- iostat
- iotop
- sar
當(dāng)然還有其他命令,這里就上述筆者常用的命令推薦大家掌握。
ps
ps命令能給出當(dāng)前系統(tǒng)中進(jìn)程的快照。下面我們列舉幾個(gè)常用的選項(xiàng),對(duì)于其他的請(qǐng)參考官方文檔或是自行搜索相關(guān)文檔。
- 使用 -a 參數(shù)。-a 代表 all。同時(shí)加上x(chóng)參數(shù)會(huì)顯示沒(méi)有控制終端的進(jìn)程。
ps -ax
- 通過(guò)我們會(huì)查找某類(lèi)或包含某些指定關(guān)鍵字的進(jìn)程,這是會(huì)使用管道結(jié)合grep命令來(lái)進(jìn)一步過(guò)濾結(jié)果。
例如查找java相關(guān)的進(jìn)程
ps -ax | grep java
- 有時(shí)我們則需要根據(jù)CPU和內(nèi)存的使用情況來(lái)過(guò)濾排序篩選結(jié)果,這樣便于快速找到哪個(gè)進(jìn)程最耗CPU、內(nèi)存
ps -aux
- 根據(jù)CPU的使用升序排序
ps -aux --sort -pcpu
- 根據(jù)內(nèi)存使用升序排序
ps -aux --sort -pmem
- 上述兩個(gè)命令合并一起,如下:
ps -aux --sort -pcpu,+pmem
- 只顯示前幾個(gè)進(jìn)程,例如顯示前十個(gè),需要使用管道結(jié)合head命令。
ps -aux | head -n 10
還有很多用法,這里就不做過(guò)多的列舉。
pstree
pstree命令以樹(shù)狀圖顯示進(jìn)程間的關(guān)系。
下面我們看幾個(gè)常用的示例。
- 以樹(shù)狀圖顯示進(jìn)程,只顯示進(jìn)程的名字,且相同進(jìn)程合并顯示。
pstree
- 以樹(shù)狀圖顯示進(jìn)程,還顯示進(jìn)程PID。
pstree -p
- 以樹(shù)狀圖顯示進(jìn)程PID為<pid>的進(jìn)程以及子孫進(jìn)程,如果有-p參數(shù)則同時(shí)顯示每個(gè)進(jìn)程的PID。
pstree <pid>
或
pstree -p <pid>
- 以樹(shù)狀圖顯示進(jìn)程,相同名稱(chēng)的進(jìn)程不合并顯示,并且會(huì)顯示命令行參數(shù),如果有-p參數(shù)則同時(shí)顯示每個(gè)進(jìn)程的PID。
pstree -a
為什么要用pstree命令,通過(guò)該命令,能讓你更清晰的了解你要監(jiān)控的目標(biāo)服務(wù)關(guān)聯(lián)了哪些資源,能讓你更加清楚其資源關(guān)聯(lián)情況,增加在性能測(cè)試過(guò)程中分析的準(zhǔn)確性。
不管是ps還是pstree命令,在性能測(cè)試過(guò)程中,最重要的一個(gè)應(yīng)用技巧就是獲取資源消耗最高的目標(biāo)進(jìn)程的線(xiàn)程id。例如:
ps -mp <pid> -o HTREAD
或
ps -Lfp <pid>
<pid> 為目標(biāo)進(jìn)程id
在找到其線(xiàn)程id后就可以使用
printf "%x\n" 線(xiàn)程id
轉(zhuǎn)換成十六進(jìn)制數(shù)
然后結(jié)合jstack命令,獲取其堆棧信息以供分析。
top
top命令是Linux下常用的性能分析工具,能夠?qū)崟r(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的資源占用狀況,類(lèi)似于Windows的任務(wù)管理器。
與ps不同的是,top顯示系統(tǒng)當(dāng)前的進(jìn)程和其他狀況,是一個(gè)動(dòng)態(tài)顯示過(guò)程,即可以通過(guò)用戶(hù)按鍵來(lái)不斷刷新當(dāng)前狀態(tài)。
直接使用即可
top
常規(guī)情況下主要關(guān)注以下指標(biāo):
- load average: 0.02, 0.10, 0.13 系統(tǒng)負(fù)載,即任務(wù)隊(duì)列的平均長(zhǎng)度。三個(gè)數(shù)值分別為 1分鐘、5分鐘、15分鐘前到現(xiàn)在的平均值。
- total 進(jìn)程總數(shù)
- running 正在運(yùn)行的進(jìn)程數(shù)
- sleeping 睡眠的進(jìn)程數(shù)
- stopped 停止的進(jìn)程數(shù)
- zombie 僵尸進(jìn)程數(shù)
Cpu(s):
- us 用戶(hù)空間占用CPU百分比
- sy 內(nèi)核空間占用CPU百分比
- id 空閑CPU百分比
Mem:
- total 物理內(nèi)存總量
- used 使用的物理內(nèi)存總量
- free 空閑內(nèi)存總量
- buffers 用作內(nèi)核緩存的內(nèi)存量
對(duì)于進(jìn)程詳細(xì)的表頭重點(diǎn)關(guān)注:
PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。
具體含義不做說(shuō)明了。
另外常用的top命令選項(xiàng)如下:
top 每隔5秒顯式所有進(jìn)程的資源占用情況
top -d 2 每隔2秒顯式所有進(jìn)程的資源占用情況
top -c 每隔5秒顯式進(jìn)程的資源占用情況,并顯示進(jìn)程的命令行參數(shù)(默認(rèn)只有進(jìn)程名)
top -p <pid1> -p <pid2> 每隔5秒顯示pid是pid1和pid是pid2的兩個(gè)進(jìn)程的資源占用情況
top -d 2 -c -p <pid> 每隔2秒顯示pid是pid的進(jìn)程的資源使用情況,并顯式該進(jìn)程啟動(dòng)的命令行參數(shù)
free
查看內(nèi)存情況,將used的值減去buffer和cache的值就是你當(dāng)前真實(shí)內(nèi)存使用。
Mem:表示物理內(nèi)存統(tǒng)計(jì)
- total:表示物理內(nèi)存總量(total = used + free)
- used:表示總計(jì)分配給緩存(包含buffers 與cache )使用的數(shù)量,但其中可能部分緩存并未實(shí)際使用。
- free:未被分配的內(nèi)存。
- shared:共享內(nèi)存,一般系統(tǒng)不會(huì)用到。
- buffers:系統(tǒng)分配但未被使用的buffers 數(shù)量。
- cached:系統(tǒng)分配但未被使用的cache 數(shù)量。
-/+ buffers/cache:表示物理內(nèi)存的緩存統(tǒng)計(jì)
- used:也就是第一行中的used – buffers-cached 也是實(shí)際使用的內(nèi)存總量。
- Swap:表示硬盤(pán)上交換分區(qū)的使用情況,這里我們不做關(guān)注。
但對(duì)于應(yīng)用程序來(lái)說(shuō),buffers/cached 是等于可用的,因?yàn)閎uffer/cached是為了提高文件讀取的性能,當(dāng)應(yīng)用程序需在用到內(nèi)存的時(shí)候,buffer/cached會(huì)很快地被回收。
所以從應(yīng)用程序的角度來(lái)說(shuō) 可用內(nèi)存=系統(tǒng)free memory+buffers+cached.
buffers是指用來(lái)給塊設(shè)備做的緩沖大小,只記錄文件系統(tǒng)的metadata以及 tracking in-flight pages.
cached是用來(lái)給文件做緩沖。
使用free命令,能讓你清楚的了解當(dāng)前系統(tǒng)內(nèi)存消耗情況。
vmstat
vmstat命令是最常見(jiàn)的Linux/Unix監(jiān)控工具,可以展現(xiàn)給定時(shí)間間隔的服務(wù)器的狀態(tài)值,包括服務(wù)器的CPU使用率,內(nèi)存使用,虛擬內(nèi)存交換情況,IO讀寫(xiě)情況。
相比于top、free等命令,vmstat可以看到整個(gè)機(jī)器的CPU,內(nèi)存,IO的消耗情況。
一般情況下vmstat工具的使用是通過(guò)兩個(gè)數(shù)字參數(shù)來(lái)完成的,第一個(gè)參數(shù)是采樣的時(shí)間間隔數(shù),單位是秒,第二個(gè)參數(shù)是采樣的次數(shù),如下命令:
vmstat 2 1
2表示每個(gè)兩秒采集一次服務(wù)器狀態(tài),1表示只采集一次。
==這個(gè)命令是做性能測(cè)試進(jìn)一步診斷分析必須掌握的的==
下面我們對(duì)其進(jìn)行更詳細(xì)的說(shuō)明:
procs
- r列 顯示運(yùn)行和等待CPU時(shí)間片的進(jìn)程數(shù),若其值長(zhǎng)時(shí)間大于系統(tǒng)CPU個(gè)數(shù),就說(shuō)明CPU資源可能不足,可以考慮增加CPU;
- b列 顯示在等待資源的進(jìn)程數(shù),比如正在等待I/O或者內(nèi)存交換等。
memory
- swpd列 顯示切換到內(nèi)存交換區(qū)的內(nèi)存數(shù)量(以KB為單位)。若swpd的值不為0或者比較大,同時(shí)si、so的值長(zhǎng)時(shí)間為0,那這種情況一般不用擔(dān)心,不會(huì)影響系統(tǒng)性能
- free列 顯示當(dāng)前空閑的物理內(nèi)存數(shù)量(以KB為單位)
- buff列 顯示buffers cache的內(nèi)存數(shù)量,一般對(duì)塊設(shè)備的讀寫(xiě)才需要緩沖
- cache列 顯示page cached的內(nèi)存數(shù)量,一般作文件系統(tǒng)的cached,頻繁訪(fǎng)問(wèn)的文件都會(huì)被cached。如果cached值較大,就說(shuō)明cached文件數(shù)較多。如果此時(shí)IO中的bi比較小,就說(shuō)明文件系統(tǒng)效率比較好
swap
- si列 顯示由磁盤(pán)調(diào)入內(nèi)存,也就是內(nèi)存進(jìn)入內(nèi)存交換區(qū)的數(shù)量
- so列 顯示由內(nèi)存調(diào)入磁盤(pán),也就是內(nèi)存交換區(qū)進(jìn)入內(nèi)存的數(shù)量
==一般情況下,si、so的值都為0,如果si、so的值長(zhǎng)時(shí)間不為0,則表示系統(tǒng)內(nèi)存不足,需要考慮是否增加系統(tǒng)內(nèi)存。==
IO
- bi列 顯示從塊設(shè)備讀入的數(shù)據(jù)總量(即讀磁盤(pán),單位KB/秒)
- bo列 顯示寫(xiě)入到塊設(shè)備的數(shù)據(jù)總量(即寫(xiě)磁盤(pán),單位KB/秒)
==這里設(shè)置的bi+bo參考值為1000,如果超過(guò)1000,而且wa值比較大,則表示系統(tǒng)磁盤(pán)IO性能瓶頸。==
system
- in列表示在某一時(shí)間間隔中觀察到的每秒設(shè)備中斷數(shù)
- cs列表示每秒產(chǎn)生的上下文切換次數(shù)
==上面這兩個(gè)值越大,會(huì)看到內(nèi)核消耗的CPU時(shí)間就越多,這個(gè)時(shí)候可能要考慮下為何內(nèi)核的消耗會(huì)這么大,有可能有瓶頸存在。==
CPU
- us列 顯示了用戶(hù)進(jìn)程消耗CPU的時(shí)間百分比。us的值比較高時(shí),說(shuō)明用戶(hù)進(jìn)程消耗的CPU時(shí)間多,如果長(zhǎng)期大于50%,需要考慮優(yōu)化程序啥的。
- sy列顯示了內(nèi)核進(jìn)程消耗CPU的時(shí)間百分比。sy的值比較高時(shí),就說(shuō)明內(nèi)核消耗的CPU時(shí)間多;如果us+sy超過(guò)80%,就說(shuō)明CPU的資源存在不足。
- id列 顯示了CPU處在空閑狀態(tài)的時(shí)間百分比
- wa列 顯示IO等待所占的CPU時(shí)間百分比。wa值越高,說(shuō)明IO等待越嚴(yán)重。如果wa值超過(guò)20%,說(shuō)明IO等待嚴(yán)重
- st列 虛擬機(jī)占用的時(shí)間百分比。
sar
sar(System Activity Reporter系統(tǒng)活動(dòng)情況報(bào)告)是目前 Linux 上最為全面的系統(tǒng)性能分析工具之一,可以從多方面對(duì)系統(tǒng)的活動(dòng)進(jìn)行報(bào)告,包括:文件的讀寫(xiě)情況、系統(tǒng)調(diào)用的使用情況、磁盤(pán)I/O、CPU效率、內(nèi)存使用狀況、進(jìn)程活動(dòng)及IPC有關(guān)的活動(dòng)等。
如果你的系統(tǒng)沒(méi)安裝該命令,請(qǐng)用以下方式進(jìn)行安裝
apt-get install sysstat
yum install sysstat
安裝完成后在用以下命令啟用:
vi /etc/default/sysstat
將ENABLED改為“true”
ENABLED="true"
重啟下sar服務(wù),開(kāi)始采集相關(guān)數(shù)據(jù)
/etc/init.d/sysstat start
- 命令常用格式
sar [options] [-A] [-o file] t [n]
其中:
t為采樣間隔,n為采樣次數(shù),默認(rèn)值是1;
-o file表示將命令結(jié)果以二進(jìn)制格式存放在文件中,file 是文件名。
options 為命令行選項(xiàng),sar命令常用選項(xiàng)如下:
- sar參數(shù)說(shuō)明
-A 查看匯總所有的報(bào)告
-a 查看文件讀寫(xiě)使用情況
-B 查看附加的緩存的使用情況
-b 查看緩存的使用情況
-c 查看系統(tǒng)調(diào)用的使用情況
-d 查看磁盤(pán)的使用情況
-g 查看串口的使用情況
-h 查看關(guān)于buffer使用的統(tǒng)計(jì)數(shù)據(jù)
-m 查看IPC消息隊(duì)列和信號(hào)量的使用情況
-n 查看命名cache的使用情況
-p 查看調(diào)頁(yè)活動(dòng)的使用情況
-q 查看運(yùn)行隊(duì)列和交換隊(duì)列的平均長(zhǎng)度
-R 查看進(jìn)程的活動(dòng)情況
-r 查看沒(méi)有使用的內(nèi)存頁(yè)面和硬盤(pán)塊
-u 查看CPU的利用率
-v 查看進(jìn)程、文件和鎖表狀態(tài)
-w 查看系統(tǒng)交換活動(dòng)狀況
-y 查看TTY設(shè)備活動(dòng)狀況
- 查看CPU是否存在瓶頸:
sar -u
sar -q
- 查看內(nèi)存是否存在瓶頸:
sar -B
sar -r
sar -W
- 查看IO是否存在瓶頸
sar -b
sar -u
sar -d
- 示例
例如,每10秒采樣一次,連續(xù)采樣3次,觀察CPU 的使用情況,并將采樣結(jié)果以二進(jìn)制形式存入當(dāng)前目錄下的文件cpu_info中,需鍵入如下命令:
sar -u -o cpu_info 10 3
iostat
iostat主要用于監(jiān)控系統(tǒng)設(shè)備的IO負(fù)載情況,iostat首次運(yùn)行時(shí)顯示自系統(tǒng)啟動(dòng)開(kāi)始的各項(xiàng)統(tǒng)計(jì)信息,之后運(yùn)行iostat將顯示自上次運(yùn)行該命令以后的統(tǒng)計(jì)信息。用戶(hù)可以通過(guò)指定統(tǒng)計(jì)的次數(shù)和時(shí)間來(lái)獲得所需的統(tǒng)計(jì)信息。
iotop
如果你想知道每個(gè)進(jìn)程是如何使用IO的就比較麻煩。這個(gè)時(shí)候iotop可以上場(chǎng)了。
iotop 是一個(gè)用來(lái)監(jiān)視磁盤(pán) I/O 使用狀況的 top 類(lèi)工具。iotop 具有與 top 相似的 UI,其中包括 PID、用戶(hù)、I/O、進(jìn)程等相關(guān)信息。
其他命令
mpstat、netstat、pidstat也是常用的,大家看相關(guān)手冊(cè)學(xué)習(xí)。這里不再進(jìn)行說(shuō)明
總結(jié)
linux的監(jiān)控篇就分享這些,vmstat、sar必須掌握,至于top、free等簡(jiǎn)單命令,是基本的了,肯定是也要掌握的。不管怎么樣,對(duì)于這些命令還是要多練習(xí),多去把各個(gè)命令選項(xiàng)都用用,看看實(shí)際的輸出,對(duì)分析下各個(gè)指標(biāo)間的關(guān)系。