Linux
是什麼導致“SYN to LISTEN 套接字失去”?
一個非常繁忙的代理伺服器有很多“SYNs to LISTEN sockets drop”。
我了解到一個原因可能是積壓工作太小。但在這種情況下,“套接字的偵聽隊列溢出的次數”值應該相等(事實並非如此)。
那麼導致這種行為的原因是什麼?也許是壞了的網卡?
我們有 5 個代理,其中兩個數字不相等,所以這個問題似乎在那裡發生。
這裡是 netstat 的輸出:
$ netstat -s | grep -i list 238627 times the listen queue of a socket overflowed 8610307 SYNs to LISTEN sockets dropped
伺服器有 ipv4 和 ipv6 流量,也許這有幫助?
這些計數器最終來自核心並映射到
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。