Я пишу сетевую библиотеку (блокирующие сокеты) для транспортировки нескольких распакованных изображений (максимум 4096x4096x4 = ~ 67 МБ) с центрального сервера изображений на один или несколько экземпляров трехмерной программы, которая использует их в качестве текстур. Основной сценарий только локальный. Поскольку данные могут стать довольно большими, меня, конечно, интересует максимально возможная скорость сети, особенно на локальном хосте.
Я уже использую SIO_LOOPBACK_FAST_PATH оптимизация локального хоста, что значительно повышает скорость.
Я написал тестовый клиент + сервер с одним потоком / одним сокетом, который отправляет 100 ГиБ через локальный хост, и который я оптимизировал, пока не достиг ~ 96% обработки обоих для send()
а также recv()
,
Эта программа показывает мне:
Пока все хорошо, теперь самое интересное:
Если я запускаю 5 экземпляров каждого клиента + сервера, скорость для каждого экземпляра немного снижается, но в целом она намного выше:
Так что теперь я спрашиваю себя, что вызывает это. Я думаю, что могу исключить обработку моих собственных тестовых программ, так как и сервер, и клиент остаются на 96% send()
а также recv()
, Так что только транспорт сокетов остается причиной.
Является ли реализация сокетов в самой Windows однопоточной? Будут ли неблокируемые / перекрывающиеся розетки улучшать скорость в send()
а также recv()
? Или более целесообразно разделить данные на несколько потоков, кусков и нескольких сокетов на соединение? Или есть другие варианты оптимизации, о которых я не думал?
Задача ещё не решена.
Других решений пока нет …