http://blog.itpub.net/22664653/viewspace-714569/
Netperf是一種網路效能測量工具,主要針對基於TCP或UDP的傳輸,Netperf根據應用的不同,可以進行不同模式的網路效能測試,即批量資料轉送(bulk data transfer)模式和請求/應答(request/reponse)模式。Netperf測試結果所反映的是一個系統能夠以多快的速度向另外一個系統發送資料,以及另外一個系統能夠以多塊的速度接收資料。 一 netperf 簡介 1.1.工作原理 Netperf工具以client/server方式工作。server端是netserver,用來偵聽來自client端的串連,client端是netperf,用來向server發起網路測試.在client與server之間,首先建立一個控制串連,傳遞有關測試組態的資訊,以及測試的結果:在控制串連建立並傳遞了測試組態資訊以後,client與server之間會再建立一個測試連接,進行來回傳遞特殊的流量模式,以測試網路的效能.具體過程如下圖所示: 圖.1 建立串連 圖2 測試併產生結果 圖3 回傳結果 1.2 安裝 下載Netperf工具 # wget ftp://ftp.netperf.org/netperf/netperf-2.5.0.tar.gz # tar zxvf netperf-2.5.0.tar.gz # ./configure # make && make install 在unix系統中,可以直接運行可執行程式來啟動netserver。測試的時候,必須在兩台機器上同時安裝netperf,當netserver在server端啟動以後,就可以在client端運行netperf來測試網路的效能。 1.3 命令介紹 根據作用範圍的不同,netperf的命令列參數可以分為兩大類:全域命令列參數、測試相關的局部參數,兩者之間使用--分隔: Netperf [global options] –-[test-specific options] 其中: 全域命令列參數包括如下選項: -H host :指定遠端運行netserver的server IP地址。 -l testlen:指定測試的時間長度(秒) -t testname:指定進行的測試類型,包括TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR
測試相關的局部參數包括如下選項: -s size 設定本地系統的socket發送與接收緩衝大小 -S size 設定遠端系統的socket發送與接收緩衝大小 -m size 設定本地系統發送測試分組的大小 -M size 設定遠端系統接收測試分組的大小 -D 對本地與遠端系統的socket設定TCP_NODELAY選項
二 使用netperf進行網路測試 2.1 測試批量(bulk)網路流量的效能 批量資料轉送典型的例子有ftp和其它類似的網路應用(即一次傳輸整個檔案)。根據使用傳輸協議的不同,批量資料轉送又分為TCP批量傳輸和UDP批量傳輸。 1.TCP_STREAM Netperf預設情況下進行TCP批量傳輸,即-t TCP_STREAM。測試過程中,netperf向netserver發送批量的TCP資料分組,以確定資料轉送過程中的輸送量: [root@rac4 ~]# netperf -H 10.250.7.241 -l 60 MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) 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 60.12 826.89 從netperf測試的輸出結果,可以知道如下資訊: 1)遠端系統(即server)使用大小為87380位元組的socket接收緩衝 2)本地系統(即client)使用大小為16384位元組的socket發送緩衝 3)向遠端系統發送的測試分組大小為16384位元組 4)測試經曆的時間為60秒 5)輸送量的測試結果為826.89 Mbits/秒 在預設情況下,netperf向發送的測試分組大小設定為本地系統所使用的socket發送緩衝大小。 對於有問題的網路,我們可以修改上面介紹的測試局部參數,來判段是什麼原因導致網路的輸送量異常的。比如修改發送的包的大小來測試,來測試路由的緩衝是否合適 [root@rac4 ~]# netperf -H 10.250.7.241 -l 20 -- -m 20480 MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) 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 20480 20.00 787.26 [root@rac4 ~]# netperf -H 10.250.7.241 -l 20 -- -m 16384 MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) 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 20.00 998.21 [root@rac4 ~]# netperf -H 10.250.7.241 -l 20 -- -m 10240 MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) 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 10240 20.01 785.19 從上面的例子看來,增大或者減小都會影響網路的輸送量。預設的16384是最優的(我的測試環境是同一網段下的兩台VM,不具有代表性) 2.UDP_STREAM UDP_STREAM用來測試進行UDP批量傳輸時的網路效能。注意:此時測試分組的大小不得大於socket的發送與接收緩衝大小,否則netperf會報出錯提示: [root@rac4 ~]# netperf -t UDP_STREAM -H 10.250.7.241 -l 30 -- -m 262155 MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) port 0 AF_INET send_data: data send error: errno 90 netperf: send_omni: send_data failed: Message too long 我的測試環境socket 預設的緩衝大小為262144bytes! [root@rac3 ~]# netperf -t UDP_STREAM -H 10.250.7.220 -l 10 MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) port 0 AF_INET Socket Message Elapsed Messages Size Size Time Okay Errors Throughput bytes bytes secs # # 10^6bits/sec 262144 65507 10.00 28783 0 1508.00 262144 10.00 35376 1853.42 UDP_STREAM方式的結果中有兩行測試資料: 第一行:本地系統的發送統計,這裡的輸送量表示netperf向本地socket發送分組的能力。 第二行:遠端系統的接收統計。從上面的結果可以看出10.250.7.220 和 本地的輸送量是相近的。 在實際環境中,一般遠端系統的socket緩衝大小不同於本地系統的socket緩衝區大小,而且由於UDP協議的不可靠性,遠端系統的接收輸送量要遠遠小於發送出去的輸送量。 [root@rac4 ~]# netperf -t UDP_STREAM -H 10.250.7.241 -l 10 MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) port 0 AF_INET Socket Message Elapsed Messages Size Size Time Okay Errors Throughput bytes bytes secs # # 10^6bits/sec 262144 65507 10.00 42962 0 2251.09 262144 10.00 17866 936.13 接收的17866少於發送的42962,輸送量也有較大出入。 2.2 測試請求/應答(request/response)網路流量的效能 另一類常見的網路流量類型是應用在client/server結構中的request/response模式。在每次交易(transaction)中,client向server發出小的查詢分組,server接收到請求,經處理後返回大的結果資料。如下圖所示 1.TCP_RR TCP_RR方式的測試對象是多次TCP request和response的交易過程,但是它們發生在同一個TCP串連中,這種模式常常出現在資料庫應用中。資料庫的client程式與server程式建立一個TCP串連以後,就在這個串連中傳送資料庫的多次交易過程。 [root@rac3 ~]# netperf -t TCP_RR -H 10.250.7.220 MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) port 0 AF_INET : first burst 0 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec
16384 87380 1 1 10.00 10481.21 16384 87380 第一行顯示本地系統的資訊。 第二行顯示遠端系統的資訊。 平均的交易率(transaction rate)為 10481.21 次/秒。注意預設情況下每次交易中的request和response分組的大小都為1個位元組,不具有實際意義。 我們可以通過測試相關的參數來改變request和response分組的大小,TCP_RR方式下的參數如下表所示: 參數 說明 -r req,resp 設定request和reponse分組的大小 -s size 設定本地系統的socket發送與接收緩衝大小 -S size 設定遠端系統的socket發送與接收緩衝大小 -D 對本地與遠端系統的socket設定TCP_NODELAY選項 通過使用-r參數,我們可以進行更有實際意義的測試: [root@rac3 ~]# netperf -t TCP_RR -H 10.250.7.220 -- -r 64 64 MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) port 0 AF_INET : first burst 0 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 16384 87380 64 64 10.00 10631.44
2.TCP_CRR 與TCP_RR不同,TCP_CRR為每次交易建立一個新的TCP串連。最典型的應用就是HTTP,每次HTTP交易是在一條單獨的TCP串連中進行的。因此,由於需要不停地建立新的TCP串連,並且在交易結束後拆除TCP串連,交易率一定會受到很大的影響。 [root@rac3 ~]# netperf -t TCP_CRR -H 10.250.7.220 MIGRATED TCP Connect/Request/Response TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) 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 1 1 10.00 2988.56 <===明顯減小。 16384 87380 3.UDP_RR UDP_RR方式使用UDP分組進行request/response的交易過程。由於沒有TCP串連所帶來的負擔,所以交易率一定會有相應的提升。 [root@rac3 ~]# netperf -t UDP_RR -H 10.250.7.220 MIGRATED UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) port 0 AF_INET : first burst 0 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 262144 262144 1 1 10.00 97886.03 <===明顯上升。 262144 262144 三 參考資料: http://www.ibm.com/developerworks/cn/linux/l-netperf/ http://www.netperf.org/netperf/ http://staff.science.uva.nl/~jblom/gigaport/tools/man/netserver.html http://staff.science.uva.nl/~jblom/gigaport/tools/man/netperf.html