一个非常繁忙的代理服务器有很多“SYN to LISTEN sockets removed”。
我了解到一个原因可能是积压量太小。但在这种情况下,“套接字监听队列溢出的次数”值应该相等(但事实并非如此)。
那么导致此行为的原因是什么?可能是网卡坏了?
我们有 5 个代理,其中 2 个的两个数字不相等,所以这个问题似乎发生在那里。
以下是 netstat 的输出:
$ netstat -s | grep -i list
238627 times the listen queue of a socket overflowed
8610307 SYNs to LISTEN sockets dropped
服务器有 ipv4 和 ipv6 流量,也许有帮助?
答案1
这些计数器最终来自内核,并映射到LINUX_MIB_LISTENOVERFLOWS
和LINUX_MIB_LISTENDROPS
计数器。您可以从源代码中看到net/ipv4/tcp_ipv4.c(tcp_v4_syn_recv_sock)在第 1392 行左右,当LINUX_MIB_LISTENOVERFLOWS
增加时,LINUX_MIB_LISTENDROPS
也会增加,但存在只有后者可以增加的退出条件,因此它们不匹配不是一个错误。
在同一个文件中你可以看到这样的代码:
1291 int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
1292 {
1293 /* Never answer to SYNs send to broadcast or multicast */
1294 if (skb_rtable(skb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST))
1295 goto drop;
1296
1297 return tcp_conn_request(&tcp_request_sock_ops,
1298 &tcp_request_sock_ipv4_ops, sk, skb);
1299
1300 drop:
1301 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
1302 return 0;
1303 }
因此,您可以看到至少有一个原因是对广播或多播地址的 SYN。
答案2
通常 wmem 和 rmem 的默认值为 212992 字节。显然在繁忙的服务器上不够用。增加到 8MB 后问题就消失了。
sysctl -w net.core.wmem_default=8388608
sysctl -w net.core.rmem_default=8388608