Re[4]: Про HTTP-сервер для Unix на основе сокетов
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.01.22 23:08
Оценка: :)
Здравствуйте, m2l, Вы писали:

m2l>>>А WSA — "windows socket api", всё имеющее этот префикс в Unix отсутствует. Хотя сами функции во делались на основе сокетов Unix-а, и во многих местах схожи.


M>>В винде вполне себе совместимое бсд сокет апи. А WSA* — это уже про асинхронщину, и про то, чтобы кинуть окошку сообщение, если что-то на сокет пришло, и тд, и тп. На голых сокетах асинхронщина делается также, как и в *никсах. Хотя poll/epoll нет, но оно и в *никсах не всегда бывает. Аналога WSA* в голых *никсах нету никакого.


m2l>А с чём ты не согласен в моём утверждении?


Всё хорошо, ты только не нервничай
Маньяк Робокряк колесит по городу
Re[4]: Про HTTP-сервер для Unix на основе сокетов
От: Cyberax Марс  
Дата: 26.01.22 05:30
Оценка:
Здравствуйте, m2l, Вы писали:

m2l>>>А WSA — "windows socket api", всё имеющее этот префикс в Unix отсутствует.

C>>Ибо это гуано нафиг не нужно.
m2l>Аргументов не будет?
Аргумент простой — на Винде нет высокопроизводительных серверов.

m2l>Они пока ещё не до конца уверенны в себе и по дефолту не используют его, только если сам добавишь в конфиг, на свой страх и риск (не малый риск, если почитать release changes насчёт bugfix).

Так это пока что очень новый API, пока с ним аккуратно экспериментируют.

C>>В Windows 11 добавили практически аналогичный API: https://windows-internals.com/ioring-vs-io_uring-a-comparison-of-windows-and-linux-implementations/

m2l>Справедливости ради, io_uring привнёс наконец то асинхронную работу через один интерфейс и с файлами и с сетью, чего раньше в linux не было.
Не совсем так. Был aio, который можно было использовать по образу и подобию IOCP, но он не давал преимуществ на практике.

m2l>Но было в Windows как часть IOCP с Windows NT 3.5 ещё ~25 лет назад. Добавим возможность zero-copy буферов за счет усложнённой сигнатуры WSASend/WSARecv (хотя этим объективно практически никто не пользовался).

И тоже не совсем так. В IOCP доступны только с десяток системных вызовов. Причём тот же CreateFile/CloseHandle не поддерживаются. Потому на практике файловый IO в Windows для неблокирующихся серверов тоже приходилось выпихивать в отдельный пул потоков.

Сам по себе IOCP сделан неплохо, и даже лучше epoll'а в Линуксе. Но эти оба API — предыдущее поколение.

m2l>Ещё можно вспомнить ядерную реализацию HTTPS в Windows — TLS в ядре не ново, и много споров вызывает. То по итогу ключевое нововведение io_uring — общая область памяти между сетевой картой, ядром и прикладным приложением. И такой подход при всех своих огромных плюсах на нагрузках вроде Netflix или Youtube имеют большой минус связанный с тем как всё это будет работать в моменты, когда эта общая область памяти фиксированного размера будут заканчивается (прикладной уровень, например не будет успевать обработать всё что к нему прилетело). Ядру и сетевой карте нужно будет гонять данные между временными буферами и т.д. — в граничных условиях этот интерфейс ещё несколько лет лучше не эксплуатировать.

Буферы данных в io_uring управляются пользователем, они не закончатся.

m2l>PS. io_uring с ядерной поддержкой TLS ярко контрастирует с тем же QUIC, где всё пытаются наоборот засунуть всё в user-mode. Прямо такие противоположности и отличная тема для священных войн.

Ну всё правильно, эксперименты лучше проводить в userspace. Недавно допилили до принятого RFC — так что сейчас можно добавлять в ядро.
Sapienti sat!
Re[5]: Про HTTP-сервер для Unix на основе сокетов
От: m2l  
Дата: 26.01.22 06:32
Оценка:
Здравствуйте, Cyberax, Вы писали:

m2l>>Аргументов не будет?

C>Аргумент простой — на Винде нет высокопроизводительных серверов.
Всегда можно вспомнить работающий на Windows Stackoverflow, или то что серверные платформы дешевле держать и оптимизировать под бесплатный Linux, или то, что API должен не только давать возможность выжать максимум производительности, но и быть удобен в том числе для новичков. Я сам сталкивался с такими серверами под Windows и наблюдал их миграцию под Linux из-за бесплатности последнего. Поэтому это так себе аргумент.

C>Так это пока что очень новый API, пока с ним аккуратно экспериментируют.

Ну да. Но автор топика то спрашивает на чем ему делать сейчас. Подсовывать ему очень новое API — не лучшая затея, я в этом плане.

C>>>В Windows 11 добавили практически аналогичный API: https://windows-internals.com/ioring-vs-io_uring-a-comparison-of-windows-and-linux-implementations/

