Linux

為什麼有些 tcp_rw_r在rw?mem$ voodoo 顯示所有相等的值?

  • September 20, 2019

查看 Internet 上的 TCP 優化指南,一個常見的主題是將 tcp_mem、tcp_rmem 或 tcp_wmem 三整數向量設置為在 sysctl.conf 文件中具有相等的值。

借用 TCP 手冊頁,這些值的功能描述如下:

低的

  • 當全域分配的頁數低於此數字時,TCP 不會調節其記憶體分配。

壓力

  • 當 TCP 分配的記憶體量超過此頁數時,TCP 會緩和其記憶體消耗。一旦分配的頁數低於低標記,就會退出此記憶體壓力狀態。

高的

  • TCP 將在全域範圍內分配的最大頁數。此值會覆蓋核心施加的任何其他限制。

也許我瘋了,但根據這些描述,設置相等的值可能會導致可怕的內部衝突。

關於 Linux 核心中的 TCP 記憶體,比我更聰明的人可以談論將這些值設置為相等的效果嗎?

你是對的,很多人不知道他們在說什麼,也沒有獨立思考,所以他們只是從其他地方購買狂熱的設置,而不了解這些設置的作用或可調參數的真正含義。

你顯然不是那些人中的一員。投贊成票!

將可調參數的所有三個值設置tcp_.mem為相同的值會破壞 TCP 自動調整緩衝區大小和記憶體使用(net.ipv4.tcp_moderate_rcvbuf=1可調參數)的能力,這是 Linux TCP 實現的一個很好的優勢。

假設這些值都很高,這將是對 TCP 記憶體的低效使用。

如果創建了足夠多的套接字來達到定義的上限net.ipv4.tcp_mem(請注意,這些是以頁數而不是字節數來衡量的),那麼 TCP 將更加低效,因為它開始將緩衝區折疊在一起以減少記憶體使用量,這將導致%sysCPU 使用率高於實際情況必需的。

如果有足夠的記憶體壓力,核心將開始丟棄數據包,首先從無序隊列,然後是主接收隊列。

tcp_rmem可調參數的正確值為:

  • 低:4kb 或 8k(如果不是 x86,則為一頁或兩頁)
  • 預設值:最常用連接的BDP
  • high:比預設值大的一些值,允許批量傳輸和應用程序從套接字緩衝區讀取時的延遲

對於 1Gbps,4Mb~6Mb 通常就足夠了。對於 10Gbps,您可能希望高達 16Mb。我還沒有看到比這更高的系統有用,但也許存在這樣的系統。

您通常可以將tcp_wmem可調參數保持原樣。

系統啟動並為網路連接提供服務的時間越長,TCP 的自動調整就越能根據先前連接的 BDP 和 RTT 預測理想的預設緩衝區大小。

引用自:https://serverfault.com/questions/613504