socket buffer size對帶寬的影響:iperf 測試結果


在刀片2的 cmm02node06--->cmm02node01 兩個結點上,將包長固定在2KB, 用-w選項改變socket buffer size大小,用iperf軟件測試兩個節點之間的tcp傳輸帶寬,觀察隨着socket buffer size的變化,傳輸帶寬的變化情況:

1. 只改變發送端的socket buffer size;

2. 只改變接收端的socket buffer size;

3. 同時改變發送端和接收端的socket buffer size.

在不改變發送和接收緩沖區的大小時:

發送端默認的發送緩沖區大小為19.3KB

接收端默認的接收緩沖區大小為85.3 KB

通過-w win 設置緩沖區大小時,若設置成功,緩沖區大小將被設置為(2*win)Byte; 若設置失敗,則緩沖區大小不確定。通過不斷增大win值,測得,cmm02node01和cmm02node06的緩沖區大小最大為1GB,繼續增大win值時,設置的緩沖區大小反而變小了。證明1GB是這兩個服務器的發送緩沖區和接收緩沖區的上限。《unix 網絡編程卷一:P164》

當 win 為 1KB 時,應將發送緩沖區大小設置為2KB,發現實際上卻被設置為2.23KB.  (why?不知道)

1. 只改變發送端的socket buffer size時,接收端的緩沖區大小為85.3KB。

在 發送緩沖區 <1MB 時, 隨着發送緩沖區的增加,帶寬逐漸緩慢增加;

在發送緩沖區 > 1MB 后,帶寬較快的變大。

win 值 為 1GB 時, 發送緩沖區被設置為 2KB, 帶寬減小到 219 Mb/s。

  下面描述了某個應用程序寫數據到一個TCP套接字中時發生的步驟。unix 網絡編程卷一:P48》

  每個TCP套接字有一個發送緩沖區,我們可以用SO_SNDBUF套接字選項來更改該緩沖區的大小。當某個應用進程調用write時,內核從該應用進程的緩沖區中復制所有數據到所寫套接字的發送緩沖區。如果該套接字的發送緩沖區容不下該應用進程的所有數據(或是應用進程的緩沖區大於套接字的發送緩沖區,或是套接字的發送緩沖區中已有其它數據),該應用進程將被投入睡眠。這里假設該應用進程是阻塞的,它是通常的默認設置。內核將不從write系統調用返回,直到應用進程緩沖區中的所有數據都復制到套接字發送緩沖區。因此,從寫一個TCP套接字的write調用成功返回僅僅表示我們可以重新使用原來的應用進程緩沖區,並不表明對端的TCP或應用進程已接收到數據。

  這一端的TCP提取套接字發送緩沖區中的數據並把它發送給對端TCP, 其過程基於TCP數據傳送的所有規則(TCPv1的第19章和第20章,有待詳細閱讀)。對端TCP必須確認收到的數據,伴隨來自對端的ACK的不斷到達,本端TCP至此才能從套接字發送緩沖區中丟棄已確認的數據。TCP必須為已發送的數據保留一個副本,直到它被對端確認為止。

  本端TCP以MSS大小的或更小的塊把數據傳遞給IP, 同時給每個數據塊安上一個TCP首部以構成TCP分節,其中MSS或是由對端通告的值,或是536(若對端未發送一個MSS選項)。(536是IPv4最小重組緩沖區字節數576減去IPv4首部字節數20和TCP首部字節數20的結果。)IP給每個TCP分節安上一個IP首部以構成IP數據報,並按照其目的IP地址查找路由表項以確定外出接口,然后把數據報傳遞給相應的數據鏈路。 IP可能在把數據報傳遞給數據鏈路之前將其分片,不過我們已經談到MSS選項的目的之一就是試圖避免分片,較新的實現還使用了路徑MTU發現功能(之前的測試表明,刀片2上支持路徑MTU發現功能)。每個數據鏈路都有一個輸出隊列,如果該隊列已滿,那么新到的分組將被丟棄,並沿協議棧向上返回一個錯誤:從數據鏈路到IP, 再從IP到TCP。TCP將注意到這個錯誤,並在以后的某個時刻重傳相應的分節。應用程序並不知道這種暫時的情況。

 

