Вопрос или проблема
Я запускаю Mapproxy с waitress на нескольких серверах Windows в различных средах (разное оборудование, VM).
На виртуальном сервере мы сталкиваемся с проблемой, что некоторые запросы к waitress не удаются. Используя K6 для нагрузочного тестирования, выясняется, что если 230 виртуальных пользователей отправляют один запрос одновременно, некоторые запросы завершаются с этой ошибкой:
WARN[0000] Request Failed error="Get \"http://127.0.0.1:9650/tiles/1.0.0/mymap/webmercator/x/x/x.png\": dial tcp 127.0.0.1:9650: connectex: No connection could be made because the target machine actively refused it."
Если я отправляю эти 230 запросов снова и снова в течение 10 секунд, что генерирует около 10’000 запросов, загрузка CPU составляет около 30%. Но в этом случае только на первых 230 запросах некоторые отклоняются, после этого все запросы получают ответ.
Я использую точно такую же конфигурацию waitress на всех серверах Windows:
call waitress-serve --listen 127.0.0.1:9650 --threads 500 --connection-limit 1000 --backlog 4096 config:application
Поскольку я использую одинаковую конфигурацию на всех серверах Windows, и на других серверах я могу отправить 500 запросов с K6 без проблем, мне кажется, что Windows каким-то образом ограничивает количество одновременных запросов на этом порту.
Некоторые исследования указали мне на очередь порта и на необходимость добавить MaxUserPort
и TcpTimeWaitDelay
в реестр:
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
, но это ничего не изменило.
Некоторая информация о сервере:
- Windows Server 2022 Datacenter
- VMWare7.1
- Процессор: Intel(R) Xeon(R) Gold 6342 CPU @ 2.80GHz, 2793 МГц, 2 ядра, 2 логических процессора
Мои вопросы для лучшего понимания этой проблемы:
- Что ограничивает количество одновременных соединений к порту? Это оборудование (ЦП и т. д.) или Windows или что-то еще?
- Если это Windows, можно ли изменить количество одновременных соединений к порту?
Все подсказки для решения этой проблемы будут очень приветствоваться.
Ответ или решение
Почему происходит ошибка: "port actively refused requests"?
Ошибка, которую вы наблюдаете, часто связана с превышением ограничений на количество параллельных подключений к сетевому порту на вашем сервере. Давайте подробнее разберём, что может вызывать данную проблему, и как её можно решить.
Причины отказа в подключении
-
Ограничения Windows на количество одновременных подключений:
- В Windows существуют настройки, которые могут ограничивать количество одновременных подключений к TCP-портам. На вашем сервере эти настройки могут влиять на работу Waitress.
-
Настройки Waitress:
- Ваше текущее конфигурационное значение для Waitress указывает на ограничение в 1000 соединений. Однако, учитывая использование потока (threads) и подключений, это может не быть достаточным для обработки одновременно 230 запросов.
-
Ограничения виртуальной машины:
- Так как вы используете VMware, возможно, настройки виртуализации или выделенные ресурсы (CPU, память) могут ограничивать производительность вашего сервера.
-
Параметры сети:
- Значения в реестре, такие как
MaxUserPort
иTcpTimedWaitDelay
, могут повлиять на способность сервера обрабатывать новые подключения. Хотя вы уже пробовали их настраивать без видимого эффекта, стоит также проверить другие параметры TCP/IP.
- Значения в реестре, такие как
Настройка системы для увеличения пропускной способности
Для решения вашей проблемы вы можете предпринять следующие шаги:
-
Изменение реестра Windows:
- Увеличьте
MaxUserPort
до значения, большего 65534 (обычно 49152 – 65534). Это можно сделать, установив следующее:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters MaxUserPort = 65534 (DWORD)
- Увеличьте
-
Настройка
TcpTimedWaitDelay
:- Уменьшите время ожидания сокета, увеличив количество доступных портов.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters TcpTimedWaitDelay = 30 (DWORD)
- Уменьшите время ожидания сокета, увеличив количество доступных портов.
-
Использование более новых версий программ:
- Убедитесь, что вы используете последние версии Windows и Waitress, так как могут быть исправлены ошибки и улучшена производительность с увеличением одновременных соединений.
-
Мониторинг ресурсов виртуальной машины:
- Убедитесь, что вашему серверу выделены достаточные ресурсы (CPU, память). Возможно, стоит увеличить количество логических процессоров или выделить больше памяти.
-
Настройка Waitress:
- Старайтесь оптимизировать значения
--threads
и--connection-limit
, протестировав различные настройки для достижения наилучшей производительности при вашем сценарии нагрузки.
- Старайтесь оптимизировать значения
Ответы на ваши вопросы
-
Что может ограничивать количество одновременных соединений?
- Ограничить количество соединений могут как аппаратные (в CPU и RAM), так и программные настройки (операционная система и приложения, которые работают на сервере).
-
Можно ли изменить число одновременно подключений в Windows?
- Да, это можно сделать через редактор реестра, а также изменив настройки сетевых адаптеров и параметры TCP/IP.
Заключение
Ваши проблемы с подключениями могут быть вызваны сочетанием настроек Windows, нагрузки на сервер и конфигурации Waitress. Следуя предложенным рекомендациям, вы сможете улучшить обработку параллельных запросов и устранить проблему отказов в соединении. Если проблема сохраняется, может потребоваться более глубокая диагностика с использованием сетевых инструментов мониторинга.