為什麼有些 tcp_rw_r在rw?mem$ voodoo 顯示所有相等的值?
查看 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 將更加低效,因為它開始將緩衝區折疊在一起以減少記憶體使用量,這將導致%sys
CPU 使用率高於實際情況必需的。如果有足夠的記憶體壓力,核心將開始丟棄數據包,首先從無序隊列,然後是主接收隊列。
tcp_rmem
可調參數的正確值為:
- 低:4kb 或 8k(如果不是 x86,則為一頁或兩頁)
- 預設值:最常用連接的BDP
- high:比預設值大的一些值,允許批量傳輸和應用程序從套接字緩衝區讀取時的延遲
對於 1Gbps,4Mb~6Mb 通常就足夠了。對於 10Gbps,您可能希望高達 16Mb。我還沒有看到比這更高的系統有用,但也許存在這樣的系統。
您通常可以將
tcp_wmem
可調參數保持原樣。系統啟動並為網路連接提供服務的時間越長,TCP 的自動調整就越能根據先前連接的 BDP 和 RTT 預測理想的預設緩衝區大小。