2. 只改變接收端的socket buffer size時, 發送端的緩沖區大小為19.3KB。

隨着接收端緩沖區大小的增加,帶寬先增加,后降低;在256KB時,達到最大值。在接收緩沖區大於256KB后,帶寬的趨勢是突然降低,並隨后保持在較低水平。

 

接收緩沖區被TCP用來保存接收到的數據,直到由應用程序來讀取。對於TCP來說,套接字接收緩沖區中可用空間的大小限定了TCP通告對端的窗口大小。TCP套接字接收緩沖區不可能溢出,因為不允許對端發出超過本端所通告窗口大小的數據。這就是TCP的流量控制,如果對端無視窗口大小而發出了超過該窗口大小的數據,本端TCP將丟棄它們。

 

3. 同時改變發送端和接收端的socket buffer size時。

當緩沖區大小 < 1MB 時, 隨着緩沖區的增加,帶寬緩慢增加,逐漸平穩在一個較低值;

當緩沖區大小 > 1MB 后,隨着緩沖區的增加,帶寬先大幅度增加后降低並保持在8~9Gb/s。

 

比較三種情況下的帶寬曲線: 

可以從上圖得出的結論是,在現有的網絡和硬件環境下, 要得到較大的帶寬,有3種情況:

1. 只設置接收端緩沖區大小是達不到最大帶寬的,但是接收緩沖區為256KB是一個較好的設置值,可以固定接收端為256KB, 繼續測試出一組最佳匹配值。

2. 設置較大的發送端和接收端窗口,最佳匹配是[8MB, 8MB], 也可在最佳匹配值左右進行選擇。

3. 只設置大的發送端的緩沖區大小,>=16MB,  此時的帶寬能達到12~14Gb/s

 

1. 固定接收端緩沖區為256KB

將接收端的緩沖區大小固定為256KB,改變發送端的緩沖區大小,測試一組帶寬值以找到發送端緩沖區最佳匹配值。由於發送端的發送緩沖區大小設置應大於帶寬延遲乘積(見unix 網絡編程卷一:P164》),通過ping命令得到cmm02node01與cmm02node06之間的RTT在0.1ms與0.2ms之間,保守估計按照0.2ms計算,對40Gb以太網數據鏈路,帶寬延遲乘積=40Gb/(8bits/Byte)*0.2ms/(1000ms/s)=1MB, 也就是說,在發送緩沖區小於1MB時,兩個通信結點之間的管道容量不會被填滿,帶寬將不會達到期望值。因此,在下面的測試曲線中,發送緩沖區最小設置為1MB, 最大設置為1GB。

由下圖可以看出,固定接收端緩沖區大小為256KB時, 得到的最佳匹配值為[256KB,>= 16MB], 此時的帶寬能達到12Gb/s左右。

2. 固定接收端緩沖區大小為8MB

為了驗證第二組最佳匹配值,將接收端的緩沖區大小設置為8MB, 發送端緩沖區大小區間為 [1MB, 1GB] , 進行了一組測試。測試結果如下: 從圖中可以看出第二組最佳匹配值為[8MB, >=8MB], 此時的帶寬能達到12Gb/s左右。

綜上所述:

在尋找ROS的socket 緩沖區的最佳匹配值時,有三種匹配值可供選擇:

1. 只設置發送緩沖區 >= 16MB

2. [256KB,>= 16MB]

3. [8MB, >=8MB]

結論就是,發送緩沖區必須要大, 接收緩沖區在 默認85.3,256KB左右 ,8MB 及以上這三個區間擇優選擇,最大的帶寬應該在12Gb/s左右。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM