我有一个运行 Debian 7 (proxmox) 托管 OpenVZ 容器的遗留系统,我看到一个麻烦的问题,即系统被与运行 apache 前端的 VZ 容器的开放连接所淹没。
发生这种情况时,服务器上的日志会充满数千个“TCP:时间等待桶表溢出 (CT233)”错误。这与来自网络服务器的缓慢响应相结合。我能做些什么来缓解这个问题吗?
在谷歌搜索之后,我对各种 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 从 600s 缩小到 480s,并将 conntrack_tcp_timeout_builted 从 5d 缩小到 4d。
在任何给定时间,绝大多数打开的连接都在 TIME_WAIT 中。
我希望有比我推荐的更了解 TCP/内核调优的人。
谢谢!
我最终调整了另外两个变量,将它们中的每一个加倍:“net.ipv4.tcp_max_tw_buckets”和“net.ipv4.tcp_max_tw_buckets_ub”,并且由于进行了这些更改,“时间等待桶表溢出”错误没有再次发生。但是,我将在接下来的一周左右的时间里密切关注它,看看这是否真的解决了这个问题。