Насколько хорошо масштабируются параллельные записи с помощью io_uring?

Насколько хорошо масштабируются параллельные записи с помощью io_uring?

Фон:Я очень заинтригован потенциальным приростом производительности io_uring, но у меня недостаточно знаний о C, ядре Linux или внутренней работе блочных устройств, чтобы реализовать осмысленные бенчмарки. Я не ищу точных цифр, а просто обзор архитектуры, который будет информировать меня о моих дальнейших исследованиях.


Представьте, что у меня есть программа, которая многократно добавляет пакеты из десяти 4-байтовых целых чисел в файл, а затем синхронизирует его. Я хочу перейти к модели, в которой я добавляю каждое целое число в пакете в его собственный файл. То есть: я запишу один 4-байтовый int в каждый из 10 файлов и синхронизирую их все.

Используя синхронный ввод-вывод, исходная схема использует 2 системных вызова (1 запись + 1 синхронизация), а подход int-per-file использует ошеломляющие 20 (10 записей + 10 синхронизаций). С точки зрения системных вызовов экономия io_uringбудет колоссальной: я могу достичь эквивалента 20 системных вызовов с помощью одной io_uringотправки. Мне непонятно, какотдыхмасштабирование машинного оборудования Linux writeбудет осуществляться после отправки.

  • Есть ли у большинства дисков аппаратная поддержка параллельной записи? Или, может быть, у SSD она есть, а у вращающихся дисков — нет?
  • Передаются ли записи на диск по конвейеру (по шине?), чтобы ядру не приходилось ждать ответа на каждый запрос?
  • Ставит ли ядро ​​в очередь все системные вызовы, запрошенные через io_uring?
  • Есть ли еще какие-то узкие места, которые я не учел?

Вполне возможно, что моя ментальная модель неверна. Любые указания будут очень признательны!

решение1

Есть ли у большинства дисков аппаратная поддержка параллельной записи? Или, может быть, у SSD она есть, а у вращающихся дисков — нет?

Почти все диски делают это, независимо от того, вращающиеся они или твердотельные (даже вращающиеся диски имеют кэши, поэтому для небольших объемов данных они могут показаться не слишком медленными). Дешевые USB-накопители или SD-карты будут достигать низкого уровня параллелизма, но некоторый уровень параллелизма там тоже будет... С точки зрения максимального количества параллельных команд для одного устройства, SATA может иметь до 32, SCSI, как правило, находится в диапазоне от 10 до 100, NVMe может достигать 1000 (я думаю, спецификация ограничивает вас максимумом в 65536, но я пока не знаю устройства, которое бы достигало такого высокого уровня).

Передаются ли записи на диск по конвейеру (по шине?), чтобы ядру не приходилось ждать ответа на каждый запрос?

Да, несколько записей (или чтений) могут быть отправлены параллельно. Однако произойдет ли это, зависит от многих факторов (например, ядро ​​может группировать их вместе для эффективности, может потребоваться синхронизация, поэтому очередь должна быть очищена и т. д.)

Ставит ли ядро ​​в очередь все системные вызовы, запрошенные через io_uring?

Может быть. io_uringзавершит ввод-вывод в строке, если он не заблокируется, в противном случае он будет поставлен в очередь. ИзЭффективный ввод-вывод с io_uring: «Что еще более важно, для операций, которые не будут блокироваться, данные передаются в режиме реального времени».

Есть ли еще какие-то узкие места, которые я не учел?

Да. Также неясно, достаточно ли вы делаете ввода-вывода в секунду, чтобы действительно увидеть выгоду от чего-то вроде io_uring... Кроме того, частые синхронизации, вероятно, ограничат параллелизм в зависимости от частоты и того, как они выполняются. Если вы делаете буферизованный ввод-вывод, ядро ​​выжимает параллелизм даже в синхронном режиме, потому что вы пишете в ОЗУ, а затем ядро ​​отключается от ОЗУ параллельно, где это возможно. (Обратите внимание, что предыдущие пункты не являются исчерпывающим списком)

(Вопрос из заголовка)

Насколько хорошо масштабируются параллельные записи с помощью io_uring?

OK или очень хорошо в зависимости от того, какое ядро ​​вы используете и как вы отправляете ввод/вывод. Смотрите ссылки и ссылки в этомответ на вопрос «Действительно ли в Linux нет асинхронного блочного ввода-вывода?».

Рекомендации

Связанный контент