Каков размер атомарной записи на диск в моей системе?

10

В документации по access_logдирективе , документация Nginx говорит

Размер буфера не должен превышать размер атомарной записи в файл на диске.

Как я могу определить, что это за размер в моей системе?

bdesham
источник
@mdpc Из связанного документа довольно ясно, что речь идет не о размерах секторов, что кстати. Начиная с конца 80-х годов и до сих пор, на большинстве носителей было 512 байт. На новых дисках наблюдается переход к размеру сектора 4K.
Касперд
Эта спецификация может быть актуальной. Хотя, похоже, он не дает точного ответа на вопрос: pubs.opengroup.org/onlinepubs/7908799/xsh/write.html
kasperd

Ответы:

3

лучше поздно, чем никогда :)

быстрый ответ: «2 147 479 552 байта, если версия ядра 3.14 или новее»

подробный ответ:

Насколько я понимаю, речь идет о записи системного вызова:

http://man7.org/linux/man-pages/man2/write.2.html

1) любые системы POSIX (linux, bsd, все unix) гарантированно смогут записывать до MAX_SSIZE байтов

Согласно POSIX.1, если число больше, чем SSIZE_MAX, результат определяется реализацией; см. примечания для верхнего предела в Linux.

# getconf SSIZE_MAX
32767

2) Linux гарантированно сможет писать до 1,99 ГБ (и это атомарная операция для ядра Linux версии 3.14 и новее)

В Linux функция write () (и аналогичные системные вызовы) будет передавать не более 0x7ffff000 (2 147 479 552) байта, возвращая количество фактически переданных байтов. (Это верно как для 32-битных, так и для 64-битных систем.)

Но это справедливая атомарная операция только с ядром Linux 3.14

Согласно Разделу XSI 2.9.7 POSIX.1-2008 / SUSv4 («Взаимодействие потоков с обычными файловыми операциями»):

Все следующие функции должны быть атомарными по отношению друг к другу в эффектах, указанных в POSIX.1-2008, когда они работают с обычными файлами или символическими ссылками: ...

Среди перечисленных ниже API есть write () и writev (2). И среди эффектов, которые должны быть атомарными в потоках (и процессах), есть обновления смещения файла. Однако в Linux до версии 3.14 этого не произошло: если два процесса, которые совместно используют описание открытого файла (см. Open (2)), выполняют write () (или writev (2)) одновременно, тогда I Операции / O не были атомарными в отношении обновления смещения файла, в результате чего блоки данных, выводимых двумя процессами, могли (неправильно) перекрываться. Эта проблема была исправлена ​​в Linux 3.14.

Олег Корчагин
источник
1

Этот ответ суперпользователя дал хорошее определение атомного размера записи.

Это по крайней мере столько же, сколько размер аппаратного сектора, который является атомным размером чтения / записи.

mlw4428
источник
1
Итак, как мне определить, насколько большой сектор диска?
bdesham
9
Документация nginx и ответ суперпользователя не говорят об одном и том же слое в стеке хранения. В документации nginx говорится о самой большой атомарной записи на уровне файловой системы, которая зависит от ОС и FS. Ответ суперпользователя говорит о самой большой атомарной записи на уровне блоков, которая зависит от аппаратного обеспечения.
Касперд