一些背景
我在高流量下運行兩台伺服器,一台使用 ubuntu 12.04 (linux 3.2.0-69-generic),另一台使用 ubuntu 14.04 (linux 3.13.0-52-generic)。我現在正在努力確保兩者的安全。它們都具有非常相似的硬體資源(CPU 數量相同,但 12.04 只有 8 GB RAM,而 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 我比較像是開發人員而不是系統專家,所以我將不勝感激任何詳細的答案:)
答案1
調整 Linux 核心以獲得高網路吞吐量是一門基於平衡的藝術。
增加連接追蹤表很好,但這意味著可能會使用更多的套接字,這反過來意味著系統需要更多的檔案描述符,而輪子還在繼續...
對於您的情況,我將從以下內核設定開始:
net.core.somaxconn
和
fs.file-max
第一個確定核心將維持的打開套接字的數量。第二個用於設定核心支援的已使用檔案描述符的數量。
然後是可以進一步調整的 SYN 積壓。
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
以協助進一步排除故障。