Максимальное количество исходящих сокетов в .NET / Windows Server - PullRequest
11 голосов
/ 17 ноября 2009

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

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

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

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

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

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

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

Ответы [ 2 ]

10 голосов
/ 17 ноября 2009

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

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

2 голосов
/ 17 ноября 2009

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 тыс. Портов вы будете использовать несколько серверов в кластере.

...