Макс. Исходящие соединения сокетов в .NET/Windows Server

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

В любом случае, я разработал свое серверное приложение, используя Async Sockets (завершено в SslStream), и теперь у меня 1000 рабочих сессий на нем. Я очень доволен результатами, поскольку вижу около 0-10% среднего использования процессора на одноядерном процессоре, и со временем используется около 60 МБ памяти.

Мой вопрос: как мне масштабировать его, чтобы я мог достичь 100 000 или 200 000 или более клиентских сеансов, выполняемых на моем сервере? Опять же, это немного нетрадиционно, так как мой сервер не действует как сервер, так как я беспокоюсь об исходящих соединениях, а не о входящих.

Я знаю, что существует параметр реестра MaxUserPort, который нужно изменить, чтобы выйти за пределы значения по умолчанию, которое кажется 5000. Однако, похоже, существует еще один жесткий предел 65535, и я не слишком четко понимаю, где этот предел проживает. Является ли это пределом для сетевого интерфейса? Это глобальный лимит Windows? Это лимит на каждый процесс?

Если это ограничение для сетевого интерфейса, я могу добавить несколько сетевых интерфейсов и связать сокеты сеанса клиента с каждым интерфейсом (например: 65k на интерфейсе 1, 65k на интерфейсе 2 и т.д.)?

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

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

Ответ 1

Машина Windows может легко масштабироваться до очень большого количества открытых подключений. Максимальный предел порта 64k для каждого IP-адреса, а не для каждого устройства. Если вам нужны более эфемерные порты, увеличьте ограничения, как предлагает @SuperTux, но также назначьте больше IP-адресов для машины. Чтобы воспользоваться преимуществами, вам нужно вручную вызвать Bind() в своем клиентском сокете и передать исходный IP-адрес из вашего пула с бесплатными портами (это также подразумевает, что вы будете нести ответственность за отслеживание доступных эфемерных портов на каждый адрес). Многие устройства класса высокого класса делают это (пулы SNAT для балансиров нагрузки, например) для поддержки сотен тысяч одновременных подключений.

Бухгалтерия - это хлопот, но лучше, чем бросать на нее недоиспользуемое оборудование для каждого клиентского подключения на 64 тыс..

Ответ 2

65355 является предел IP-протокола и, что более важно, является пределтом стека TCP/IP большинства операционных систем.

Чтобы увеличить максимальное количество эфемерных портов в Windows, выполните следующие действия:

  1. Запустите редактор реестра.
  2. Найдите раздел реестра в реестре и нажмите "Параметры": HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  3. В меню "Правка" нажмите "Создать", а затем добавьте следующую запись реестра:

    Имя значения: MaxUserPort

    Тип значения: DWORD

    Данные значения: 65534

    Допустимый диапазон: 5000-65534 (десятичный)

    По умолчанию: 0x1388 (5000 десятичных знаков)

    Описание: Этот параметр управляет максимальным номером порта, который используется, когда программа запрашивает любой доступный пользовательский порт из системы. Как правило, эфемерные (кратковременные) порты распределяются между значениями 1024 и 5000 включительно.

Обычно для масштабирования до портов более 65 тыс. вы должны использовать несколько серверов в кластере.