【发布时间】:2021-05-10 09:03:21
【问题描述】:
我知道当我使用write() + fsync()(或O_SYNC + write(),我认为它们是相同的ref #1 ref #2)编写文件时,这意味着我正在使用阻塞同步I/ O,如果write()(with O_SYNC) 或fsync() 返回,则表示数据安全地保存在设备介质上(例如SSD 的TLC NAND)而不是设备缓存(例如SSD 中的DDRAM) )。
如果我使用libaio 会怎样? (因为我想确保libaio发出的写是在存储介质上而不是在设备缓存上。也就是说,我想当io_getevents()返回时,它可能无法确定写在存储介质上,它可能只是在设备缓存上)
-
问题 1:
fsync()是否专门用于同步 I/O? -
问题2:
fsync()在io_submit()之后是未定义的行为吗? - 问题 3:如何使异步写入安全地持久化到设备介质而不是设备缓存(无电池支持的缓存)。
【问题讨论】:
-
linux目前好像不支持aio fsync:github.com/axboe/fio/blob/fio-3.25/engines/libaio.c#L256-L268
-
如果想用 libaio 安全地持久写入,请在
io_submit(2)中使用RWF_SYNC标志:man7.org/linux/man-pages/man2/io_submit.2.html