網絡的監測是所有 linux 子系統裡面最複雜的,有太多的因素在裡面,比如:延遲、阻塞、沖突、丢包等,更糟的是與 linux 主機相連的路由器、交換機、無線信号都會影響到整體網絡并且很難判斷是因為 linux 網絡子系統的問題還是别的裝置的問題,增加了監測和判斷的複雜度。現在我們使用的所有網卡都稱為自适應網卡,意思是說能根據網絡上的不同網絡裝置導緻的不同網絡速度和工作模式進行自動調整。我們可以通過 ethtool 工具來檢視網卡的配置和工作模式:
# /sbin/ethtool eth0
settings for eth0:
supported ports: [ tp ]
supported link modes: 10baset/half 10baset/full
100baset/half 100baset/full
1000baset/half 1000baset/full
supports auto-negotiation: yes
advertised link modes: 10baset/half 10baset/full
advertised auto-negotiation: yes
speed: 100mb/s
duplex: full
port: twisted pair
phyad: 1
transceiver: internal
auto-negotiation: on
supports wake-on: g
wake-on: g
current message level: 0x000000ff (255)
link detected: yes
上面給出的例子說明網卡有 10baset,100baset 和 1000baset 三種選擇,目前正自适應為 100baset(speed: 100mb/s)。可以通過 ethtool 工具強制網卡工作在 1000baset 下:
# /sbin/ethtool -s eth0 speed 1000 duplex full autoneg off
iptraf
兩台主機之間有網線(或無線)、路由器、交換機等裝置,測試兩台主機之間的網絡性能的一個辦法就是在這兩個系統之間互發資料并統計結果,看看吞吐量、延遲、速率如何。iptraf 就是一個很好的檢視本機網絡吞吐量的好工具,支援文字圖形界面,很直覺。下面圖檔顯示在 100 mbps 速率的網絡下這個 linux 系統的發送傳輸率有點慢,outgoing rates 隻有 66 mbps.
# iptraf -d eth0
netperf
netperf 運作在 client/server 模式下,比 iptraf 能更多樣化的測試終端的吞吐量。先在伺服器端啟動 netserver:
# netserver
starting netserver at port 12865
starting netserver at hostname 0.0.0.0 port 12865 and family af_unspec
然後在用戶端測試伺服器,執行一次持續10秒的 tcp 測試:
# netperf -h 172.16.38.36 -l 10
tcp stream test from 0.0.0.0 (0.0.0.0) port 0 af_inet to 172.16.38.36 (172.16.38.36) port 0 af_inet
recv send send
socket socket message elapsed
size size size time throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 10.32 93.68
從以上輸出可以看出,網絡吞吐量在 94mbps 左右,對于 100mbps 的網絡來說這個性能算的上很不錯。上面的測試是在伺服器和用戶端位于同一個區域網路,并且區域網路是有線網的情況,你也可以試試不同結構、不同速率的網絡,比如:網絡之間中間多幾個路由器、用戶端在 wi-fi、××× 等情況。
netperf 還可以通過建立一個 tcp 連接配接并順序地發送資料包來測試每秒有多少 tcp 請求和響應。下面的輸出顯示在 tcp requests 使用 2k 大小,responses 使用 32k 的情況下處理速率為每秒243:
# netperf -t tcp_rr -h 172.16.38.36 -l 10 -- -r 2048,32768
tcp request/response test from 0.0.0.0 (0.0.0.0) port 0 af_inet to 172.16.38.36 (172.16.38.36) port 0 af_inet
local /remote
socket size request resp. elapsed trans.
send recv size size time rate
bytes bytes bytes bytes secs. per sec
16384 87380 2048 32768 10.00 243.03
16384 87380
iperf
iperf 和 netperf 運作方式類似,也是 server/client 模式,先在伺服器端啟動 iperf:
# iperf -s -d
------------------------------------------------------------
server listening on tcp port 5001
tcp window size: 85.3 kbyte (default)
running iperf server as a daemon
the iperf daemon process id : 5695
然後在用戶端對伺服器進行測試,用戶端先連接配接到伺服器端(172.16.38.36),并在30秒内每隔5秒對伺服器和用戶端之間的網絡進行一次帶寬測試和采樣:
# iperf -c 172.16.38.36 -t 30 -i 5
client connecting to 172.16.38.36, tcp port 5001
tcp window size: 16.0 kbyte (default)
[ 3] local 172.16.39.100 port 49515 connected with 172.16.38.36 port 5001
[ id] interval transfer bandwidth
[ 3] 0.0- 5.0 sec 58.8 mbytes 98.6 mbits/sec
[ 3] 5.0-10.0 sec 55.0 mbytes 92.3 mbits/sec
[ 3] 10.0-15.0 sec 55.1 mbytes 92.4 mbits/sec
[ 3] 15.0-20.0 sec 55.9 mbytes 93.8 mbits/sec
[ 3] 20.0-25.0 sec 55.4 mbytes 92.9 mbits/sec
[ 3] 25.0-30.0 sec 55.3 mbytes 92.8 mbits/sec
[ 3] 0.0-30.0 sec 335 mbytes 93.7 mbits/sec
tcpdump 和 tcptrace
tcmdump 和 tcptrace 提供了一種更細緻的分析方法,先用 tcpdump 按要求捕獲資料包把結果輸出到某一檔案,然後再用 tcptrace 分析其檔案格式。這個工具組合可以提供一些難以用其他工具發現的資訊:
# /usr/sbin/tcpdump -w network.dmp
tcpdump: listening on eth0, link-type en10mb (ethernet), capture size 96 bytes
511942 packets captured
511942 packets received by filter
0 packets dropped by kernel
# tcptrace network.dmp
1 arg remaining, starting with 'network.dmp'
ostermann's tcptrace -- version 6.6.7 -- thu nov 4, 2004
511677 packets seen, 511487 tcp packets traced
elapsed wallclock time: 0:00:00.510291, 1002714 pkts/sec analyzed
trace file elapsed time: 0:02:35.836372
tcp connection info:
1: zaber:54581 - boulder:111 (a2b) 6> 5< (complete)
2: zaber:833 - boulder:32774 (c2d) 6> 5< (complete)
3: zaber:pcanywherestat - 172.16.39.5:53086 (e2f) 2> 3<
4: zaber:716 - boulder:2049 (g2h) 347> 257<
5: 172.16.39.100:58029 - zaber:12865 (i2j) 7> 5< (complete)
6: 172.16.39.100:47592 - zaber:36814 (k2l) 255380> 255378< (reset)
7: breakpoint:45510 - zaber:7012 (m2n) 9> 5< (complete)
8: zaber:35813 - boulder:111 (o2p) 6> 5< (complete)
9: zaber:837 - boulder:32774 (q2r) 6> 5< (complete)
10: breakpoint:45511 - zaber:7012 (s2t) 9> 5< (complete)
11: zaber:59362 - boulder:111 (u2v) 6> 5< (complete)
12: zaber:841 - boulder:32774 (w2x) 6> 5< (complete)
13: breakpoint:45512 - zaber:7012 (y2z) 9> 5< (complete)
tcptrace 功能很強大,還可以通過過濾和布爾表達式來找出有問題的連接配接,比如,找出轉播大于100 segments 的連接配接:
# tcptrace -f'rexmit_segs>100' network.dmp
如果發現連接配接 #10 有問題,可以檢視關于這個連接配接的其他資訊:
# tcptrace -o10 network.dmp
下面的指令使用 tcptrace 的 slice 模式,程式自動在目前目錄建立了一個 slice.dat 檔案,這個檔案包含了每隔15秒的轉播資訊:
# tcptrace -xslice network.dmp
# cat slice.dat
date segs bytes rexsegs rexbytes new active
--------------- -------- -------- -------- -------- -------- --------
16:58:50.244708 85055 4513418 0 0 6 6
16:59:05.244708 110921 5882896 0 0 0 2
16:59:20.244708 126107 6697827 0 0 1 3
16:59:35.244708 151719 8043597 0 0 0 2
16:59:50.244708 37296 1980557 0 0 0 3
17:00:05.244708 67 8828 0 0 2 3
17:00:20.244708 149 22053 0 0 1 2
17:00:35.244708 30 4080 0 0 0 1
17:00:50.244708 39 5688 0 0 0 1
17:01:05.244708 67 8828 0 0 2 3
17:01:11.081080 37 4121 0 0 1 3