Объем TCP ретрансмитов пожалуй один из наиболее говорящих симптомов деградации системы.
Причины возникновения могут быть различны, самые частые в моей практике:
- переполнения очередей, на уровнях сетевого оборудования, NIC, операционной системы, сокетов, etc;
- out of order пакеты, связанные например с неоднородными маршрутами в рамках одного сетевого потока.
В момент проблемы хочется быстро ее обнаружить и определить источник.
Стандартные утилиты
На помощь приходят встроенные в linux утилиты:
netstat -s | grep -i retr
3951614 segments retransmitted
1434 times recovered from packet loss due to fast retransmit
Detected reordering 149 times using reno fast retransmit
TCPLostRetransmit: 2931590
981 timeouts after reno fast retransmit
3538 fast retransmits
4126 retransmits in slow start
TCPSynRetrans: 3918500
Те же метрики мы можем собрать и node_exporter’ом:
Проблема в слишком “общей” картине таких метрик. Виден факт ретрансмита, но направление неизвестно, приходится гадать. Можно расширить набор собираемых метрик node_exporter, что даст еще полезного контекста:
добавив флаг netstat коллектора:
--collector.netstat.fields="^.*TcpExt*.*$"
У Arthur Chiao есть толковая статья про типы ретрансмитов TCP Retransmission May Be Misleading (2023).
Но проблема направлений никуда не делась.
ebpf
Следующий уровень осознанности в этом вопросе можно достичь через bcc/bpftrace версии утилиты tcpretrans.
В моменте можно получить не только факт и тип ретрансмита, но и его направление!
# ./tcpretrans
TIME PID IP LADDR:LPORT T> RADDR:RPORT STATE
01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 ESTABLISHED
01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 ESTABLISHED
01:55:17 0 4 10.153.223.157:22 R> 69.53.245.40:22957 ESTABLISHED
[...]
# https://github.com/iovisor/bcc/blob/master/tools/tcpretrans_example.txt
Проблема в ключевом слове “в моменте” - зачастую расследование приходится проводить постфактум, а релевантных данных уже нет. Хочется собирать такие данные в виде метрик и отрисовывать в grafana.
tcp-retransmit (ebpf_exporter)
Для этого я отправил PR в отличный инструмент от cloudflare ebpf_exporter, в котором постарался перенести логику из bcc на новые рельсы.
Теперь направления ретрансмитов доступны в grafanа:
Функционал доступен начиная с версии v2.3.0.
Чтобы воспользоваться утилитой:
make -C examples clean build
sudo ./ebpf_exporter --config.dir=examples --config.names=tcp-retransmit
Для визуализации потребуется несложный PromQL запрос:
increase(ebpf_exporter_tcp_retransmit_ipv4_packets_total[$__interval])
Удачи!