
一個非常繁忙的代理伺服器有很多“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_LISTENOVERFLOWS
和LINUX_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