Linux

net.ipv4.tcp_app_win 是做什麼的?

  • January 28, 2022

我無法弄清楚為什麼tcp_adv_win_scale and tcp_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 套接字記憶體緩衝區中保留多少字節。該值用於指定要保留多少緩衝區空間的計算,如下所示以下:

公式的 ss

從上面的計算你可能會明白,這個值越大,特定視窗的緩衝區空間就越小。這個計算的唯一例外是 0,它告訴核心不為這個特定的連接保留空間。此變數的預設值為 31,通常應該是一個不錯的值。除非您知道自己在做什麼,否則不要更改此值。

基於這些解釋,它聽起來像第一個參數,tcp_adv_win_scale是控制套接字緩衝區空間的分割,即它如何被劃分為 TCP 視窗使用與應用程序緩衝區。

而第二個參數是指定要為描述tcp_app_win中提到的應用程序緩衝區保留的字節數。tcp_adv_win_scale

引用自:https://unix.stackexchange.com/questions/94770