性能之巔: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 : 超限。
丟包和超限是網絡接口 飽 和 的指針,并且能和錯誤一起用USE方法檢查。
-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) ,由于發送低優先級的數據包,它可能會顯示出比其他應用程序協議更高的延時。
也可以把顯示的路徑作為靜態性能調優的研究對象。網絡被設計為動態的并且能響應故障。路徑的變化可能會降低性能。
書籍介紹
《性能之巔:洞悉系統、企業與云計算》基于Linux 和Solaris系統闡述了適用于所有系統的性能理論和方法,Brendan Gregg 將業界普遍承認的性能方法、工具和指標收集于本書之中。閱讀本書,你能洞悉系統運作的方式,學習到分析和提高系統與應用程序性能的方法,這些性能方法同樣 適用于大型企業與云計算這類最為復雜的環境的性能分析與調優。