Ubuntu 14.04 TCP 建立的雜湊表條目
一點背景
我在高流量下執行兩台伺服器,一台使用 ubuntu 12.04(linux 3.2.0-69-generic),另一台使用 ubuntu 14.04(linux 3.13.0-52-generic)。我現在正試圖保護兩者。它們都有非常相似的硬體資源(相同數量的 CPU,但 12.04 的記憶體只有 8 GB,而 14.04 的記憶體為 16 GB)。
我想啟用 ufw 防火牆,但遇到了一些問題,即 nf_conntrack 表已滿。數據包基本上被丟棄了。
我通過降低超時並增加表大小以及儲存桶數量找到了解決方案。那是:
net.netfilter.nf_conntrack_tcp_timeout_established = 600 net.netfilter.nf_conntrack_max = 196608 net.netfilter.nf_conntrack_buckets = 24576
這些值已正確更新並在重新啟動後仍然有效。(請參閱此部落格)我還看到 conntrack_count 遠高於預設值,因此我確信這在兩台伺服器上都有效。這些值保持在限制範圍內,所以我確信它很好。
問題
12.04 伺服器在高負載下工作正常,但 14.04 不斷丟棄數據包,導致客戶端超時。現在在 14.04 啟動時,我可以在 kern.log 中看到這一行:
TCP established hash table entries: 131072 (order: 8, 1048576 bytes)
在 12.04 時,它是:
TCP established hash table entries: 524288 (order: 11, 8388608 bytes)
我懷疑這可能是我的伺服器丟棄數據包的原因,因為對於 14.04 的流量,此表可能太小。
所以我嘗試尋找一種方法來設置這個大小,並找到了參數 thash_entries看這裡解釋)。但是,我不能用 sysctl 設置它。
所以這是我的問題:
- 這個tcp連接表真的是我麻煩的根源嗎?還是我應該看看別的地方?
- 如果是,那麼我該如何設置它並使其在重新啟動後仍然存在?
提前感謝您的幫助,如果您需要更多幫助,請隨時詢問我。
PS我更像是一個開發者而不是系統專家,所以我會很感激任何詳細的答案:)
調整 Linux 核心以獲得高網路吞吐量是一門基於平衡的藝術。
增加連接跟踪表很好,但這意味著可能會使用更多的套接字,這反過來意味著系統需要更多的文件描述符,並且輪子繼續……
在您的情況下,我將從以下核心設置開始:
net.core.somaxconn
和
fs.file-max
第一個確定核心將維持的打開套接字的數量。第二個用於設置核心支持的已使用文件描述符的數量。
然後是可以進一步調整的 SYN backlog。
net.ipv4.tcp_max_syn_backlog
將設置可以等待來自伺服器的 ACK 的連接量。
net.ipv4.tcp_syncookies
要使 SYN Backlog 工作,您需要啟用 TCP SYN cookie。
最後,還可以進行一些調整,例如啟用 TIME_WAIT 連接重用。
net.ipv4.tcp_tw_reuse
這可能會減少當您收到峰值時將打開的“新”套接字的數量。
這只是冰山一角,我對大容量 Linux/Unix 系統的經驗是,您將對其進行幾個月的調整,然後才能獲得適當的平衡。
確保查看錯誤
/var/log/kern.log
並/var/log/messages
幫助進一步排除故障。