濟南快速建站模板網(wǎng)站結(jié)構(gòu)優(yōu)化的內(nèi)容和方法
tcpdump是一款經(jīng)典的抓包工具,即使今天我們已經(jīng)有了像Wireshark這樣更易于使用和掌握的抓包工具,tcpdump仍是網(wǎng)絡程序員的必備利器。
tcpdump提供了一些選項用以過濾數(shù)據(jù)包或定制輸出格式,常見的選項如下:
1.-n:使用IP地址表示主機,而非主機名;使用數(shù)字表示端口號,而非服務名。
2.-i:指定要監(jiān)聽的網(wǎng)卡接口。-i any表示抓取所有網(wǎng)卡接口上的數(shù)據(jù)包。
3.-v:輸出更詳細的信息,如顯式IP數(shù)據(jù)包中的TTL和TOS信息。
4.-t:不打印時間戳。
5.-e:顯示以太網(wǎng)幀頭部信息。
6.-c:僅抓取指定數(shù)量的數(shù)據(jù)包。
7.-x:以十六進制數(shù)顯示數(shù)據(jù)包的內(nèi)容,但不顯示包中以太網(wǎng)幀的頭部信息。
8.-X:與7類似,但還打印每個十六進制字節(jié)對應的ASCII字符。
9.-XX:與8類型,但還打印以太網(wǎng)幀的頭部信息。
10.-s:設置抓包時的抓取長度,當數(shù)據(jù)包的長度超過抓取長度時,tcpdump抓取到的是被截斷的數(shù)據(jù)包。在4.0及之前的版本中,默認的抓包長度是68字節(jié),這對于IP、TCP、UDP等協(xié)議時足夠的,但對于DNS、NFS等協(xié)議,68字節(jié)通常不能容納一個完整的數(shù)據(jù)包。4.0版本后,默認的抓包長度被修改為65535字節(jié)。
11.-S:以絕對值來顯示TCP報文段的需要,而非相對值。
12.-w:將tcpdump的輸出以某種格式定向到某個文件。
13.-r:從文件讀取數(shù)據(jù)包信息并顯示之。
除了使用選項外,tcpdump還支持用表達式進一步過濾數(shù)據(jù)包,tcpdump表示式的操作數(shù)分為3種:
1.類型:解釋其后面跟著的參數(shù)的含義,其可選值包括host、net、port、portrange,它們分別指定主機名(或IP地址)、用CIDR方法表示的網(wǎng)絡地址、端口號、端口范圍。如要抓取整個1.2.3.0/255.255.255.0網(wǎng)絡上的數(shù)據(jù)包,可用以下命令:
2.方向:其可選值為src(指定數(shù)據(jù)包的發(fā)送端)、dst(指定數(shù)據(jù)包的目的端)。如要抓取進入端口13579的數(shù)據(jù)包,可用以下命令:
3.協(xié)議:指定目標協(xié)議,如要抓取所有ICMP數(shù)據(jù)包,可用以下命令:
我們還可使用邏輯操作符來組織上述操作數(shù)以創(chuàng)建更復雜的表達式,tcpdump支持的邏輯操作符和編程語言中的邏輯操作符完全相同,包括and(&&)、or(||)、not(!)。如要抓取主機ernest-laptop和所有非Kongming20的主機之間交換的IP數(shù)據(jù)包,可用以下命令:
如果表達式比較復雜,我們可以用括號將它們分組,但在使用括號時,我們要么用反斜杠\
對它轉(zhuǎn)義,要么使用單引號'
將其括住,以避免它被shell所解釋。如要抓取來自主機10.0.2.4,目標端口是3389或22的數(shù)據(jù)包,可使用如下命令:
tcpdump還允許直接使用數(shù)據(jù)包中的部分協(xié)議字段的內(nèi)容來過濾數(shù)據(jù)包,如僅抓取TCP同步報文段,可使用如下命令:
這是因為TCP頭部的第14個字節(jié)的第2個位是同步標志,該命令也可表示為:
tcpdump的具體輸出格式除了與選項有關外,還與協(xié)議有關,具體可參考tcpdump的man手冊。
lsof(list open file)命令是一個列出當前系統(tǒng)打開的文件描述符的工具,通過它我們可以了解感興趣的進程打開了哪些文件描述符,或者我們感興趣的文件描述符被哪些進程打開了。
lsof命令常用的選項:
1.-i:顯示socket文件描述符,該選項的使用方法是:
其中,4表示IPv4協(xié)議,6表示IPv6協(xié)議;protocol指定傳輸層協(xié)議,可以是TCP或UDP;hostname指定主機名;ipaddr指定主機的IP地址;service指定服務名;port指定端口號。如要顯示所有連接到主機192.168.1.108的ssh服務的socket文件描述符,可用以下命令:
如果-i后不跟任何參數(shù),則lsof命令將顯示所有socket文件描述符。
2.-u:顯示指定用戶啟動的所有進程打開的所有文件描述符。
3.-c:顯示指定的命令打開的所有文件描述符,比如要查看websrv程序打開了哪些文件描述符,可用以下命令:
4.-p:顯示指定進程打開的所有文件描述符。
5.-t:僅顯示打開了目標文件描述符的進程的PID。
我們還可直接將文件名作為lsof命令的參數(shù),以查看哪些進程打開了該文件。
查看websrv服務器打開了哪些文件描述符:
lsof命令的每行輸出內(nèi)容包含以下字段:
1.COMMAND:執(zhí)行程序所使用的終端命令。默認僅顯示前9個字符。
2.PID:文件描述符所屬進程的PID。
3.USER:擁有該文件描述符的用戶的用戶名。
4.FD:文件描述符的描述。其中cwd表示進程的工作目錄;rtd表示用戶的根目錄;txt表示進程運行的程序代碼;mem表示直接映射到內(nèi)存中的文件(上例中都是動態(tài)庫)。有的FD格式為數(shù)字+訪問權(quán)限
,其中數(shù)字是文件描述符額具體數(shù)值,訪問權(quán)限包括r(可讀)、w(可寫)、u(可讀可寫),上圖中,0u、1u、2u分別表示標準輸入、標準輸出、標準錯誤輸出,3u表示處于LISTEN狀態(tài)的監(jiān)聽socket,4u表示epoll內(nèi)核事件表對應的文件描述符。
5.TYPE:文件描述符的類型。其中DIR是目錄;REG是普通文件;CHR是字符設備文件;IPv4是IPv4類型的socket文件描述符;0000是未知類型。更多類型可參考lsof命令的man手冊。
6.DEVICE:文件所屬設備。對于字符設備和塊設備,其表示方法是主設備號,次設備號
,由上圖可見,測試機器上的程序文件和動態(tài)庫都放在設備8,3
上,其中,8表示這是一個SCSI(Small Computer System Interface,小型計算機系統(tǒng)接口)硬盤,3表示這是該硬盤上的第3個分區(qū),即sda3。websrv進程的標準輸入、標準輸出、標準錯誤對應的設備是136,3
,其中136表示這是一個偽終端,3表示它是第3個偽終端,即/dev/pts/3。對于FIFO類型的文件,如管道和socket,該字段將顯示一個內(nèi)核引用目標文件的地址,或者是其i節(jié)點號。
7.SIZE/OFF:文件大小或偏移值。如果如果該字段顯示為0t*
或0x*
,就表示這是一個偏移值,否則就表示這是一個文件大小。對字符設備或FIFO類型的文件定義文件大小沒有意義,所以該字段將顯示一個偏移值。
9.NODE:文件的i節(jié)點號。對于socket,則顯示為協(xié)議類型,如TCP。
10.NAME:文件名。
如果我們使用telnet命令向websrv服務器發(fā)起一個連接,再次執(zhí)行上圖中的lsof命令時,會多輸出以下行:
該輸出表示服務器打開了一個IPv4類型的socket,其值為5,且它處于ESTABLISHED狀態(tài)。該socket對應的連接的本端socket地址是(127.0.0.1, 13579)
,遠端socket地址是(127.0.0.1, 48215)
。
nc(netcat)命令主要用來快速構(gòu)建網(wǎng)絡連接,我們可以讓它以服務器方式運行,監(jiān)聽某個端口并接收客戶連接,因此它可用來調(diào)試客戶端程序,我們也可以使之以客戶端方式運行,向服務器發(fā)起連接并收發(fā)數(shù)據(jù),因此它可用來調(diào)試服務器程序,此時它有點像telnet程序。
nc命令常用的選項:
1.-i:設置數(shù)據(jù)包傳送的時間間隔。
2.-l
:以服務器方式運行,監(jiān)聽指定的端口。nc命令默認以客戶端方式運行。
3.-k:保持服務器持續(xù)監(jiān)聽,nc不會在客戶端連接終止后退出,而是繼續(xù)保持監(jiān)聽狀態(tài),必須與-l
選項一起使用。
4.-n:使用IP地址表示主機,而不是主機名;使用數(shù)字表示端口號,而不是服務名。即不做任何DNS或服務查找,此時用戶需要提供原始IP地址和端口號,使用該選項的情形:
(1)需要快速測試,避免額外的解析帶來的時間消耗。
(2)DNS解析不可用時,可以使用IP進行連接。
(3)需要指定特定的地址,避免解析結(jié)果帶來的不確定性。
5.-p:當nc命令以客戶端運行時,強制其使用指定的端口號。
6.-s:設置本地主機發(fā)送出的數(shù)據(jù)包的IP地址。
7.-C:將CR和LF兩個字符作為行結(jié)束符。
8.-U:使用UNIX本地域協(xié)議通信。
9.-u:使用UDP協(xié)議。nc命令默認使用的傳輸層協(xié)議是TCP協(xié)議。
10.-w:如果nc客戶端在指定的時間內(nèi)未檢測到任何輸入,則退出。
11.-X:當nc客戶端和代理服務器通信時,該選項指定它們之間使用的通信協(xié)議,目前nc支持的代理協(xié)議有4(SOCKS v.4)、5(SOCKS v.5)、connect(HTTPS proxy),nc默認使用的代理協(xié)議是SOCKS v.5。
12.-x:指定目標代理服務器的IP地址和端口號,比如,要連接到ernest-laptop上的squid代理服務器,并通過它來訪問www.baidu.com的Web服務,可用以下命令:
13:-z:掃描目標機器上的某個或某些服務是否開啟(端口掃描),比如,要掃描機器ernest-laptop上端口在20~50之間的服務,可用以下命令:
我們可用以下方式來連接websrv服務器并向它發(fā)送數(shù)據(jù):
上圖中使用了-C選項,這樣我們每次按下回車鍵向服務器發(fā)送一行數(shù)據(jù)時,nc客戶端都會給服務器額外發(fā)送一個<CR><LF>
,這正是websrv服務器期望的HTTP行結(jié)束符。發(fā)完第三行數(shù)據(jù)后,我們得到了服務器的響應,內(nèi)容正是我們期望的:服務器沒有找到被請求的資源文件a.html。
strace跟蹤程序運行過程中指定的系統(tǒng)調(diào)用和接收到的信號,并將系統(tǒng)調(diào)用名、參數(shù)、返回值、信號名輸出到標準輸出或指定文件。
strace命令常用選項包括:
1.-c:統(tǒng)計每個系統(tǒng)調(diào)用執(zhí)行時間、執(zhí)行次數(shù)、出錯次數(shù)。
2.-f:跟蹤由fork函數(shù)生成的子進程。
3.-t:在輸出的每行信息前加上時間信息。
4.-e:指定一個表達式,用來控制如何跟蹤系統(tǒng)調(diào)用(或接收到的信號,下同),其格式為:
qualifier可以是trace、abbrev、verbose、raw、signal、read、write之一,默認是trace。value是用于進一步限制被跟蹤的系統(tǒng)調(diào)用的符號或數(shù)值,它的兩個特殊取值時all和none,分別表示跟蹤所有由qulifier指定類型的系統(tǒng)調(diào)用和不跟蹤任何該類型的系統(tǒng)調(diào)用。以下是其他value取值:
(1)-e trace=set
:只跟蹤指定的系統(tǒng)調(diào)用。例如-e trace=open, close, read, write
表示只跟蹤open、close、read、write這4種系統(tǒng)調(diào)用。
(2)-e trace=file
:只跟蹤與文件操作相關的系統(tǒng)調(diào)用。
(3)-e trace=process
:只跟蹤與進程控制相關的系統(tǒng)調(diào)用。
(4)-e trace=network
:只跟蹤與網(wǎng)絡相關的系統(tǒng)調(diào)用。
(5)-e trace=signal
:只跟蹤與信號相關的系統(tǒng)調(diào)用。
(6)-e trace=ipc
:只跟蹤與進程間通信相關的系統(tǒng)調(diào)用。
(7)-e signal=set
:只跟蹤指定信號,如-e signal=!SIGIO
表示跟蹤除SIGIO之外的所有信號。
(8)-e read=set
:輸出從指定文件中讀入的數(shù)據(jù),如-e read=3, 5
表示輸出所有從文件描述符3和5讀入的數(shù)據(jù)。
5.-o:將strace的輸出寫入指定的文件。
strace命令的每行都包含以下字段:系統(tǒng)調(diào)用名、參數(shù)、返回值,如下面的實例:
這行輸出表示,程序cat /dev/null
在運行過程中執(zhí)行了open系統(tǒng)調(diào)用,open調(diào)用以只讀方式打開了大文件/dev/null,然后返回了值為3的文件描述符。上圖中命令會輸出很多內(nèi)容,我們省略了次要的信息,后面的示例中,我們也僅顯示主題相關的內(nèi)容。
當系統(tǒng)調(diào)用發(fā)生錯誤時,strace命令將輸出錯誤標識和描述,如以下示例:
上圖中的O_LARGEFILE并不是POSIX標準的一部分,而是一些UNIX-like操作系統(tǒng)的擴展,它通常用于兼容早期UNIX系統(tǒng),告訴操作系統(tǒng)要支持大文件(大于2 GB)的訪問。
stace命令對不同的參數(shù)類型也有不同的輸出方式:
1.對于C風格字符串,strace將輸出字符串的內(nèi)容。默認的最大輸出長度是32字節(jié),對于過長的部分strace會使用...
省略,比如,ls -l命令在運行過程中將讀取/etc/passwd文件:
文件名不被strace當作C風格字符串,其內(nèi)容總是被完整輸出。
2.對于結(jié)構(gòu)體,strace將用{}
輸出該結(jié)構(gòu)體的每個字段,并用,
將每個字段隔開,對于字段較多的結(jié)構(gòu)體,strace將用...
省略部分輸出,比如:
上圖中的lstat64函數(shù)不是標準C庫函數(shù),而是一種在一些UNIX-like操作系統(tǒng)上可用的擴展函數(shù),它類似于標準的lstat函數(shù),但支持大文件(大于2 GB)的文件屬性查詢,以確保文件屬性信息能夠正確獲取和處理。
上面的strace輸出顯示,lstat64系統(tǒng)調(diào)用的第一個參數(shù)是字符串參數(shù)/dev/null,第二個參數(shù)是stat結(jié)構(gòu)體類型的輸出參數(shù)(指針),strace僅顯示了該結(jié)構(gòu)體參數(shù)的兩個字段:st_mode和st_rdev,當系統(tǒng)調(diào)用失敗時,輸出參數(shù)將顯示為傳入前的值。
3.對于位集合參數(shù)(如信號集類型sigset_t),strace將用[]
輸出該集合中所有被置1的位,并用空格隔開每一項,假設某程序中有以下代碼:
則針對該程序的strace命令將輸出以下內(nèi)容:
對于其他類型參數(shù)的輸出方式,可參考strace的man手冊。對于程序接收到的信號,strace將輸出該信號的值及其描述,比如,我們在一個終端上運行sleep 100命令,然后在另一個終端上使用strace命令跟蹤該進程,接著用Ctrl+C終止命令sleep 100以觀察strace的輸出,具體操作如下:
下面考慮一個使用strace命令的完整例子,查看websrv服務器在處理客戶連接和數(shù)據(jù)時使用系統(tǒng)調(diào)用的情況,具體操作如下:
可見,服務器當前正在執(zhí)行epoll_wait系統(tǒng)調(diào)用以等待客戶請求,接下來我們使用以上nc命令對服務器發(fā)起一個連接并逐行發(fā)送HTTP請求,此時strace命令的輸出如下所示:
上圖的輸出分為五個部分,我們用空行將每個部分隔開:
1.第一部分從第一次epoll_wait系統(tǒng)調(diào)用開始,此次epoll_wait調(diào)用檢測到了文件描述符3上的EPOLLIN事件,文件描述符3是服務器的監(jiān)聽socket,因此這個事件表示有新客戶連接到來,于是websrv服務器對監(jiān)聽socket執(zhí)行了accept調(diào)用,accept返回一個新的連接socket,其值為5,接著,服務器清除這個新socket上的錯誤,設置其SO_REUSEADDR屬性,然后往epoll內(nèi)核事件表中注冊該socket上的EPOLLRDHUP和EPOLLONESHOT兩個事件,然后設置新socket為非阻塞的。
2.第二部分從第二次epoll_wait系統(tǒng)調(diào)用開始,此次epoll_wait函數(shù)檢測到了文件描述符5上的EPOLLIN事件,這表示客戶端的第一行數(shù)據(jù)到達了,于是服務器執(zhí)行了兩次recv系統(tǒng)調(diào)用來接收數(shù)據(jù),第一次recv函數(shù)讀取到38字節(jié)的客戶數(shù)據(jù),即GET http://localhost/a.html HTTP/1.1\r\n
。第二次recv函數(shù)失敗了,errno是EAGAIN,這表示目前沒有更多的客戶數(shù)據(jù)可讀。此后服務器調(diào)用了futex函數(shù)對互斥鎖解鎖,以喚醒等待互斥鎖的線程??梢奝OSIX線程庫中的pthread_mutex_unlock函數(shù)在內(nèi)部調(diào)用了futex函數(shù)。
3.與2類似。
4.與2類似。
5.epoll_wait函數(shù)檢測到了文件描述符5上的EPOLLOUT事件,這表示工作線程正確處理了客戶請求,并準備好了待發(fā)送的數(shù)據(jù),因此主線程開始執(zhí)行writev系統(tǒng)調(diào)用往客戶端寫入HTTP應答,最后,服務器從epoll內(nèi)核事件表中移除文件描述符5上的所有注冊事件,并關閉該文件描述符。
netstat可以打印本地網(wǎng)卡接口上的全部連接、路由表信息、網(wǎng)卡接口信息等,本書主要使用上述功能中的第一個,即顯示TCP連接及其狀態(tài)信息,畢竟,要想獲得路由表信息和網(wǎng)卡接口信息,我們可以使用輸出內(nèi)容更豐富的route(管理和顯示系統(tǒng)的網(wǎng)絡路由表的命令)和ifconfig命令。
netstat命令常用選項:
1.-n:使用IP地址表示主機,而不是主機名;使用數(shù)字表示端口號,而不是服務名。
2.-a:也顯示監(jiān)聽socket。
3.-t:僅顯示TCP連接。
4.-r:顯示路由信息。
5.-i:顯示網(wǎng)卡接口的數(shù)據(jù)流量。
6.-c:每隔1秒輸出一次。
7.-o:顯示socket定時器(如?;疃〞r器)的信息。
8.-p:顯示socket所屬的進程的PID和名字。
運行websrv服務器,并執(zhí)行telnet命令對它發(fā)起一個連接請求:
然后執(zhí)行netstat -nat | grep 127.0.0.1:13579
來查看連接狀態(tài),結(jié)果如下:
由上圖,netstat的每行輸出都包含以下6個字段(默認情況):
1.Proto:協(xié)議名。
2.Recv-Q:socket內(nèi)核接收緩沖區(qū)中尚未被應用進程讀取的數(shù)據(jù)量。
3.Send-Q:未被對方確認的數(shù)據(jù)量。
4.Local Address:本端的IP和端口號。
5.Foreign Address:對方的IP地址和端口號。
6.State:socket的狀態(tài)。對于無狀態(tài)協(xié)議,如UDP,這一列將顯示為空。對于面向連接的協(xié)議,netstat支持的State包括ESTABLISHED、SYN_SENT、SYN_RCVD、FIN_WAIT1、FIN_WAIT2、TIME_WAIT、CLOSE、CLOSE_WAIT、LAST_ACK、LISTEN、CLOSING、UNKNOWN。
上圖的輸出中,第1行表示本地socket地址127.0.0.1:13579處于LISTEN狀態(tài),并等待任何遠端socket(用0.0.0.0:*
表示)對它發(fā)起連接。第2行表示服務器和遠端地址127.0.0.1:48220
建立了一個連接。第3行是從客戶端角度重復輸出第2行信息表示的這個連接,因為我們是在同一臺機器上運行服務器和客戶端的。
vmstat(virtual memory statistics)命令能實時輸出系統(tǒng)的各種資源的使用情況,如進程信息、內(nèi)存使用、CPU使用率、IO使用情況。
vmstat命令常用選項:
1.-f:顯示系統(tǒng)自啟動以來執(zhí)行的fork次數(shù)。
2.-s:顯示內(nèi)存相關的統(tǒng)計信息及多種系統(tǒng)活動的數(shù)量(如CPU上下文切換次數(shù))。
3.-d:顯示磁盤相關的統(tǒng)計信息。
4.-p:顯示磁盤分區(qū)的統(tǒng)計信息。
5.-S:使用指定單位來顯示。參數(shù)k、K、m、M分別代表1000、1024、1000000、1048576字節(jié)。
6.delay:采樣間隔(單位是秒),即每隔delay的時間輸出一次統(tǒng)計信息。
7.count:采樣次數(shù),輸出count次統(tǒng)計信息。
默認vmstat命令的輸出:
第1行輸出是自系統(tǒng)啟動以來的平均結(jié)果,而后面的輸出是采樣間隔內(nèi)的平均結(jié)果。vmstat命令的每條輸出都包含6個字段,它們的含義分別是:
1.procs:進程信息。r表示等待運行的進程數(shù);b表示處于不可中斷睡眠狀態(tài)的進程數(shù)(即它們在等待進程IO)。
2.memory:內(nèi)存信息。各項的單位都是KB。swpd表示虛擬內(nèi)存的使用量。free表示空閑內(nèi)存的使用量。buff表示作為buffer cache
的內(nèi)存數(shù)量,其中包含原始磁盤塊(從磁盤讀入的數(shù)據(jù)可能被保持在buffer cache
中,以便下一次快速訪問)。cache表示作為page cache
的內(nèi)存數(shù)量,待寫入磁盤的數(shù)據(jù)首先被放到page cache
中,然后由磁盤中斷程序?qū)懭氪疟P。
3.swap:交換分區(qū)(虛擬內(nèi)存)的使用信息,各項的單位是KB/s。si表示數(shù)據(jù)由磁盤交換至內(nèi)存的速率。so表示數(shù)據(jù)由內(nèi)存交換至磁盤的速率。如果這兩個值經(jīng)常變化,說明內(nèi)存不足。
4.io:塊設備的使用信息,單位是block/s。bi表示從塊設備讀入塊的速率。bo表示向塊設備寫入塊的速率。
5.system:系統(tǒng)信息。in表示每秒發(fā)生的中斷次數(shù)。cs表示每秒發(fā)生的上下文切換(進程切換)次數(shù)。
6.cpu:CPU使用信息。us表示系統(tǒng)所有進程運行在用戶空間的時間占CPU總運行時間的比例。sy表示系統(tǒng)所有進程運行在內(nèi)核空間的時間占CPU總運行時間的比例。id表示CPU處于空閑狀態(tài)的時間占CPU總運行時間的比例。wa表示CPU等待IO事件的時間占CPU總運行時間的比例。
我們可用iostat命令獲得磁盤使用情況的更多信息,也能使用mpstat命令獲得CPU使用情況的更多信息,vmstat命令主要用于查看系統(tǒng)內(nèi)存的使用情況。
ifstat(interface statistics)命令可用于監(jiān)測網(wǎng)絡流量,其常用選項如下:
1.-a:監(jiān)測系統(tǒng)上所有網(wǎng)卡接口。
2.-i:指定要監(jiān)測的網(wǎng)卡接口。
3.-t:在每行輸出信息前加上時間戳。
4.-b:以Kbit/s為單位顯示數(shù)據(jù),而不是默認的KB/s。
5.delay:采樣間隔,單位是秒,即每隔delay時間輸出一次統(tǒng)計信息。
6.count:采樣次數(shù),即總共輸出count次統(tǒng)計信息。
ifstat命令的例子:
從輸出來看,該主機擁有兩個網(wǎng)卡接口:虛擬的回路接口lo和以太網(wǎng)網(wǎng)卡接口eth0。使用ifstat命令可以大概估計各個時段服務器的總輸入、輸出流量。
mpstat(multi-processor statistics)命令能實時監(jiān)測多處理器系統(tǒng)上每個CPU的使用情況。mpstat命令和iostat命令通常都集成在包sysstat中,安裝sysstat即可獲得這兩個命令。mpstat命令的典型用法如下:
選項P指定要監(jiān)聽的CPU號(0~CPU個數(shù)-1),其值ALL表示監(jiān)聽所有CPU。interval參數(shù)是采樣間隔,單位是秒,即每個interval的時間輸出一次統(tǒng)計信息。count參數(shù)是采樣次數(shù),即共輸出count次統(tǒng)計信息,但mpstat命令最后還會輸出這count次采樣結(jié)果的平均值。與vmstat命令一樣,mpstat命令輸出的第一次結(jié)果是自系統(tǒng)啟動以來的平均結(jié)果,而后面的輸出結(jié)果則是采樣間隔內(nèi)的平均結(jié)果。
使用mpstat命令的例子:
為顯示方便,我們省略了每行輸出的前導時間戳。每次采樣的輸出都包含3條信息,每條信息包含以下幾個字段:
1.CPU:指示該條信息是哪個CPU的數(shù)據(jù)。0表示第1個CPU的數(shù)據(jù),1表示第2個CPU的數(shù)據(jù),all是這兩個CPU數(shù)據(jù)的平均值。
2.%usr:除了nice值為負的進程,系統(tǒng)上其他進程運行在用戶空間的時間占CPU總運行時間的比例。
3.%nice:nice值為負的進程運行在用戶空間的時間占CPU總運行時間的比例。
4.%sys:系統(tǒng)上所有進程運行在內(nèi)核空間的時間占CPU總運行時間的比例,但不包括硬件和軟件中斷消耗的CPU時間。
5.%iowait:CPU等待磁盤操作的時間占CPU總運行時間的比例。
6.%irq:CPU用于處理硬件中斷的時間占CPU總運行時間的比例。
7.%soft:CPU用于處理軟件中斷的時間占CPU總運行時間的比例。
8.%steal:一個物理CPU可以包含一對虛擬CPU,這一對虛擬CPU由超級管理程序管理。當超級管理程序在處理某個虛擬CPU時,另外一個虛擬CPU必須等待它處理完成才能運行,這部分等待事件就是steal時間,該字段表示steal時間占CPU總運行時間的比例。
9.%guest:運行虛擬CPU的時間占總運行時間的比例。
10.%idle:系統(tǒng)空閑的時間占CPU總運行時間的比例。
在以上所有輸出字段中,我們最關心的是%user、%sys、%idle,它們基本反映了我們的代碼中業(yè)務邏輯代碼和系統(tǒng)調(diào)用所占的比例,以及系統(tǒng)還能承受多大的負載。上圖輸出中,執(zhí)行系統(tǒng)調(diào)用占用的CPU時間比執(zhí)行用戶業(yè)務邏輯占用的CPU時間要多,這是因為我們運行了第十六章中的壓力測試工具,它在不停地執(zhí)行recv/send系統(tǒng)調(diào)用來收發(fā)數(shù)據(jù)。