
Bei einem stark ausgelasteten Proxyserver werden viele „SYNs zu LISTEN-Sockets gelöscht“.
Ich habe gelernt, dass eine Ursache eine zu kleine Backlog-Größe sein könnte. Aber in diesem Fall sollte der Wert „Häufigkeit, in der die Listenwarteschlange eines Sockets übergelaufen ist“ gleich sein (was er nicht ist).
Was könnte also die Ursache für dieses Verhalten sein? Vielleicht ein defekter Netzwerkadapter?
Wir haben 5 Proxys, bei 2 davon sind die beiden Zahlen nicht gleich, also scheint dieses Problem dort aufzutreten.
Hier die Ausgabe von netstat:
$ netstat -s | grep -i list
238627 times the listen queue of a socket overflowed
8610307 SYNs to LISTEN sockets dropped
die Server haben IPv4- und IPv6-Verkehr, vielleicht hilft das?
Antwort1
Diese Zähler kommen letztendlich vom Kernel und werden den LINUX_MIB_LISTENOVERFLOWS
und LINUX_MIB_LISTENDROPS
Zählern zugeordnet. Sie können aus der Quelle vonnet/ipv4/tcp_ipv4.c(tcp_v4_syn_recv_sock)um Zeile Nr. 1392 herum, dass, wenn LINUX_MIB_LISTENOVERFLOWS
erhöht wird, LINUX_MIB_LISTENDROPS
auch erhöht wird, aber es gibt Abbruchbedingungen, bei denen nur Letzteres erhöht werden kann, sodass es kein Fehler ist, wenn sie nicht übereinstimmen.
In derselben Datei sehen Sie diesen Code:
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 }
Sie sehen also, dass zumindest eine Ursache ein SYN an eine Broadcast- oder Multicast-Adresse ist.
Antwort2
Normalerweise beträgt die Standardgröße von wmem und rmem 212992 Byte. Anscheinend nicht genug auf einem ausgelasteten Server. Auf 8 MB erhöht und das Problem war verschwunden.
sysctl -w net.core.wmem_default=8388608
sysctl -w net.core.rmem_default=8388608