![被“TCP:时间等待存储桶表溢出”错误所困扰——我该怎么做才能缓解?](https://linux22.com/image/692026/%E8%A2%AB%E2%80%9CTCP%EF%BC%9A%E6%97%B6%E9%97%B4%E7%AD%89%E5%BE%85%E5%AD%98%E5%82%A8%E6%A1%B6%E8%A1%A8%E6%BA%A2%E5%87%BA%E2%80%9D%E9%94%99%E8%AF%AF%E6%89%80%E5%9B%B0%E6%89%B0%E2%80%94%E2%80%94%E6%88%91%E8%AF%A5%E6%80%8E%E4%B9%88%E5%81%9A%E6%89%8D%E8%83%BD%E7%BC%93%E8%A7%A3%EF%BC%9F.png)
我有一个运行 Debian 7(proxmox)的旧系统,托管 OpenVZ 容器,我发现一个麻烦的问题,即系统因与运行 apache 前端的 VZ 容器的开放连接而无法承受。
发生这种情况时,服务器上的日志会充满数千个“TCP:时间等待存储桶表溢出 (CT233)”错误。同时,Web 服务器的响应也很慢。我可以做些什么来缓解这个问题?
在谷歌搜索之后,我对各种 conntrack 设置进行了一些调整,但我一直不愿意做任何过于激进的事情,除非更好地了解可能产生的后果(或者,实际上,这在任何情况下是否真的可能有帮助)
为了了解情况,以下是今天发生这种情况时“sysctl -a | grep conntrack”的输出:
net.netfilter.nf_conntrack_generic_timeout = 480
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 345600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_tcp_loose = 1
net.netfilter.nf_conntrack_tcp_be_liberal = 0
net.netfilter.nf_conntrack_tcp_max_retrans = 3
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_acct = 0
net.netfilter.nf_conntrack_events = 1
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.netfilter.nf_conntrack_max = 131072
net.netfilter.nf_conntrack_count = 128397
net.netfilter.nf_conntrack_buckets = 32768
net.netfilter.nf_conntrack_checksum = 1
net.netfilter.nf_conntrack_log_invalid = 0
net.netfilter.nf_conntrack_expect_max = 256
net.nf_conntrack_max = 131072
这包括我今天所做的几项更改:我将 nf_conntrack_buckets 从 16384 增加了一倍至 32768,将 conntrack_generic_timeout 从 600 秒缩短至 480 秒,并将 conntrack_tcp_timeout_established 从 5 天缩短至 4 天。
任何给定时间的绝大多数打开的连接都处于 TIME_WAIT 状态。
我希望有人比我更了解 TCP/Kernel 调整,可以推荐一些东西。
谢谢!
答案1
我最终调整了另外两个变量,将它们都加倍:“net.ipv4.tcp_max_tw_buckets”和“net.ipv4.tcp_max_tw_buckets_ub”,自从做出这些改变以来,“时间等待桶表溢出”错误没有再次出现。不过,我将在接下来的一周左右密切关注它,看看这是否真的解决了这个问题。