# 網絡基本功(十五):細說網絡性能監測與實例(上)
**轉載請在文首保留原文出處:EMC中文支持論壇**[https://community.emc.com/go/chinese](https://community.emc.com/go/chinese) [](https://community.emc.com/servlet/JiveServlet/showImage/2-850742-101463/image001.gif)
## 介紹
網絡路徑性能檢測主要包括三方面的內容:**帶寬測量**能夠獲知網絡的硬件特性,如網絡的最大容量,**吞吐量測量**能夠獲得網絡實際可提供的最大容量,**數據流測量**能夠了解真實占用的網絡容量。
本文介紹在評估網絡性能是否合理時,需要收集的數據及收集方式。涉及工具包括:**ping, pathchar, bing, ttcp, netperf, iperf, netstat。**
## 更多信息
**帶寬測量:**
**ping**
ping這一工具返回的時間,雖然通常被描述為傳輸延時,實際上是發送,傳輸,隊列延時之和。[上一節](https://community.emc.com/message/848168#848168)中,我們通過ping來粗略計算帶寬。這一過程可通過如下方式改進:首先計算鏈路近端的路徑行為,然后計算遠端路徑,然后用兩者差異來估算鏈路帶寬。
[](https://community.emc.com/servlet/JiveServlet/showImage/2-850742-101464/image002.png)
這一過程需要四次使用ping。首先,用兩個不同大小報文ping近端鏈路。減掉傳輸大報文中額外數據的傳輸時間以外,時間差可估算傳輸以及隊列延時。接下來,用同樣兩個報文ping遠端鏈路。再次用大報文和小報文的時間差來估算開銷。最后,用兩次差值的差值就是在最后一段鏈路中傳輸額外數據的時間值。這是一個往返時間,除以2就是額外數據在單向鏈路傳輸所用時間。帶寬則是額外數據總量除以單向傳輸時間。
下表是第二跳和第三跳的時間值,報文大小為100和1100字節。
[](https://community.emc.com/servlet/JiveServlet/showImage/2-850742-101465/image003.png)
下表顯示了帶寬計算結果,用time difference除以2,用8000bit除以這個值,再乘1000(毫秒轉換為秒)。結果是bps轉換為Mbps。
[](https://community.emc.com/servlet/JiveServlet/showImage/2-850742-101466/image004.png)
**pathchar**
將上述過程自動話完成的一個工具是pathchar。pathchar在路徑的一端即能檢測各鏈路的帶寬。方法與之前描述的ping相類似,但是pathchar使用各種大小不一的報文。如下例所示:
```
bsd1# pathchar 165.166.0.2
pathchar to 165.166.0.2 (165.166.0.2)
mtu limited to 1500 bytes at local host
doing 32 probes at each of 45 sizes (64 to 1500 by 32)
0 205.153.60.247 (205.153.60.247)
|?? 4.3 Mb/s,?? 1.55 ms (5.88 ms)
1 cisco (205.153.60.2)
|?? 1.5 Mb/s,?? -144 us (13.5 ms)
2 165.166.36.17 (165.166.36.17)
|??? 10 Mb/s,?? 242 us (15.2 ms)
3 e0.r01.ia-gnwd.Infoave.Net (165.166.36.33)
|?? 1.2 Mb/s,?? 3.86 ms (32.7 ms)
4 165.166.125.165 (165.166.125.165)
|?? ?? b/s,?? 2.56 ms (37.7 ms)
5 165.166.125.106 (165.166.125.106)
|??? 45 Mb/s,?? 1.85 ms (41.6 ms),? +q 3.20 ms (18.1 KB) *4
6 atm1-0-5.r01.ncchrl.infoave.net (165.166.126.1)
|??? 17 Mb/s,?? 0.94 ms (44.3 ms),? +q 5.83 ms (12.1 KB) *2
7 h10-1-0.r01.ia-chrl.infoave.net (165.166.125.33)
|?? ?? b/s,?? 89 us (44.3 ms),? 1% dropped
8 dns1.InfoAve.Net (165.166.0.2)
8 hops, rtt 21.9 ms (44.3 ms), bottleneck 1.2 Mb/s, pipe 10372 bytes
```
pathchar的運行過程中,首先顯示的信息描述探測如何進行。從第三行輸出開始,可看到pathchar使用從64到1500字節的45中不同大小報文。對于每一跳使用32種不同報文組合進行測試。因此,共8跳生成了11,520個測試報文加上相應回復信息。
顯示中給出了帶寬和延時。pathchar也包括了隊列延時信息(如本例中5和6)。如上述信息,pathchar并不總是能成功估算出帶寬(如鏈路4和7)或是延時(如鏈路1)。
在pathchar運行過程中,每發送一個報文就啟動一次倒計時:顯示內容如下所示:
```
1:? 31?? 288?? 0?????? 3
```
1指示跳數并且隨著路徑上后續跳數而增加。下一個數字是倒計時值,給出這一鏈路剩余的探測組數。第三個值是當前發送報文大小。第二個和第三個值改變都非常迅速。倒數第二個值是目前為止丟棄報文數,最后一個是該鏈路的平均往返時間。
當一條的探測完成時,這一行內容被帶寬,傳輸延時,往返時間所取代。pathchar使用觀測到的最小延時來改進帶寬估算值。
**bing**
pathchar的一個替代工具是bing。pathchar估算的是一條路徑上各鏈路的帶寬,而bing用來測量點到點的帶寬。通常,如果你不知道路徑上的各條鏈路,需要首先執行traceroute命令。之后可以運行bing來指定鏈路的近端和遠端。下例顯示了第三跳的帶寬:
```
bsd1# bing -e10 -c1 205.153.60.2 165.166.36.17
BING??? 205.153.60.2 (205.153.60.2) and 165.166.36.17 (165.166.36.17)
??????? 44 and 108 data bytes
1024 bits in 0.835ms: 1226347bps, 0.000815ms per bit
1024 bits in 0.671ms: 1526080bps, 0.000655ms per bit
1024 bits in 0.664ms: 1542169bps, 0.000648ms per bit
1024 bits in 0.658ms: 1556231bps, 0.000643ms per bit
1024 bits in 0.627ms: 1633174bps, 0.000612ms per bit
1024 bits in 0.682ms: 1501466bps, 0.000666ms per bit
1024 bits in 0.685ms: 1494891bps, 0.000669ms per bit
1024 bits in 0.605ms: 1692562bps, 0.000591ms per bit
1024 bits in 0.618ms: 1656958bps, 0.000604ms per bit
--- 205.153.60.2 statistics ---
bytes?? out??? in?? dup? loss?? rtt (ms): min?????? avg?????? max
?? 44??? 10??? 10????????? 0%?????????? 3.385???? 3.421???? 3.551
? 108??? 10??? 10????????? 0%?????????? 3.638???? 3.684???? 3.762
--- 165.166.36.17 statistics ---
bytes?? out??? in?? dup? loss?? rtt (ms): min?????? avg?????? max
?? 44??? 10??? 10????????? 0%?????????? 3.926???? 3.986???? 4.050
? 108??? 10??? 10????????? 0%?????????? 4.797???? 4.918???? 4.986
--- estimated link characteristics ---
estimated throughput 1656958bps
minimum delay per packet 0.116ms (192 bits)
average statistics (experimental) :
packet loss: small 0%, big 0%, total 0%
average throughput 1528358bps
average delay per packet 0.140ms (232 bits)
weighted average throughput 1528358bps
resetting after 10 samples.
```
輸出從地址和報文大小信息開始,之后是探測pair。接下來,返回往返時間和丟失數據。最后,返回一些吞吐量的估測值。
**吞吐量測量:**
吞吐量不夠的原因不僅在于硬件不足,還有可能是網絡設計架構的問題。例如,廣播域設置得太大,則即使硬件夠磅也會造成問題。解決方案是重構網絡,在**充分理解數據流模式**后,將這類域隔離開或是分段。
吞吐量通常是測量大塊數據傳輸延時來完成的。通常需要在鏈路各端運行軟件。一般這類軟件運行在應用層,所以它不僅測量網絡也測量了軟硬件。
一個比較簡單粗放的方式是用FTP。用FTP來傳輸一份文件并且看一下它report的數據。需要將結果轉換成比特率,例如,這是文件傳輸的最后一行:
```
1294522 bytes received in 1.44 secs (8.8e+02 Kbytes/sec)
```
將1,294,522字節乘8轉換成bit之后再除以時間,1.44秒。 結果為7,191,789 bps。
這種方法的不足在于磁盤訪問時間可能對結果造成影響。如果需要提高精度則需要使用一些工具。
**ttcp**
運行這一程序首先需要在遠端設備運行server,通常用-r和-s選項。之后運行client,用-t和-s選項,以及主機名或地址。數據從client端發送至server端,測量性能之后,在各端返回結果,之后終止client端和server端。例如,server端如下所示:
```
bsd2# ttcp -r -s
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001? tcp
ttcp-r: socket
ttcp-r: accept from 205.153.60.247
ttcp-r: 16777216 bytes in 18.35 real seconds = 892.71 KB/sec +++
ttcp-r: 11483 I/O calls, msec/call = 1.64, calls/sec = 625.67
ttcp-r: 0.0user 0.9sys 0:18real 5% 15i+291d 176maxrss 0+2pf 11478+28csw
client端如下所示:
bsd1# ttcp -t -s 205.153.63.239
ttcp-t: buflen=8192, nbuf=2048, align=16384/0, port=5001? tcp? -> 205.153.63.239
ttcp-t: socket
ttcp-t: connect
ttcp-t: 16777216 bytes in 18.34 real seconds = 893.26 KB/sec +++
ttcp-t: 2048 I/O calls, msec/call = 9.17, calls/sec = 111.66
ttcp-t: 0.0user 0.5sys 0:18real 2% 16i+305d 176maxrss 0+2pf 3397+7csw
```
該程序報告中顯示了信息傳輸總量,標識了連接的建立,并且給出了結果,包括raw data,throughput,I/O call信息,執行時間。最有用的信息應該是transfer rate,892.71 KB/sec (or 893.26 KB/sec)。
這一數據反映了數據的傳輸速率,而不是鏈路的容量。將這一數據轉化成帶寬可能是有問題的,因為實際上傳輸了比這一值更多的比特數。這一程序顯示18.35秒傳送了16,777,216字節,但是這僅僅是數據。以太網報文封裝還包括TCP,IP,以太網報文頭,估算容量時,需要把這些值加上去。
吞吐量低通常意味著擁塞,但也并不總是如此。吞吐量也會取決于配置問題,如連接的TCP窗口大小。如果窗口大小不足,會嚴重影響到性能。
(未完待續)
## 參考
Network Troubleshooting Tools
- 介紹
- 網絡基本功(一):細說網絡傳輸
- 網絡基本功(二):細說交換機
- 網絡基本功(三):細說VLAN與Trunk
- 網絡基本功(四):細說路由(上)
- 網絡基本功(五):細說路由(下)
- 網絡基本功(六):鏈路聚合
- 網絡基本功(七):細說IP地址與子網
- 網絡基本功(八):細說TCP滑動窗口
- 網絡基本功(九):細說TCP重傳
- 網絡基本功(十):細說TCP確認機制
- 網絡基本功(十一):TCP窗口調整與流控
- 網絡基本功(十二):細說Linux網絡配置(上)
- 網絡基本功(十三):細說Linux網絡配置(下)
- 網絡基本功(十四):細說診斷工具ping
- 網絡基本功(十五):細說網絡性能監測與實例(上)
- 網絡基本功(十六):細說網絡性能監測與實例(下)
- 網絡基本功(十七):細說tcpdump的妙用(上)
- 網絡基本功(十八):細說tcpdump的妙用(下)
- 網絡基本功(十九):細說NAT原理與配置
- 網絡基本功(二十):細說ICMP和ARP
- 網絡基本功(二十一):細說HTTP(上)
- 網絡基本功(二十二):細說HTTP(下)
- 網絡基本功(二十三):Wireshark抓包實例診斷TCP連接問題
- 網絡基本功(二十四):Wireshark抓包實例分析TCP重傳
- 網絡基本功(二十五):Wireshark抓包實例分析TCP重復ACK與亂序
- 網絡基本功(二十六):Wireshark抓包實例分析TCP窗口及reset
- 網絡基本功(二十七):Wireshark抓包實例分析HTTP問題(上)
- 網絡基本功(二十八):Wireshark抓包實例分析HTTP問題(下)
- 網絡基本功(二十九):Wireshark抓包實例診斷數據庫常見問題
- 網絡基本功(三十):細說DNS(上)
- 網絡基本功(三十一):細說DHCP