Назад | Перейти на главную страницу

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

В документации для в access_log директивав документации nginx говорится

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

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

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

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

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

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

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

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

Согласно POSIX.1, если count больше 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

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

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

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

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

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