google Ubuntu 程序员 云计算 centos mysql Windows php 微软 apache 编程 开源 Python linux shell Firefox wordpress Android nginx java

性能之巔: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) 接口統計信息的示例如下:

性能之巅:Linux网络性能分析工具

數據列包括網絡接口( Iface )、 MTU , 以及一系列接收( RX- )和傳輸( TX- )的指標。

OK : 成功傳輸的數據包。
ERR : 錯誤數據包。
DRP : 丟包。
OVR : 超限。
丟包和超限是網絡接口 飽 和 的指針,並且能和錯誤一起用USE方法檢查。

-c 連續模式能與 -i 一並使用,每秒輸出這些累積的計數器。它提供計算數據包速率的數據。

下面是一個 netstat(8) 網絡棧統計數據(片段)的示例:

性能之巅:Linux网络性能分析工具

性能之巅:Linux网络性能分析工具

輸出列出了多項按協議分組的網絡數據,主要是來自TCP的。所幸的是,其中多數有較長的描述性名稱,因此它們的意思顯而易見。不幸的是這些輸出缺乏一致性而且有拼寫錯誤,用程序處理這段文字比較麻煩。

許多與性能相關的指標以加粗強調,用以指出可用的信息。其中許多指標要求對TCP行為的深刻理解,包括近些年引入的的最新功能和算法。下面是一些值得查找的示例指標。

相比接收的總數據包更高速的包轉發率:檢查服務器是否應該轉發(路由)數據包。
開放的被動連接:監視它們能顯示客戶機連接負載。
相比發送的數據段更高的數據段重傳輸率:能支持網絡的不穩定。這可能是意料之中的(互聯網客戶)。
套接字緩沖超限導致的數據包從接收隊列中刪除:這是網絡飽和的標誌,能夠通過增加套接字緩沖來修復——前提是有足夠的系統資源支持應用程序。
一些統計信息名稱包括拼寫錯誤。如果其他的監視工具建立在同樣的輸出上,簡單地修復它們可能有問題。這類工具最好能從/proc資源讀取這些統計信息,它們是/proc/net/snmp和/proc/net/netstat。例如:

性能之巅:Linux网络性能分析工具

/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統計信息:

性能之巅:Linux网络性能分析工具

性能之巅:Linux网络性能分析工具

輸出顯示被動連接率(入站)接近30/s。

網絡接口統計信息列(NET)列出所有接口,然而通常只對一個接口感興趣。以下示例利用 awk(1) 過濾輸出:

性能之巅:Linux网络性能分析工具

這顯示出傳輸和發送的網絡吞吐量。這裏雙向的速率都超過了2MB/s。

ifconfig

ifconfig(8) 命令能手動設置網絡接口。它也可以列出所有接口的當前配置。用它來檢查系統、網絡以及路由設置有助於靜態性能調優。

Linux版本的輸出包括以下這些統計信息:

性能之巅:Linux网络性能分析工具

這些計數器與之前介紹的 netstat -i 命令一致。 txqueuelen 是這個接口發送隊列的長度。Man手冊介紹了這個數值的調優:

對於速度較低的高延時設備(調制解調器連接,ISDN),設置較小的值有助於預防高速的大量傳輸影響如telnet在內的交互通信。

Linux中, ifconfig(8) 已經被 ip(8) 命令淘汰。

ip

Linux的 ip(8) 命令能配置網絡接口和路由,並且觀測它們的狀態和統計信息。例如,顯示連接統計信息:

性能之巅:Linux网络性能分析工具

除了添加了接收( 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版本的輸出:

性能之巅: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請求數據包測試網絡連通性。例如:

性能之巅:Linux网络性能分析工具

輸出顯示每個包的往返時間( rtt )並總結各種統計信息。由於時間戳是由 ping(8) 命令自己計量的,其中包括獲取時間戳到處理網絡I/O的整個CPU代碼路徑執行時間。

與應用程序協議相比,路由器可能以較低的優先級處理ICMP數據包,因而延時可能比通常情況下有更高的波動。

traceroute

traceroute(8) 命令發出一系列數據包實驗性地探測到一個主機當前的路由。它的實現利用了遞增每個數據包IP協議的生存時間(TTL),從而導致網關順序地發送ICMP超時響應報文,向主機揭示自己的存在(如果防火墻沒有攔截它們)。

例如測試一個加利福尼亞的主機與一個弗吉尼亞的目標間當前的路由:

性能之巅:Linux网络性能分析工具

性能之巅:Linux网络性能分析工具

每一跳顯示連續的三個RTT,它們可用作網絡延時統計信息的粗略數據源。類似 ping(8) ,由於發送低優先級的數據包,它可能會顯示出比其他應用程序協議更高的延時。

也可以把顯示的路徑作為靜態性能調優的研究對象。網絡被設計為動態的並且能響應故障。路徑的變化可能會降低性能。

書籍介紹

性能之巅:Linux网络性能分析工具

《性能之巔:洞悉系統、企業與雲計算》基於Linux 和Solaris系統闡述了適用於所有系統的性能理論和方法,Brendan Gregg 將業界普遍承認的性能方法、工具和指標收集於本書之中。閱讀本書,你能洞悉系統運作的方式,學習到分析和提高系統與應用程序性能的方法,這些性能方法同樣 適用於大型企業與雲計算這類最為復雜的環境的性能分析與調優。

延伸阅读

评论