Довольно загруженный прокси-сервер имеет множество «сброшенных сокетов SYN to 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, может это поможет?
Эти счетчики в конечном итоге поступают из ядра и отображаются в 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 для широковещательного или многоадресного адреса.
Обычно значения по умолчанию для wmem и rmem составляют 212992 байта. Видимо не хватает на загруженном сервере. Поднял до 8МБ и проблема исчезла.
sysctl -w net.core.wmem_default=8388608
sysctl -w net.core.rmem_default=8388608