網絡基本功(十六):細說網絡性能監測與實例(下)

網絡基本功(十六):細說網絡性能監測與實例(下)

 

轉載請在文首保留原文出處:EMC中文支持論壇https://community.emc.com/go/chinese p_w_picpath001.gif

 

 

介紹

 

網絡問題中,性能問題是最複雜的問題之一,解決這樣的問題能夠透徹的瞭解整個網絡的結構。但通過合適的吞吐量和數據流測試工具,能夠幫你快速找到問題所在。本文承接上文,闡述netperf和netstat的用法。


更多信息

 

吞吐量測量:

(承接上文)

netperf

該程序是由HP創造,該程序免費可用,運行於一些Unix平臺,有支持文檔,也被移植到Windows平臺。雖然不像ttcp那樣無處不在,但它的測試範圍更加廣泛。

與ttcp不同,客戶端和服務器端是分開的程序。服務器端是netserver,能夠單獨啓動,或通過inetd啓動。客戶端是netperf。下例中,服務器和客戶端啓動於同一臺機器:

bsd1# netserver

Starting netserver at port 12865

bsd1# netperf

TCP STREAM TEST to localhost : histogram

Recv   Send    Send

Socket Socket  Message  Elapsed

Size   Size    Size     Time     Throughput

bytes  bytes   bytes    secs.    10^6bits/sec

 

16384  16384  16384    10.00     326.10

測試的是loop-back接口,報告顯示吞吐量爲326Mbps。

 

下例中,netserver啓動於主機:

bsd1# netserver

Starting netserver at port 12865

netperf加上-H選項指定服務器地址:

bsd2# netperf -H 205.153.60.247

TCP STREAM TEST to 205.153.60.247 : histogram

Recv   Send    Send

Socket Socket  Message  Elapsed

Size   Size    Size     Time     Throughput

bytes  bytes   bytes    secs.    10^6bits/sec

 

16384  16384  16384    10.01       6.86

大致與ttcp所得出的吞吐量相同。netperf還進行了一些額外的測試。以下測試中,還計算了連接的transaction rate:

bsd2# netperf -H 205.153.60.247 -tTCP_RR

TCP REQUEST/RESPONSE TEST to 205.153.60.247 : histogram

Local /Remote

Socket Size   Request  Resp.   Elapsed  Trans.

Send   Recv   Size     Size    Time     Rate

bytes  Bytes  bytes    bytes   secs.    per sec

 

16384  16384  1        1       10.00     655.84

16384  16384

該程序包含一些測試腳本。也可以使用netperf做各種流測試。

 

iperf

如果ttcp和netperf都不符合你的要求,那麼可以考慮iperf。iperf也可以用於測試UDP帶寬,丟失率,和抖動。Java前端讓該工具便於使用。該工具同樣移植入windows。

下例是運行iperf服務器端:

bsd2# iperf -s -p3000

------------------------------------------------------------

Server listening on TCP port 3000

TCP window size: 16.0 KByte (default)

------------------------------------------------------------

[  4] local 172.16.2.236 port 3000 connected with 205.153.63.30 port 1133

[ ID] Interval       Transfer     Bandwidth

[  4]  0.0-10.0 sec   5.6 MBytes   4.5 Mbits/sec

^C

下例是在windows運行客戶端:

C:\>iperf -c205.153.60.236

-p3000

------------------------------------------------------------

Client connecting to 205.153.60.236, TCP port 3000

TCP window size:  8.0 KByte (default)

------------------------------------------------------------

[ 28] local 205.153.63.30 port 1133 connected with 205.153.60.236 port 3000

[ ID] Interval       Transfer     Bandwidth

[ 28]  0.0-10.0 sec   5.6 MBytes   4.5 Mbits/sec

 

注意使用Ctrl-C來終止服務器端。在TCP模式下,iperf相當於ttcp,所以它可盈用戶客戶端或服務器。

在研究TCP窗口是否足夠大時,使用iperf特別方便。-w選項設置socket buffer大小。對於TCP來說,這就是窗口大小。通過-w選項,用戶可以單步調試各種窗口大小來看它們是怎樣影響吞吐量的。

 

其他工具

你也許想要考慮一些相關或類似的工具。treno使用的方法類似於traceroute來計算塊容量,路徑MTU,以及最小RTP。如下例所示:

bsd2# treno 205.153.63.30

MTU=8166  MTU=4352  MTU=2002  MTU=1492 ..........

Replies were from sloan.lander.edu [205.153.63.30]

    Average rate: 3868.14 kbp/s (3380 pkts in + 42 lost = 1.2%) in 10.07 s

Equilibrium rate:      0 kbp/s (0 pkts in + 0 lost =   0%) in    0 s

Path properties: min RTT was  13.58 ms, path MTU was 1440 bytes

XXX Calibration checks are still under construction, use –v

 

通常來說,netperf,iperf和treno提供更加豐富的feature,但ttcp更加容易找到。

 

 

通過netstat進行流量測量:

在理想的網絡環境下,如果把overhead算在內,吞吐量是很接近於帶寬的。但是吞吐量往往低於期望值,這種情況下,你會想要知道差異在哪。如之前所提到的,可能與硬件或軟件相關。但通常是由於網絡上其他數據流的影響。如果你無法確定原因,下一步就是查看你網絡上的數據流。

有三種基本方法可供採用。第一,最快的方法是使用如netstat這樣的工具來查看鏈路行爲。或通過抓包來查看數據流。最後,可使用基於SNMP的工具如ntop。

