Асинхронный линукс
2025-02-18 18:23![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Народ, кто-нибудь уже поимел опыт с <linux/io_uring.h>? Как оно по жизни?
Неожиданно для себя обнаружил, что в Линуксе пять лет назад появилась крутая фича. А именно три системных вызова, реализующих эффективный асинхронный интерфейс ко всем сервисам ядра.
Неожиданно для себя обнаружил, что в Линуксе пять лет назад появилась крутая фича. А именно три системных вызова, реализующих эффективный асинхронный интерфейс ко всем сервисам ядра.
- int io_uring_setup(unsigned entries, struct io_uring_params *p);
- int io_uring_enter(unsigned fd, unsigned to_submit, unsigned min_complete, unsigned flags, sigset_t *sig);
- int io_uring_register(unsigned fd, unsigned opcode, void *arg, unsigned nr_args);
no subject
Date: 2025-02-19 05:12 (UTC)no subject
Date: 2025-02-19 06:53 (UTC)no subject
Date: 2025-02-19 19:46 (UTC)помнится с приятелем мутили печать с ленты, в один буфер читалось, другой форматировался, третий выводился (без спулера)
no subject
Date: 2025-02-19 19:55 (UTC)Slow disk => perf is dominated by io wait, you can ignore context switch + buffer copying cost.
no subject
Date: 2025-02-20 05:36 (UTC)no subject
Date: 2025-02-19 07:09 (UTC)радость хакерам.
no subject
Date: 2025-02-19 08:05 (UTC)no subject
Date: 2025-02-19 19:40 (UTC)no subject
Date: 2025-02-19 19:56 (UTC)no subject
Date: 2025-02-19 20:05 (UTC)no subject
Date: 2025-02-19 20:19 (UTC)no subject
Date: 2025-02-19 20:30 (UTC)no subject
Date: 2025-02-19 20:39 (UTC)no subject
Date: 2025-02-19 20:50 (UTC)no subject
Date: 2025-02-19 20:59 (UTC)no subject
Date: 2025-02-19 21:07 (UTC)no subject
Date: 2025-02-19 21:29 (UTC)no subject
Date: 2025-02-19 21:27 (UTC)no subject
Date: 2025-02-19 21:34 (UTC)no subject
Date: 2025-02-20 20:27 (UTC)no subject
Date: 2025-02-19 16:09 (UTC)no subject
Date: 2025-02-19 08:34 (UTC)Хм.
Наверное, это хорошо с точки зрения снижения энергопотребления, дипломатически выражаясь.
Но опять же - я не пробовал этот механизм. Это вот такое суждение навскидку. Может я и ерунду написал.
ап: кстати вот, есть же задачи, где высокая отзывчивость не на первом месте, и ей можно пожертвовать в ущерб производительности. Я таких задач вобщем-то не встречал, но они бывают.
no subject
Date: 2025-02-19 10:41 (UTC)no subject
Date: 2025-02-19 15:26 (UTC)там эта очередь - многопоточная, что ли? Один поток уже обрабатывает возврат, а другой поток все еще может в эту очередь что-то добавить. А потом хоба - и уже в какой-то момент считатется, что возврат произошел, и события больше не добавляются в эту очередь. Например таким моментом может быть обращение к size(). Ну то есть, начало работы с элементами.
Ну, вприницпе, да. Полезно.
no subject
Date: 2025-02-20 08:36 (UTC)- мі имеем сокеті к 100к клиентов. сабмитим 100к запросов на чтение одним сисколлом, ждем ответа
- получаем ответ, обрабатіваем запрос клиента, формируем ответ, сабмитим респонз
- за время, пока мі обрабатівали, пришло еще 10 запросов от клиента, они сразу нам доступні для обработки, уже лежать в кольцевом буфере - пока мі обрабатівали запрос в юзерспейсе, ядро тоже времени не теряло
- мі последовательно обрабатіваем єти запросі, за єто время заканчивается обработка отправки нашего респонза первому клиенту, и єто собітие тоже попадает в буфер
- когда очередь доходит до обработки собітия завершения передачи респонза, мі в ответ опять сабмитим запрос на чтение из єтого сокета.
Ну и т.д. Я не уверен, что ві именно єто имели ввиду под "многопоточной очередью".
no subject
Date: 2025-02-20 11:39 (UTC)для начала мне уже ясно: надо либо читать документацию - либо мы говорим, что пофантазируем как оно могло бы работать правильно. Сейчас мы занимаемся вторым. Надо это понимать.
> за время, пока мі обрабатівали, пришло еще 10 запросов от клиента, они сразу нам доступні для обработки,
а вот єто без многопотока невозможно. То есть тут есть всего 2 варианта: либо мы делаем некий вызов, возвращающий новые события. И тогда єто 1 поток. Либо же мы таких вызовов не делаем, а наша входящая очередь многопоточная, и читатель в ней один (мы), а все писатели в ядре и их много (сокеты, клики мышкой и тд).
> Суть именно в том, чтобі в одном треде обрабатівать много одновременніх операций
а чем это принципиально от epoll отличается? В epoll ты сделал вызов - а тебе возвращается список сокетов, по которым есть обновление (данные для чтения, или появившаяся возможность записать еще если это tcp).
Кстати. Когда сетевая карточка генерирует прерывание, то по умолчанию оно приходит на любое ядро. (можно настроить, запретив какое-то ядро - но нужно ли?) Соответственно, получается задача, что данные из нескольких потоков надо свести в один. Зачем так сделано, я не очень понимаю. Как показала практика, не всегда с первого раза архитектуры делают удачно. С другой же стороны, те кто это делал, явно знали больше, чем я. Тут я затрудняюсь дать оценку. Наверное в каких-то случаях это хорошо, а в каких-то других нет.
no subject
Date: 2025-02-19 15:18 (UTC)no subject
Date: 2025-02-19 10:50 (UTC)no subject
Date: 2025-02-19 19:52 (UTC)Eg 10M sockets >> 32 CPU_count.
no subject
Date: 2025-02-20 08:18 (UTC)no subject
Date: 2025-02-20 13:42 (UTC)If you used epoll, you'll notice that io_uring is not that different. The user of the API needs to figure out how to share work, how to associate execution context with IO requests and how to manage system-wide progress.
For example, if it is a Async framework, the execution context is a Future or a Promise of the IO result.
Spreading work among threads can be via hashing and periodic rehashing, work stealing, etc, really task-specific. But if you are able to saturate CPU without that, then you can shrug it off as unnecessary.
no subject
Date: 2025-02-19 13:13 (UTC)no subject
Date: 2025-02-19 20:04 (UTC)Народ пытается упростить на Rust, но пока не впечатляет.
https://github.com/tokio-rs/io-uring
На Си++ ещё кривее выходит.
https://live.boost.org/doc/libs/1_87_0/doc/html/boost_asio/reference/io_context.html
Может совсем какой другой язык программирования нужен при таком подходе.
no subject
Date: 2025-02-20 00:23 (UTC)https://www.google.com/search?q=state+explosion+problem&oq=state+expl&gs_lcrp=EgRlZGdlKgcIAhAAGIAEMgYIABBFGDkyBwgBEAAYgAQyBwgCEAAYgAQyBwgDEAAYgAQyBwgEEAAYgAQyBwgFEAAYgAQyBwgGEAAYgAQyBwgHEAAYgAQyBwgIEAAYgATSAQg5NDkzajBqMagCALACAQ&sourceid=chrome&ie=UTF-8
no subject
Date: 2025-02-20 08:22 (UTC)no subject
Date: 2025-02-20 12:46 (UTC)При прямом конвертировании в асинхронный код каждый такой кусок добавляет один state и один event к общей матрице.
(*) Простота и наглядность такого кода одна из главных причин почему люди мучаются с много-поточностью.
no subject
Date: 2025-02-19 19:50 (UTC)