Ubuntu 14.04 TCP建立哈希表條目

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 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 設定它。

這是我的問題:

  1. 這張tcp連結表真的是我的麻煩根源嗎?或者我應該去別的地方看看?
  2. 如果是,那麼我該如何設定它並使其在重新啟動後仍然存在?

預先感謝您的幫助,如果您需要更多幫助,請隨時詢問我。

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以協助進一步排除故障。

調整內核

高吞吐量運算管理指南

相關內容