Was führt dazu, dass „SYN-zu-LISTEN-Sockets gelöscht werden“?

Was führt dazu, dass „SYN-zu-LISTEN-Sockets gelöscht werden“?

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_LISTENOVERFLOWSund LINUX_MIB_LISTENDROPSZä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_LISTENOVERFLOWSerhöht wird, LINUX_MIB_LISTENDROPSauch 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

verwandte Informationen