效能之巔:Linux網路效能分析工具
編者按:InfoQ開設新欄目“品味書香”,精選技術書籍的精彩章節,以及分享看完書留下的思考和收穫,歡迎大家關注。本文節選自格雷格著《效能之巔:洞悉系統、企業與雲端計算》中第10.6節,介紹了其中Linux部分網路效能分析工具的使用方法。
本文介紹基於Linux作業系統的網路效能分析工具。它們的使用策略參見前面的部分。
本節介紹的工具列於下表中。
Linux |
Solaris |
描述 |
netstat |
netstat |
多種網路棧和介面統計資訊 |
sar |
- |
統計資訊歷史 |
ifconfig |
ifconfig |
介面配置 |
ip |
dladm |
網路介面統計資訊 |
nicstat |
nicstat |
網路介面吞吐量和使用率 |
ping |
ping |
測試網路連通性 |
traceroute |
traceroute |
測試網路路由 |
pathchar |
pathchar |
確定網路路徑特徵 |
tcpdump |
snoop/tcpdump |
網路資料包嗅探器 |
Wireshark |
Wireshark |
圖形化網路資料包檢查器 |
DTrace, perf |
DTrace |
TCP/IP棧跟蹤:連線、資料包、丟包、延時 |
本文將僅介紹Linux系統中的前7個網路效能分析工具。一開始是系統層面的統計資料,進而向下挖掘到包嗅探和事件跟蹤。完整的功能請參考這些工具的文件,包括Man手冊。
netstat
基於使用的選項,netstat(8)命令能報告多種型別的網路統計資料,就像具有多種功能的組合工具。選項介紹如下:
- (默認):列出連線的套接字。
- -a:列出所有套接字的資訊。
- -s:網路棧統計資訊。
- -i:網路介面資訊。
- -r:列出路由表。
其他選項能修改輸出,例如-n不解析IP地址為主機名,以及-v(可用時)顯示冗長的詳細資訊。
一個netstat(8)介面統計資訊的示例如下:
資料列包括網路介面(Iface)、MTU,以及一系列接收(RX-)和傳輸(TX-)的指標。
- OK:成功傳輸的資料包。
- ERR:錯誤資料包。
- DRP:丟包。
- OVR:超限。
丟包和超限是網路介面飽
-c連續模式能與-i一併使用,每秒輸出這些累積的計數器。它提供計算資料包速率的資料。
下面是一個netstat(8)網路棧統計資料(片段)的示例:
輸出列出了多項按協議分組的網路資料,主要是來自TCP的。所幸的是,其中多數有較長的描述性名稱,因此它們的意思顯而易見。不幸的是這些輸出缺乏一致性而且有拼寫錯誤,用程式處理這段文字比較麻煩。
許多與效能相關的指標以加粗強調,用以指出可用的資訊。其中許多指標要求對TCP行為的深刻理解,包括近些年引入的的最新功能和演算法。下面是一些值得查詢的示例指標。
- 相比接收的總資料包更高速的包轉發率:檢查伺服器是否應該轉發(路由)資料包。
- 開放的被動連線:監視它們能顯示客戶機連線負載。
- 相比傳送的資料段更高的資料段重傳輸率:能支援網路的不穩定。這可能是意料之中的(網際網路客戶)。
- 套接字緩衝超限導致的資料包從接收佇列中刪除:這是網路飽和的標誌,能夠通過增加套接字緩衝來修復——前提是有足夠的系統資源支援應用程式。
一些統計資訊名稱包括拼寫錯誤。如果其他的監視工具建立在同樣的輸出上,簡單地修復它們可能有問題。這類工具最好能從/proc資源讀取這些統計資訊,它們是/proc/net/snmp和/proc/net/netstat。例如:
/proc/net/snmp統計資訊也用於SNMP管理資訊庫(MIB),它提供關於每個統計資訊的用途的更進一步的文件。擴充套件的統計資訊在/proc/net/netstat中。
netstat(8)可以接受以秒為單位的時間間隔,它按每個時間間隔連續地輸出累加的計數器。後期處理這些輸出可以計算每個計數器的速率。
sar
系統活動報告工具sar(1)可以觀測當前活動並且能配置為儲存和報告歷史統計資料。第4章中介紹過它,並且本書的多個章節在需要時也會提及它。
Linux版本用以下選項提供網路統計資訊。
- -n DEV:網路介面統計資訊。
- -n EDEV:網路介面錯誤。
- -n IP:IP資料報統計資訊。
- -n EIP:IP錯誤統計資訊。
- -n TCP:TCP統計資訊。
- -n ETCP:TCP錯誤統計資訊。
- -n SOCK:套接字使用。
提供的統計資訊見下表。
選項 |
統計資訊 |
描述 |
單位 |
-n DEV |
rxpkg/s |
接收的資料包 |
資料包/s |
-n DEV |
txpkt/s |
傳輸的資料包 |
資料包/s |
-n DEV |
rxkB/s |
接收的千位元組 |
千位元組/s |
-n DEV |
txkB/s |
傳輸的千位元組 |
千位元組/s |
-n EDEV |
rxerr/s |
接收資料包錯誤 |
資料包/s |
-n EDEV |
txerr/s |
傳輸資料包錯誤 |
資料包/s |
-n EDEV |
coll/s |
碰撞 |
資料包/s |
-n EDEV |
rxdrop/s |
接收資料包丟包(緩衝滿) |
資料包/s |
-n EDEV |
txdrop/s |
傳輸資料包丟包(緩衝滿) |
資料包/s |
-n EDEV |
rxfifo/s |
接收的資料包FIFO超限錯誤 |
資料包/s |
-n EDEV |
txfifo/s |
傳輸的資料包FIFO超限錯誤 |
資料包/s |
-n IP |
irec/s |
輸入的資料報文(接收) |
資料報文/s |
-n IP |
fwddgm/s |
轉發的資料報文 |
資料報文/s |
-n IP |
orq/s |
輸出的資料報文請求(傳輸) |
資料報文/s |
-n EIP |
idisc/s |
輸入的丟棄(例如,緩衝滿) |
資料報文/s |
-n EIP |
odisc/s |
輸出的丟棄(例如,緩衝滿) |
資料報文/s |
-n TCP |
active/s |
新的主動TCP連線(connect()) |
連線數/s |
-n TCP |
active/s |
新的被動TCP連線(listen()) |
連線數/s |
-n TCP |
active/s |
輸入的段(接收) |
段/s |
-n TCP |
active/s |
輸出的段(接收) |
段/s |
-n ETCP |
active/s |
主動TCP失敗連線 |
連線數/s |
-n ETCP |
active/s |
TCP段重傳 |
段/s |
-n SOCK |
totsck |
使用中的總資料包 |
sockets |
-n SOCK |
ip-frag |
當前佇列中的IP資料片 |
fragments |
-n SOCK |
tcp-tw |
TIME-WAIT中的TCP套接字 |
sockets |
這裡,許多統計資訊名稱包括方向和計量單位:rx是“接收”,i是“輸入”,seg是“段”,依此類推。完整的列表參考Man手冊,它包括ICMP、UDP、NFS和IPv6在內的統計資訊以及對應的SNMP名稱的說明(例如,ipInReceives對應irec/s)。
以下示例是每秒列印的TCP統計資訊:
輸出顯示被動連線率(入站)接近30/s。
網路介面統計資訊列(NET)列出所有介面,然而通常只對一個介面感興趣。以下示例利用awk(1)過濾輸出:
這顯示出傳輸和傳送的網路吞吐量。這裡雙向的速率都超過了2MB/s。
ifconfig
ifconfig(8)命令能手動設定網路介面。它也可以列出所有介面的當前配置。用它來檢查系統、網路以及路由設定有助於靜態效能調優。
Linux版本的輸出包括以下這些統計資訊:
這些計數器與之前介紹的netstat -i命令一致。txqueuelen是這個介面傳送佇列的長度。Man手冊介紹了這個數值的調優:
對於速度較低的高延時裝置(調變解調器連線,ISDN),設定較小的值有助於預防高速的大量傳輸影響如telnet在內的互動通訊。
Linux中,ifconfig(8)已經被ip(8)命令淘汰。
ip
Linux的ip(8)命令能配置網路介面和路由,並且觀測它們的狀態和統計資訊。例如,顯示連線統計資訊:
除了添加了接收(RX)和傳輸(TX)位元組,這些計數器與之前介紹的netstat -i命令一致。這利於方便地觀測吞吐量,不過ip(8)不提供按時間間隔輸出報告的方式(利用sar(1))。
nicstat
最初為基於Solaris的系統編寫,nicstat(1)這個開源工具輸出包括吞吐量和使用率在內的網路介面統計資訊。nicstat(1)延續傳統的資源統計工具iostat(1M)和mpstat(1M)的風格。用C和Perl編寫的版本可用於基於Solaris和Linux的系統[3]。
例如以下的1.92 Linux版本的輸出:
最前面的輸出是自系統啟動以來的總結,緊接著是按時間間隔的總結。這裡的時間間隔總結顯示了eth4介面的使用率為35%(這裡報告的是當前RX或者TX方向的最大值),並且讀速度為42MB/s。
欄位包括介面名稱(Int)、最大使用率(%Util)、反映介面飽和度的統計資訊(Sat),以及一系列帶字首的統計資訊:r是“讀”(接收)而w是“寫”(傳輸)。
- KB/s:千位元組每秒。
- Pk/s:資料包每秒。
- Avs/s:平均資料包大小,以位元組為單位。
該版本支援多種選項,包括-z用來忽略數值為0的行(閒置的介面)以及-t顯示TCP統計資訊。
由於能提供使用率和飽和度數值,nicstat(1)特別適用於USE方法。
ping
ping(8)命令傳送ICMP echo請求資料包測試網路連通性。例如:
輸出顯示每個包的往返時間(rtt)並總結各種統計資訊。由於時間戳是由ping(8)命令自己計量的,其中包括獲取時間戳到處理網路I/O的整個CPU程式碼路徑執行時間。
與應用程式協議相比,路由器可能以較低的優先順序處理ICMP資料包,因而延時可能比通常情況下有更高的波動。
traceroute
traceroute(8)命令發出一系列資料包實驗性地探測到一個主機當前的路由。它的實現利用了遞增每個資料包IP協議的生存時間(TTL),從而導致閘道器順序地傳送ICMP超時響應報文,向主機揭示自己的存在(如果防火牆沒有攔截它們)。
例如測試一個加利福尼亞的主機與一個弗吉尼亞的目標間當前的路由:
每一跳顯示連續的三個RTT,它們可用作網路延時統計資訊的粗略資料來源。類似ping(8),由於傳送低優先順序的資料包,它可能會顯示出比其他應用程式協議更高的延時。
也可以把顯示的路徑作為靜態效能調優的研究物件。網路被設計為動態的並且能響應故障。路徑的變化可能會降低效能。