Протокол TCP обеспечивает множество функций, включая управление перегрузками.
Для этого используется механизм скользящего окна (sliding window) — объём данных, который отправитель передаёт без подтверждения от получателя.
Размер окна динамически регулируется в зависимости от объёма свободного места в буфере получателя (
net.ipv4.tcp_rmem).Когда буфер получателя заполняется (получатель не успевает за отправителем), TCP расценивает это как перегрузку и уменьшает размер окна в ACK-сегменте вплоть до нуля (Zero Window Advertisement).
Таким образом, при корректной настройке скорости между отправителем и получателем, переполнения очередей удаётся избежать.
С одной стороны, это позволяет избежать потерь пакетов, ретрансмитов и лишней нагрузки на сеть. С другой — мы можем не заметить, что получатель замедлился, и проблема останется скрытой.
❗️❗️❗️Интерпретация метрик ниже ошибочна, за исправленным описанием прошу сюда https://t.me/troubleperf/65 ❗️❗️❗️
К счастью
/proc/net/netstat позволяет отслеживать события, связанные с нулевым окном:*
TCPFromZeroWindowAdv — сколько раз отправитель получил уведомление о нулевом окне;*
TCPToZeroWindowAdv — сколько раз получатель установил нулевое окно;*
TCPWantZeroWindowAdv — общее время, когда отправитель не мог отправить данные из-за нулевого окна;*
TCPZeroWindowDrop — сколько раз отправитель отбрасывал пакеты из-за нулевого окна.Эти метрики вместе с классическими показателями переполнения буфера и out-of-order очереди позволяют точнее оценивать состояние системы и вовремя выявлять возможные проблемы.
☝️ показатели нулевого окна доступны в node_exporter через коллектор netstat
P.S. Лайк можно занести сюда.
tags: #tcp #linux