m2l>>Справедливости ради, io_uring привнёс наконец то асинхронную работу через один интерфейс и с файлами и с сетью, чего раньше в linux не было.
C>Не совсем так. Был aio, который можно было использовать по образу и подобию IOCP, но он не давал преимуществ на практике.
Я в курсе насчет aio. И его проблем. И имею в виду, что это общая очередь событий и для сети и для файлов, с общими воркерами — и это то чего раньше не было, и это явный прогресс, хотя в винде давно уже было.

m2l>>Но было в Windows как часть IOCP с Windows NT 3.5 ещё ~25 лет назад. Добавим возможность zero-copy буферов за счет усложнённой сигнатуры WSASend/WSARecv (хотя этим объективно практически никто не пользовался).

C>И тоже не совсем так. В IOCP доступны только с десяток системных вызовов. Причём тот же CreateFile/CloseHandle не поддерживаются. Потому на практике файловый IO в Windows для неблокирующихся серверов тоже приходилось выпихивать в отдельный пул потоков.
В IOCP не десяток системных вызов доступен, а асинхронный ввод-вывод. Насчет отдельного пула — туда можно было выносить операции открытия файлов, кидая в основной события об их завершении. Но в большинстве случаев это не совсем оправдано из-за специфики открытия файлов. Выносить за пределы рабочих тредов iocp операцию закрытия хендлов — совсем не оправдано. И заводить, как io_uring, рабочие потоки в пространстве ядра ради эмуляции асинхронности открытия файлы — это плохая затея.

C>Сам по себе IOCP сделан неплохо, и даже лучше epoll'а в Линуксе. Но эти оба API — предыдущее поколение.

Ну да, у обоих есть плюсы и минусы.

m2l>>Ещё можно вспомнить ядерную реализацию HTTPS в Windows — TLS в ядре не ново, и много споров вызывает. То по итогу ключевое нововведение io_uring — общая область памяти между сетевой картой, ядром и прикладным приложением. И такой подход при всех своих огромных плюсах на нагрузках вроде Netflix или Youtube имеют большой минус связанный с тем как всё это будет работать в моменты, когда эта общая область памяти фиксированного размера будут заканчивается (прикладной уровень, например не будет успевать обработать всё что к нему прилетело). Ядру и сетевой карте нужно будет гонять данные между временными буферами и т.д. — в граничных условиях этот интерфейс ещё несколько лет лучше не эксплуатировать.

C>Буферы данных в io_uring управляются пользователем, они не закончатся.
Это, в общем случае как раз минус. То, чем раньше занималось ядро за тебя — реализуй сам и это минус, и закончится скорей всего какой-нибудь библиотекой делающей то, что раньше делало ядро. И это странно, поскольку выходит насквозь прикладной TLS пихаем в ядро, а управление системными ресурсами связанными с сетевой картой — выпихиваем на прикладной уровень. Плюс io_uring в фиксированной области памяти для сетевого ввода-вывода, которую можно зафиксировать и для сетевой карты, без обновления SDL-ей. Причем, если оглядывается на dpdk/netmap это не совсем нововведение.

m2l>>PS. io_uring с ядерной поддержкой TLS ярко контрастирует с тем же QUIC, где всё пытаются наоборот засунуть всё в user-mode. Прямо такие противоположности и отличная тема для священных войн.

C>Ну всё правильно, эксперименты лучше проводить в userspace. Недавно допилили до принятого RFC — так что сейчас можно добавлять в ядро.
Вроде не планируют, наоборот относятся как к фиче, что реализацию можно обновлять не трогая ОС.
Отредактировано 26.01.2022 6:46 m2l . Предыдущая версия .
Re: Про HTTP-сервер для Unix на основе сокетов
От: vaa  
Дата: 26.01.22 13:17
Оценка: 3 (1)
Здравствуйте, Shmj, Вы писали:

S>Нужно слушать порт, залогировать HTTP-запрос и отдать статический HTTP-ответ не зависимо от параметров запроса. Тащить nginx как бы оверхед.


S>Вопрос такой: как сделать настолько быстрое и незатратное (по ресурсам) решение, насколько это возможно?


все что советовали раньше фигня. вот тема огонь! https://vibed.org/features

ставишь с установщика dmd2 dub code-d. работы на час.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Про HTTP-сервер для Unix на основе сокетов
От: vaa  
Дата: 26.01.22 13:22
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Нужно слушать порт, залогировать HTTP-запрос и отдать статический HTTP-ответ не зависимо от параметров запроса. Тащить nginx как бы оверхед.


S>Вопрос такой: как сделать настолько быстрое и незатратное (по ресурсам) решение, насколько это возможно?


https://arsd-official.dpldocs.info/arsd.fibersocket.html
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Про HTTP-сервер для Unix на основе сокетов
От: удусекшл  
Дата: 27.01.22 12:51
Оценка:
Здравствуйте, Shmj, Вы писали:

S>>>Нужно слушать порт, залогировать HTTP-запрос и отдать статический HTTP-ответ не зависимо от параметров запроса. Тащить nginx как бы оверхед.

С>>Возьмите tinyhttpd

S>Все равно оверхед. И не ясно действительно ли он выжимает все.


То, что ты своими ручонками накорябаешь, точно будет менее эффективным
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.