Размер блока для постоянного диска SSD составляет 4096 байт.
Если я напишу выровненные блоки размером 4096 байт непосредственно на блочное устройство (/ dev / sdb с O_DIRECT и posix_memalign), будут ли эти записи атомарными?
Я хочу, чтобы вызов записи либо успешно записал весь блок 4K, либо ничего не записал.
Могу ли я получить 100 байтов от новой записи, а остальные - старые данные?
Ознакомьтесь с _ATOMIC, который работает вместе с O_DIRECT для достижения этой цели. Видеть https://lwn.net/Articles/573092/.
Нет единого мнения о том, является ли запись размером с один сектор атомарной или нет в отношении потери мощности диска - см. https://stackoverflow.com/a/2015068/4513656 для обсуждения по этому поводу. По крайней мере, с точки зрения SCSI, атомарность одного сектора LBA является ожидаемым поведением (см. http://www.t10.org/pipermail/t10/2011-November/016011.html ), но имейте в виду, что уровень блоков Linux может объединять / разделять запросы и иметь дело не только с устройствами SCSI.
Также стоит отметить, что для устройств SCSI существуют явные команды T10 (например, WRITE ATOMIC
), которые явно гарантируют атомарность, но устройства не обязаны их реализовывать, и Linux не предоставляет их через обычные операции с блочными устройствами. Патчи для O_ATOMIC
флаг, упомянутый в другом ответе, не был в основном ядре на момент написания (ядро 4.10, февраль 2017 г.), и флаг не упоминается в открыть (2) справочную страницу.
Если система / диск никогда не выходит из строя, тогда да, одна запись LBA одного сектора должна казаться атомарной по отношению к одному чтению LBA того же самого сектора.
Обратите внимание, что использование O_DIRECT
не подразумевает, что запись была произведена в энергонезависимое хранилище, поэтому снова после сбоя вы можете обнаружить, что подтвержденных данных нет. Вам нужно будет использовать fsync
или O_SYNC
для обеспечения дополнительной стабильности, даже если вы используете блочное устройство.