Как контроллеры дисков обрабатывают параллельные записи в один и тот же сектор при отсутствии барьеров записи? - PullRequest
2 голосов
/ 01 декабря 2010

Когда я открываю файл с помощью O_DIRECT | O_ASYNC и выполняю две одновременные записи в один и тот же сектор диска без промежуточного fsync или fdatasync, предоставляет ли дисковая подсистема linux или контроллеры аппаратного диска какие-либо гарантии того, что окончательные данные на этом дискесектор диска будет вторая запись?

Хотя верно, что O_DIRECT обходит буферный кэш ОС, данные в конечном итоге попадают в очередь ввода-вывода низкого уровня (очередь планировщика диска, очередь драйвера диска, кэш-память / очереди контроллера оборудования и т. Д.).Я проследил весь стек ввода-вывода вплоть до алгоритма лифта.
Например, если следующая последовательность запросов окажется в очереди планировщика диска

write sector 1 from buffer 1  
write sector 2 from buffer 2  
write sector 1 from buffer 3 [Its not buffer 1!!]  

, то код лифта сделает «назад»"объединить", чтобы объединить сектор 1,2 из буферов 1,2 соответственно.А затем выведите на диск два дисковых ввода-вывода.Но я не уверен, что окончательные данные в секторе 1 диска получены из буфера 1 или буфера 3 (поскольку я не знаю о семантике переупорядочения записи драйверов / контроллеров).

Сценарий 2:

write sector 1 from buffer 1  
write sector 500 from buffer 2
write sector 1 from buffer 3

Как будет обрабатываться этот сценарий?Более простой вопрос заключается в том, что при выполнении записи в режиме O_DIRECT с AIO может ли эта последовательность запросов попадать в очередь планировщика диска при отсутствии явных барьеров записи?
Если да, есть ли какая-либо гарантия упорядочения, например, «множественные записи»в тот же сектор приведет к тому, что последняя запись будет последней записью "?
или этот порядок недетерминирован [оставлен во власти контроллера диска / его кэшей, который переупорядочивает записи в пределах барьеров для оптимизации времени поиска]

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

Барьеры уходят . Если вам требуется упорядочение между перекрывающимися записями, вы должны дождаться завершения первого, прежде чем выдавать второе. (Барьеры уходят.)

В общем случае я считаю, что нет гарантии. Окончательный результат является недетерминированным с точки зрения приложения, в зависимости от времени, состояния хоста и устройства хранения и т. Д.

Очередь запросов будет объединять запросы предсказуемым образом, но аппаратные средства не обязаны обеспечивать согласованные результаты для записей, которые находятся в очереди накопителя одновременно.

В зависимости от того, насколько быстрым является устройство хранения и насколько медленным является центральный процессор, вы не обязательно можете гарантировать, что объединение произойдет в очереди запросов до того, как команды будут отправлены на устройство хранения.

К сожалению, как приложения, использующие O_DIRECT (в отличие от файловых систем, которые непосредственно создают BIOS), должны ждать завершения, мне неясно.

0 голосов
/ 01 декабря 2010

ОК, запросы на запись попадают в очередь линейного лифта. На данный момент не имеет значения, пришли ли они из разных потоков. Такое же расположение может быть результатом того, что один поток выдает три последовательные записи. Теперь, вы бы доверили свои файлы ОС или контроллеру, который каким-то произвольным образом переупорядочивает последовательные записи в один и тот же сектор? Я бы не стал, но я могу ошибаться, конечно:)

...