要得到網絡上數據流的快照,使用-i選項。舉例來說:

bsd2# netstat -i

Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll

lp0*  1500  <Link>                               0     0        0     0     0

ep0   1500  <Link>      00.60.97.06.22.22 13971293     0  1223799     1     0

ep0   1500  205.153.63    bsd2            13971293     0  1223799     1     0

tun0* 1500  <Link>                               0     0        0     0     0

sl0*  552   <Link>                               0     0        0     0     0

ppp0* 1500  <Link>                               0     0        0     0     0

lo0   16384 <Link>                             234     0      234     0     0

lo0   16384 127           localhost            234     0      234     0     0

輸出顯示了自上一次重啓以來,各接口所處理的報文數量。在本例中,接口ep0收到13,971,293個沒有差錯(Ierrs)的報文(Ipkts),發送了1,223,799 個報文(Opkts),有1個差錯,沒有衝突(Coll)。少量錯誤通常並不是造成告警的原因,但各錯誤所佔比例應當是維持在較低水平,應該明顯低於報文總量的0.1%。衝突可以稍微高一些,但應當少於數據流總量的10%。衝突數量僅包括那些影響接口的。較高數量的衝突喻示着網絡負載較高,用戶應當考慮分段。衝突只出現在特定媒介上。

 

如果你只想要單一接口的輸出,可以通過-I選項指定,如:

bsd2# netstat -Iep0

Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll

ep0   1500  <Link>      00.60.97.06.22.22 13971838     0  1223818     1     0

ep0   1500  205.153.63    bsd2            13971838     0  1223818     1     0

隨着實現的不同,輸出可能看起來有些差異,但基本信息是一樣的。例如,Linux平臺的輸出:

lnx1# netstat -i

Kernel Interface table

Iface   MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg

eth0   1500   0  7366003      0      0      0    93092      0      0      0 BMRU

eth1   1500   0   289211      0      0      0    18581      0      0      0 BRU

lo     3924   0      123      0      0      0      123      0      0      0 LRU

如上例所示,Linux將丟失報文拆成三個目錄:errors, drops,以及overruns。

不方便的是,netstat的返回值是系統自上一次重啓之後的累計值。我們真正關心的是這些數值最近是怎樣變化的,因爲問題是在發展的,在它增長到足以顯現問題之前會花費相當長的時間。

 

有時你會對系統做一些壓力測試來看錯誤是否增加,可以使用ping加 –I選項或spray命令。

首先,運行netstat來得到當前值:

bsd2# netstat -Iep0

Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll

ep0   1500  <Link>      00.60.97.06.22.22 13978296     0  1228137     1     0

ep0   1500  205.153.63    bsd2            13978296     0  1228137     1     0

 

接下來,發送大量報文到目的地址。本例中,發送了1000個UDP報文:

bsd1# spray -c1000 205.153.63.239

sending 1000 packets of lnth 86 to 205.153.63.239 ...

        in 0.09 seconds elapsed time

        464 packets (46.40%) dropped

Sent:   11267 packets/sec, 946.3K bytes/sec

Rcvd:   6039 packets/sec, 507.2K bytes/sec

注意到該測試超出了網絡容量,因爲464個報文被丟棄了。這可能意味着網絡擁塞。更加可能的是,主機正在嘗試與一個慢速設備通信。當spray在相反方向運行時,沒有報文丟棄。

最後,回到netstat來看看是否存在問題:

bsd2# netstat -Iep0

Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll

ep0   1500  <Link>      00.60.97.06.22.22 13978964     0  1228156     1     0

ep0   1500  205.153.63    bsd2            13978964     0  1228156     1     0

本例顯示沒有問題。

 

如果顯示有問題,可以通過-s選項來得到。輸出數據量可能有點嚇人,但可以提供豐富的信息。信息按照協議和錯誤類型來分段,如bad checksum或報文頭不完整。

 

在某些系統上,兩次-s選項顯示非零值的總和,如下所示:

bsd2# netstat -s -s

ip:

        255 total packets received

        255 packets for this host

        114 packets sent from this host

icmp:

        ICMP address mask responses are disabled

igmp:

tcp:

        107 packets sent

                81 data packets (8272 bytes)

                26 ack-only packets (25 delayed)

        140 packets received

                77 acks (for 8271 bytes)

                86 packets (153 bytes) received in-sequence

        1 connection accept

        1 connection established (including accepts)

        77 segments updated rtt (of 78 attempts)

        2 correct ACK header predictions

        62 correct data packet header predictions

udp:

        115 datagrams received

        108 broadcast/multicast datagrams dropped due to no socket

        7 delivered

        7 datagrams output

通過-p選項顯示某一協議的彙總信息,下例顯示TCP非零值的統計信息:

bsd2# netstat -p tcp -s -s

tcp:

        147 packets sent

                121 data packets (10513 bytes)

                26 ack-only packets (25 delayed)

        205 packets received

                116 acks (for 10512 bytes)

                122 packets (191 bytes) received in-sequence

        1 connection accept

        1 connection established (including accepts)

        116 segments updated rtt (of 117 attempts)

        2 correct ACK header predictions

        88 correct data packet header predictions

解釋這一結果是需要一些經驗的。一開始可以從大量錯誤信息開始看起。接下來,識別錯誤類型。通常,input error是由於硬件故障應期的。 Output error是由本地主機的問題造成。Data corruption,例如錯誤校驗和,通常產生於服務器。衝突往往意味着網絡擁塞。當然,這只是一般情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章