Задать вопрос
@sheldygg

Как найти место, где возникают проблемы с TCP, TCPOFOQueue?

В своем проекте я использую NATS JetStream, использую публикацию для потоковой передачи rps-запросов, это значит, что клиент будет ждать ответа от сервера, но часто возникает ошибка тайм-аута, в чем проблема, не понятно.

Я начал собирать метрики с помощью node_exporter и просматривать их в Grafana. На панели ошибок TCP вы можете увидеть множество ошибок со следующим описанием: TCPOFOQueue — уровень TCP получает пакет, не соответствующий порядку, и у него достаточно памяти, чтобы поставить его в очередь.
66ee827167f16553632050.png

Более того, эти ошибки совпадают по времени с ошибками, которые возникают в моем приложении.

Не могли бы вы подсказать, где копать, чтобы найти и устранить эту проблему?

Я отправляю обычный запрос через клиент Python для NATS и получаю исключение
nats: timeout

await connection.request(
    message=b"some_message",
    subject="order.cancel",
    timeout=1
)

Сервисы задеплоины в докер контейнеры с сетью хоста.

Я думаю, проблема не в Nats Server или VPS, потому что я перазвернул, проблема все еще происходит. До переустановки VPS я пытался подключиться к Nats Server с моего локального ПК и отправлять запросы, иногда я получаю таймауты :) НО после переустановки VPS я пытаюсь сделать то же самое и не получаю таймауты и не вижу ошибок в графике Grafana (я делаю ~100 rpc)
После этого можно сделать вывод, что проблема не в nats-py (я думал, что отправка большого количества сообщений одновременно сопровождается ошибкой в ​​реализации nats для python)
Теперь я еще больше запутался
  • Вопрос задан
  • 188 просмотров
Подписаться 2 Сложный 2 комментария
Пригласить эксперта
Ответы на вопрос 2
@Makson_Herson
Приветствую!
Попробуйте проверить есть ли дропы на сетевых интерфейсах для исходящих пакетов.
Для всех интерфейсов можно использовать ifconfig, либо для конкретного нативный ip -s -s link show <имя_интерфейса>
Если есть дропы, то проверить параметр queuelen (он же txqueuelen), он не должен быть равен нулю или быть слишком маленьким. Если таковые есть, то выставить значение в 1000: ip link set <имя_интерфейса> qlen 1000
Ответ написан
@bybacapitan
Проблема оказалась в websocket подключениях, в моменте приходило большое количество сообщений из-за чего возникали эти ошибки, уменьшив количество трафика все пришло в норму.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы