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