Вебсокеты с websocat: Как узнать, какой ресурс иссякает?

Вопрос или проблема

Я нахожусь в ситуации, когда у меня есть TCP-сервер и клиент вебсокетов, и я использую websocat в качестве моста между ними. Всё работает отлично, пока я не достигаю примерно 60 одновременных подключений, после чего соединения начинают сбрасываться случайным образом. Сообщение об ошибке websocat: Транспортная конечная точка не подключена (ошибка ОС 107) появляется. Сервер выдает ошибку о Разорванном канале, errno=32.

Какой ресурс может иссякать, чтобы это произошло?

Я подтвердил, что

  • Проблема не возникает, если подключения распределены во времени, а не одновременные
  • Проблема не возникает, если я подключаюсь напрямую к серверу по TCP вместо использования моста

Команда websocat, которую я выполняю, выглядит так:

websocat   -k -B 1024000 -E --binary wss-l:127.0.0.1:7878 --pkcs12-der=./output.pkcs12 ssl-connect:tcp:127.0.0.1:7979

Я не думаю, что проблема в дескрипторах файлов, так как ulimit -n дает 65535. Но может ли быть другой лимит на сокеты или сетевые ресурсы, который достигается, или какой-то ресурс, который утечет из websocat или из моего сервера, потому что websocat не закрывает что-то должным образом?

Добавление -vv к websocat дает много вывода, но я не знаю, что именно искать в этом.

Сервер – это Raspberry Pi 5 с Raspberry Pi OS (основан на Debian), и не похоже, что это проблема с CPU или памятью. Кроме увеличения лимита дескрипторов файлов, я не изменял основные настройки.

Ответ или решение

Определение проблем с вебсокетами при использовании websocat

Ваша ситуация, связанная с работой вебсокетов через websocat, в которой возникают проблемы при большом количестве одновременных соединений, действительно требует детального анализа. Ошибки, которые вы наблюдаете, такие как websocat: Transport endpoint is not connected (os error 107) и Broken pipe errno=32, могут указывать на различные проблемы с ресурсами или сетевой инфраструктурой.

1. Оценка ограничений ресурсов

1.1. Ограничение по файловым дескрипторам

Хотя вы отметили, что ulimit -n показывает 65535, важно убедиться, что это ограничение применяется ко всем процессам вашего сервера и не нарушается системными настройками. Вы можете проверить текущие лимиты и их настройки через:

cat /proc/sys/fs/file-max

Также проверьте, сколько активных соединений у вас в данный момент:

lsof -u <your_user> | wc -l

1.2. Ограничения сокетов

Проблемы могут возникать не только из-за файловых дескрипторов, но и из-за ограничений на уровне сокетов. Убедитесь, что пределы для сокетов разрешены. Вы можете проверить их через:

sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog

Эти параметры управляют максимальным количеством соединений, которые могут быть в очереди на установление.

2. Нагрузка на сеть

2.1. Пропускная способность

Убедитесь, что ваше сетевое соединение (как локальное, так и внешнее) имеет достаточную пропускную способность для обработки большего числа одновременных соединений. Вы можете использовать такие утилиты, как iperf, для тестирования производительности сети между клиентом и сервером.

2.2. Подключение и закрытие соединений

Проблема может возникнуть из-за того, как websocat управляет соединениями. Проверьте, правильно ли все соединения закрываются. Вы можете добавить логирование на уровне сервера, чтобы измять, когда соединения открываются и закрываются.

3. Утечки ресурсов

3.1. Мониторинг ресурсов

Используйте инструменты мониторинга, такие как htop или atop, чтобы отследить использование памяти и процессорного времени, когда количество соединений увеличивается. Это поможет выявить возможные утечки ресурсов в приложении.

3.2. Анализ выводов websocat

Запуск websocat с флагом -vv действительно может дать много информации. Ищите повторяющиеся ошибки или предупреждения, особенно в моменты возникновения проблем. Это может указывать на момент, когда websocat не может обработать соединение или когда происходит разрыв соединения.

4. Устранение проблем с серверной частью

Поскольку ошибка не проявляется при прямом подключении к TCP серверу, проблема может заключаться в конфигурации websocat как прокси-сервера. Убедитесь, что сервер настроен для обработки всех соединений, особенно в случаях, когда websocat функционирует как промежуточное звено.

Рекомендации по оптимизации

  • Увеличьте значения net.core.somaxconn и net.ipv4.tcp_max_syn_backlog, чтобы ваше приложение могло обрабатывать большее количество ожидающих соединений.
  • Рассмотрите возможность использования более эффективного решения для управления высоким числом соединений, если текущая реализация websocat не справляется.

Заключение

Проблемы с вебсокетами и websocat требуют многостороннего подхода к диагностике и устранению неполадок. Проверяя и корректируя системные настройки, следя за поведением ресурсов и анализируя логи, вы сможете определить и устранить ограничения, возникающие в вашей текущей конфигурации.

Оцените материал
Добавить комментарий

Капча загружается...