Я тестировал соединение WebSocket, когда заметил джиттер; некоторые TCP-пакеты задерживались. Поэтому я начал пинговать пункт назначения. Как только я это сделал, TCP-пакеты перестали задерживаться, странно. Я прекратил пинговать; я снова начал получать джиттер.
Похоже, что если трафик превышает определенный порог, то сетевой адаптер больше не испытывает джиттера, однако ниже этого порога он, похоже, задерживает пакеты.
Я снова проверил это, пингуя другие сайты, не связанные с путем соединения WebSocket, и это тоже устраняет джиттер. Это также происходит независимо от трафика и пути, например, если я транслирую данные из другого места назначения и тестирую соединение WS, джиттера нет. Это, похоже, указывает на то, что это относится к локальному сетевому интерфейсу, поскольку это единственная константа здесь.
Мне кажется, что между сетевой картой и стеком IP происходит буферизация, и буфер не очищается должным образом при низких объемах.
Я проверил размер кольцевого буфера (очередь драйвера) и все они установлены на 0:
Ring parameters for wlp3s0:
Pre-set maximums:
RX: 0
RX Mini: 0
RX Jumbo: 0
TX: 0
Current hardware settings:
RX: 0
RX Mini: 0
RX Jumbo: 0
TX: 0
Это нормально? Я предполагаю, что буферы QDisc будут буферизировать вместо этого. Если что, меньший размер очереди приведет к меньшей задержке, но с отброшенными пакетами, которых я не вижу.
Я знаю, что BQL (очереди с ограничением байтов) — это функция буферизации между стеком IP и сетевой картой, но я не могу понять, как она будет себя вести.
Итак, мой вопрос: существует ли какой-либо известный алгоритм очередей в сетевом стеке Linux, который мог бы регулировать низкие объемы трафика через сетевую карту, но не ограничивал бы трафик при больших объемах?
решение1
Это было вызвано активным управлением питанием на беспроводной сетевой карте.
Выполнение этой команды, которая отключает управление питанием для сетевой карты, исправило эту проблему:
sudo iwconfig wlp3s0 power off
Похоже, управление питанием для этой конкретной сетевой карты стало активным с чрезвычайно малым тайм-аутом. Например, отсутствие трафика, переданного в течение ~200 мс, переведет сетевую карту в режим низкого энергопотребления, это означало, что сетевую карту приходилось постоянно пробуждать при низком объеме трафика, что приводило к задержке пакетов.