Iptables

Ubuntu 14.04 TCP 建立的雜湊表條目

  • October 2, 2015

一點背景

我在高流量下執行兩台伺服器,一台使用 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 設置它。

所以這是我的問題:

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

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

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

調整核心

高吞吐量計算管理指南

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