是什麼原因導致「SYN to LISTEN 套接字遺失」?

是什麼原因導致「SYN to LISTEN 套接字遺失」?

一個非常繁忙的代理伺服器有很多“SYN 到 LISTEN 套接字被丟棄”。

我了解到原因之一可能是積壓量太小。但在這種情況下,「套接字的監聽佇列溢位的次數」值應該相等(但事實並非如此)。

那麼造成這種行為的原因是什麼呢?也許是網卡壞了?

我們有 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_LISTENOVERFLOWSLINUX_MIB_LISTENDROPS計數器。從原始碼你可以看到淨/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

相關內容