Объем 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

Проблема в слишком “общей” картине таких метрик. Виден факт ретрансмита, но направление неизвестно, приходится гадать. Можно расширить набор собираемых метрик 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а: node_exporter

Функционал доступен начиная с версии 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])

Удачи!