Есть ли Windows Network API "ниже" Winsock? - PullRequest
0 голосов
/ 28 августа 2018

Как следует из названия. Перемещается ли winsock непосредственно к ядру или ниже winsock, который может использоваться программами с меньшими издержками?

Справочная информация:

Я пытаюсь отладить некоторые проблемы со скоростью сети, получая намного меньше, чем скорость загрузки 1 ГБ / с, что теоретически должно быть возможно для 10 Гбит соединения. Чтобы измерить скорость без каких-либо издержек загрузки с диска (на отправителе) и сохранения на диск (на получателе), я написал две программы, использующие winsock - одну, которая отправляет несколько гигабайт по сети из «ниоткуда» и еще один, который получает эти гигабайты и выбрасывает их.

К моему разочарованию, запуск обеих программ локально, с использованием 127.0.0.1, достигает максимальной скорости около 500 МБ / с - все еще ниже, чем то, что я хотел бы по сети! Те же программы, скомпилированные для linux, достигают примерно 10 ГБ / с по сравнению с 127.0.0.1, в linux с двойной загрузкой на том же оборудовании.

Теперь мне не особо нравится Windows, но я не могу себе представить, что хорошо настроенная Windows должна быть , что намного медленнее, и я также не ожидаю, что параметры TCP, такие как размер окна, будут влиять localhost соединение так много. Это оставляет меня с подозрением, что Winsock добавляет дополнительный уровень сложности к некоторым вызовам ядра, и избегание этого уровня может немного ускорить меня.

API Windows.Networking.Sockets и WinHTTP мне здесь не помогают - похоже, они построены вокруг Winsock, поэтому они добавляют, а не убирают сложности вокруг вызовов.

Сами программы можно найти по адресу https://github.com/gbl/socketspeed,, а вот некоторые журналы из окон:

sent 10737418240 bytes in 23.407717 seconds to 127.0.0.1, 458 MByte/s
sent 10737418240 bytes in 17.610531 seconds to 127.0.0.1, 609 MByte/s
sent 10737418240 bytes in 21.845174 seconds to 127.0.0.1, 491 MByte/s
sent 10737418240 bytes in 16.922958 seconds to 127.0.0.1, 634 MByte/s
sent 10737418240 bytes in 16.563529 seconds to 127.0.0.1, 648 MByte/s

и из Linux:

sent 10737418240 bytes in 1.161639 seconds to 127.0.0.1, 9243 MByte/s
sent 10737418240 bytes in 1.136366 seconds to 127.0.0.1, 9448 MByte/s
sent 10737418240 bytes in 1.121128 seconds to 127.0.0.1, 9577 MByte/s
sent 10737418240 bytes in 1.120347 seconds to 127.0.0.1, 9584 MByte/s
sent 10737418240 bytes in 1.127412 seconds to 127.0.0.1, 9523 MByte/s
...