- Вопрос или проблема
- Ответ или решение
- Определение проблем с вебсокетами при использовании websocat
- 1. Оценка ограничений ресурсов
- 1.1. Ограничение по файловым дескрипторам
- 1.2. Ограничения сокетов
- 2. Нагрузка на сеть
- 2.1. Пропускная способность
- 2.2. Подключение и закрытие соединений
- 3. Утечки ресурсов
- 3.1. Мониторинг ресурсов
- 3.2. Анализ выводов websocat
- 4. Устранение проблем с серверной частью
- Рекомендации по оптимизации
- Заключение
Вопрос или проблема
Я нахожусь в ситуации, когда у меня есть 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
требуют многостороннего подхода к диагностике и устранению неполадок. Проверяя и корректируя системные настройки, следя за поведением ресурсов и анализируя логи, вы сможете определить и устранить ограничения, возникающие в вашей текущей конфигурации.