net.ipv4.tcp_app_win 是做什麼的?
我無法弄清楚為什麼
tcp_adv_win_scale
andtcp_app_win
變數在 Linux 中共存。來自tcp(7)的資訊說:對於
tcp_adv_win_scale
:
tcp_adv_win_scale
(整數;預設值:2;從 Linux 2.4 開始)*
bytes/2^tcp_adv_win_scale
*如果 *tcp_adv_win_scale
大於 0 ,則將緩沖成本計為;或bytes-bytes/2^(-tcp_adv_win_scale)
,如果tcp_adv_win_scale
*小於或等於零。套接字接收緩衝區空間在應用程序和核心之間共享。TCP 維護部分緩衝區作為 TCP 視窗,這是向另一端通告的接收視窗的大小。其餘空間用作“應用程序”緩衝區,用於將網路與調度和應用程序延遲隔離開來。*
tcp_adv_win_scale
*預設值 2 意味著用於應用程序緩衝區的空間是總數的四分之一。對於
tcp_app_win
:
tcp_app_win
(整數;預設值:31;從 Linux 2.4 開始)此變數定義為緩沖成本保留的 TCP 視窗字節數。 視窗中最多*
window/2^tcp_app_win
*保留 ( , mss) 字節供應用程序緩衝區使用。值 0 表示沒有預留金額。所以我不確定到底發生了什麼
tcp_app_win
變化。在我看來,這兩個變數都可以用來調整 TCP 應用程序緩衝區,因此不需要一起更改它們。我是對的嗎?
我找到了有關
tcp_adv_win_scale
. 該頁面的標題是:TCP 性能調整 - 如何調整 linux。摘抄
TCP 性能受到延遲和視窗大小(以及成本,這會減少有效視窗大小)的限制,具體取決於 window_size/RTT(這是在任何給定時刻可以通過鏈路“傳輸”的數據量)。
要獲得可能的實際傳輸速度,您必須將結果視窗除以延遲(以秒為單位):
成本為:window/2^tcp_adv_win_scale(tcp_adv_win_scale 預設為 2)
因此對於接收視窗 (tcp_rmem) 的 linux 預設參數:87380 - (87380 / 2^2) = 65536。
給定一個跨大西洋鏈路(150 ms RTT),最大性能最終達到:65536/0.150 = 436906 字節/秒或大約 400 字節/秒,這在今天真的很慢。
隨著預設大小的增加:(873800 - 873800/2^2)/0.150 = 4369000 字節/秒,或大約 4Mbytes/s,這對於現代網路來說是合理的。請注意,這是預設設置,如果發送方配置了更大的視窗大小,它會很高興地擴展到 10 倍(8738000*0.75/0.150 = ~40Mbytes/s),這對於現代網路來說非常好。
2.6.17 及更高版本具有相當好的預設值,如果對方支持,實際上會將視窗大小調整到允許的最大值。因此,從那時起,本指南的大部分內容就不再需要了。但是,為了獲得良好的長途吞吐量,可能需要增加最大值。
我能夠遵循這一點,但不太了解這兩個變數之間的關係(如果有的話)。
我只是勉強理解那試圖解釋什麼。在核心聽起來這個參數來縮放緩衝空間的數量將用於 TCP 和應用程序。
再搜尋一下,我發現這些解釋更有意義。該頁面的標題為:Ipsysctl tutorial 1.0.4 - Chapter 3. IPv4 variable reference。
摘抄
3.3.2. tcp_adv_win_scale
這個變數用於告訴核心有多少套接字緩衝區空間應該用於 TCP 視窗大小,以及為應用程序緩衝區保存多少空間。如果 tcp_adv_win_scale 為負數,則使用以下等式計算視窗縮放的緩衝區成本:
其中 bytes 是視窗中的字節數。如果 tcp_adv_win_scale 值為正,則使用以下公式計算緩衝區成本:
tcp_adv_win_scale 變數採用整數值,預設設置為 2。這反過來意味著應用程序緩衝區是 tcp_rmem 變數中指定的總緩衝區空間的 1/4。
3.3.3. tcp_app_win
該變數告訴核心要為特定 TCP 視窗在傳輸特定 TCP 視窗的 TCP 套接字記憶體緩衝區中保留多少字節。該值用於指定要保留多少緩衝區空間的計算,如下所示以下:
從上面的計算你可能會明白,這個值越大,特定視窗的緩衝區空間就越小。這個計算的唯一例外是 0,它告訴核心不為這個特定的連接保留空間。此變數的預設值為 31,通常應該是一個不錯的值。除非您知道自己在做什麼,否則不要更改此值。
基於這些解釋,它聽起來像第一個參數,
tcp_adv_win_scale
是控制套接字緩衝區空間的分割,即它如何被劃分為 TCP 視窗使用與應用程序緩衝區。而第二個參數是指定要為描述
tcp_app_win
中提到的應用程序緩衝區保留的字節數。tcp_adv_win_scale