Настройка сети Linux для предотвращения tcp rcvpruned и отставание?
Мои датоды в моем кластере hbase вызывают некоторые tcp rcvpruned и время от времени сбрасывают отставание:
Кажется, что есть по крайней мере два угла, чтобы приблизиться к этому в:
- Настройте HBase/HDFS и т. Д., Чтобы они не запускались
- Настройте сетевой стек Linux, чтобы иметь возможность обрабатывать эти
Я заинтересован в том, чтобы лучше понять эти две метрики и получить полезные советы по любому из этих двух путей. Кто-нибудь может посоветовать конкретные дальнейшие шаги?
1 ответ
tcp_v4_rcv
[0] звонки sk_add_backlog
и если он терпит неудачу, он увеличивается TCPBacklogDrop
2014 } else if (unlikely(sk_add_backlog(sk, skb,
2015 sk->sk_rcvbuf + sk->sk_sndbuf))) {
2016 bh_unlock_sock(sk);
2017 NET_INC_STATS_BH(net, LINUX_MIB_TCPBACKLOGDROP);
2018 goto discard_and_relse;
2019 }
sk_add_backlog
не удается, только если sk_rcvqueues_full
[1]:
801 /* The per-socket spinlock must be held here. */
802 static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *skb,
803 unsigned int limit)
804 {
805 if (sk_rcvqueues_full(sk, skb, limit))
806 return -ENOBUFS;
807
808 __sk_add_backlog(sk, skb);
809 sk->sk_backlog.len += skb->truesize;
810 return 0;
811 }
Основная функция __sk_add_backlog
недавно [2] разрешил прохождение хотя бы одного пакета:
+ * Do not take into account this skb truesize,
+ * to allow even a single big packet to come.
Я полагаю, что применение этого патча к вашему ядру должно решить проблему. Также вы можете попытаться увеличить размер буфера rcv по умолчанию как в ОС, так и в приложении (setsockopt
SO_RCVBUF
)
И ваш второй вопрос о RcvPruned
- Linux увеличивает этот показатель внутри tcp_prune_queue
[3]. Эта функция обычно вызывается, когда сокет выходит за пределы rcv. Итак, еще раз вы можете увеличить rmem
/SO_RCVBUF
и / или настроить ваше приложение для более частых вызовов read() (я полагаю, что ваши отбрасывания тесно связаны с паузами Java Stop-The-World GC. Итак, настройте ваш GC).
[0] http://lxr.free-electrons.com/source/net/ipv4/tcp_ipv4.c?v=3.15#L2014
[1] http://lxr.free-electrons.com/source/include/net/sock.h?v=3.15#L802
[2] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=0fd7bac6b6157eed6cf0cb86a1e88ba29e57c033
[3] http://lxr.free-electrons.com/source/net/ipv4/tcp_input.c?v=3.15#L4662