io_uring
io_uring (ранее известный как aioring ) — это ядра Linux интерфейс системного вызова для асинхронных операций ввода-вывода устройства хранения , решающий проблемы с производительностью с помощью аналогичных интерфейсов, предоставляемых такими функциями, как read()
/ write()
или aio_read()
/ aio_write()
и т. д. для операций с данными, доступ к которым осуществляется файловыми дескрипторами . [1] [2] : 2
Разработка продолжается, над ней в основном работал Йенс Аксбо из Meta . [1]
Интерфейс
[ редактировать ]Он работает путем создания двух циклических буферов , называемых «кольцами очереди», для хранения отправки и завершения запросов ввода-вывода соответственно. Для устройств хранения они называются очередью отправки (SQ) и очередью завершения (CQ). [3] Совместное использование этих буферов между ядром и приложением помогает повысить производительность ввода-вывода , устраняя необходимость выполнения дополнительных и дорогостоящих системных вызовов для копирования этих буферов между ними. [1] [3] [4] Согласно документу о проекте io_uring, буфер SQ доступен для записи только потребительским приложениям, а буфер CQ доступен для записи только ядру. [1] : 3
eBPF можно комбинировать с io_uring. [5]
История
[ редактировать ]Ядро Linux поддерживает асинхронный ввод-вывод начиная с версии 2.5, но его считали сложным в использовании и неэффективным. [6] Этот старый API поддерживал только определенные нишевые варианты использования . [7] в частности, он включает асинхронную работу только при использовании флага O_DIRECT и при доступе к уже выделенным файлам. Это предотвращает использование кэша страниц , а также подвергает приложение сложной семантике O_DIRECT. Linux AIO также не поддерживает сокеты, поэтому его нельзя использовать для мультиплексирования сетевого и дискового ввода-вывода. [8]
Интерфейс ядра io_uring был принят в ядре Linux версии 5.1 для устранения недостатков Linux AIO. [1] [4] [9] liburing
Библиотека предоставляет API для легкого взаимодействия с интерфейсом ядра из пользовательского пространства . [1] [1] : 12
Безопасность
[ редактировать ]io_uring был известен тем, что выявил значительную поверхность атаки и структурные трудности при его интеграции с подсистемой безопасности Linux . [10]
В июне 2023 года группа безопасности Google сообщила, что 60% эксплойтов ядра Linux , представленных в их программу вознаграждения за ошибки в 2022 году, были эксплойтами уязвимостей io_uring. В результате io_uring был отключен для приложений в Android и полностью отключен в ChromeOS, а также на серверах Google. [11] Docker также, следовательно, отключил io_uring из своего профиля seccomp по умолчанию . [12] [ оригинальное исследование? ]
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с д и ж г «Ядро Linux получает io_uring для обеспечения быстрого и эффективного ввода-вывода — Phoronix» . Фороникс . Проверено 14 марта 2021 г.
- ^ Аксбо, Йенс (15 октября 2019 г.). «Эффективный ввод-вывод с помощью io_uring» (PDF) .
- ^ Перейти обратно: а б «Практическое знакомство с io_uring с использованием Go» . Developers.mattermost.com . Проверено 20 ноября 2021 г.
- ^ Перейти обратно: а б «Быстрый рост io_uring [LWN.net]» . lwn.net . Проверено 20 ноября 2021 г.
- ^ «BPF встречает io_uring [LWN.net]» . LWN.net . Проверено 17 апреля 2023 г.
- ^ Корбет, Джонатан. «Вызов нового API асинхронного ввода-вывода» . LWN.net . Проверено 14 марта 2021 г.
- ^ «Что нового в io_uring» (PDF) . Проверено 1 июня 2022 г.
- ^ «Асинхронный ввод-вывод Linux» . 21 апреля 2014 г. Архивировано из оригинала 06 апреля 2015 г. Проверено 16 июня 2023 г.
Блокировка во время io_submit в ext4, при буферизованных операциях, доступе к сети, каналам и т. д. Некоторые операции не совсем хорошо представлены интерфейсом AIO. В случае совершенно неподдерживаемых операций, таких как чтение из буфера, операции с сокетом или каналами, вся операция будет выполнена во время системного вызова io_submit, а завершение будет доступно немедленно для доступа с помощью io_getevents. Доступ AIO к файлу в файловой системе, такой как ext4, поддерживается частично: если для поиска блока данных требуется чтение метаданных (т. е. если метаданные еще не находятся в памяти), то вызов io_submit будет блокироваться при чтении метаданных. Некоторые типы операций записи, увеличивающие файлы, полностью не поддерживаются и блокируются на протяжении всей операции.
- ^ «Ускоренный ввод-вывод через io_uring | Рецепты ядра 2019» . Проверено 14 марта 2021 г.
- ^ Корбет, Джонатан (28 июля 2022 г.). «Требования безопасности для новых функций ядра» . LWN.net . Проверено 16 июня 2023 г.
- ^ Кочка, Тамаш. «Уроки из представленных материалов об эксплойтах ядра Linux 42 от kCTF VRP» . Блог Google по онлайн-безопасности . Google . Проверено 14 июня 2023 г.
- ^ «seccomp: заблокировать системные вызовы io_uring_* в профиле по умолчанию от akerouanton · Pull Request #46762 · moby/moby» . Гитхаб . Проверено 2 ноября 2023 г.
Внешние ссылки
[ редактировать ]- Эффективный ввод-вывод с помощью io_uring , подробное описание мотивации io_uring, интерфейса (структуры данных и т. д.) и оценки производительности.
liburing
исходный репозиторийio_uring
исходный каталог в репозитории ядра Linux