被“TCP:时间等待存储桶表溢出”错误所困扰——我该怎么做才能缓解?

被“TCP:时间等待存储桶表溢出”错误所困扰——我该怎么做才能缓解?

我有一个运行 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”,自从做出这些改变以来,“时间等待桶表溢出”错误没有再次出现。不过,我将在接下来的一周左右密切关注它,看看这是否真的解决了这个问题。

相关内容