天天看點

network監控

  網絡的監測是所有 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

繼續閱讀