Как улучшить локальную скорость сокета под Windows?

Я пишу сетевую библиотеку (блокирующие сокеты) для транспортировки нескольких распакованных изображений (максимум 4096x4096x4 = ~ 67 МБ) с центрального сервера изображений на один или несколько экземпляров трехмерной программы, которая использует их в качестве текстур. Основной сценарий только локальный. Поскольку данные могут стать довольно большими, меня, конечно, интересует максимально возможная скорость сети, особенно на локальном хосте.

Я уже использую SIO_LOOPBACK_FAST_PATH оптимизация локального хоста, что значительно повышает скорость.

Я написал тестовый клиент + сервер с одним потоком / одним сокетом, который отправляет 100 ГиБ через локальный хост, и который я оптимизировал, пока не достиг ~ 96% обработки обоих для send() а также recv(),

Эта программа показывает мне:

  • ~ 4,6 ГБ / с для очень больших кусков / буфера (1 ГБ)
  • ~ 3,5 ГБ / с для больших кусков (100 МБ)
  • ~ 1.6 ГБ / с для небольших кусков (10 МБ)

Пока все хорошо, теперь самое интересное:

Если я запускаю 5 экземпляров каждого клиента + сервера, скорость для каждого экземпляра немного снижается, но в целом она намного выше:

  • AVRG. ~ 2,6 ГБ / с * 5 = 13 ГБ / с для кусков 1 ГБ
  • AVRG. ~ 1,8 ГБ / с * 5 = 9 ГБ / с для кусков по 100 МБ
  • AVRG. ~ 1,4 ГБ / с * 5 = 7 ГБ / с для порций 10 МБ

Так что теперь я спрашиваю себя, что вызывает это. Я думаю, что могу исключить обработку моих собственных тестовых программ, так как и сервер, и клиент остаются на 96% send() а также recv(), Так что только транспорт сокетов остается причиной.

Является ли реализация сокетов в самой Windows однопоточной? Будут ли неблокируемые / перекрывающиеся розетки улучшать скорость в send() а также recv()? Или более целесообразно разделить данные на несколько потоков, кусков и нескольких сокетов на соединение? Или есть другие варианты оптимизации, о которых я не думал?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru