gpt4 book ai didi

io - 如果我使用 libaio + fsync() 会怎样?

转载 作者:行者123 更新时间:2023-12-04 08:09:11 26 4
gpt4 key购买 nike

我知道当我使用 write() 写文件时+ fsync() (或 O_SYNC + write() ,我认为它们是相同的 ref #1 ref #2 ),这意味着我正在使用阻塞同步 I/O,如果 write() (与 O_SYNC )或 fsync()返回,这意味着数据安全地位于设备介质(例如,用于 SSD 的 TLC NAND)而不是设备缓存(例如,SSD 中的 DDRAM)。
如果我使用 libaio 会怎样? (因为我想确保libaio发出的写在存储介质上而不是设备缓存上。即,我想当io_getevents()返回时,它可能不确定写在存储介质上,它可能只是在设备缓存上)

  • 问题 1 : 做 fsync()仅适用于同步 I/O?
  • 问题 2 :是 fsync()之后 io_submit()未定义的行为?
  • 问题 3 :如何使异步写入安全地持久保存到设备介质而不是设备缓存(无电池备份缓存)。
  • 最佳答案

    (此答案仅从 Linux 的角度看待事物。其他操作系统可能具有不同的行为/语义)
    只要您等待任何未完成的异步 I/O 完成,您就可以发送您的 fsync()并且知道所有以前的 I/O 都是写入稳定存储的,以充分了解 Linux 内核*。

    does fsync() exclusively works for synchronous I/O?


    这个问题没有意义。 fsync()适用于 Linux 同意已“发送”的 I/O,然后还刷新设备缓存。如果您向内核异步发送 I/O,内核是否同意它已“发送”?另请参阅最后一个问题的答案...

    is fsync() after io_submit() an undefined behavior?


    技术上 undefined behaviour意味着从那时起任何事情都将被允许合法发生(例如所谓的鼻守护进程)。情况并非如此,但我认为您是在问您的第一个问题,因此那里的答案仍然成立。

    how to make asynchronous write safely persisted to the device medium rather than device cache (no battery-backed cache).


    如果您在使用 libaio 时遇到困难您可以通过等待所有未完成的 I/O 完成然后发送 fsync() 来手动构建屏障。并等待那个或( as mentioned in a comment )。另一个 libaio技术是设置 RWF_SYNC期间的标志 io_submit() .如果您使用的是 io_uring 你会有另一个选择,因为你可以使用它的链接并且它有一个异步 fsync操作 ( IORING_OP_FSYNC )。

    * 我排除了发生错误的情况,因为它们相当复杂。见 Writing programs to cope with I/O errors causing lost writes on Linux详细说明。

    关于io - 如果我使用 libaio + fsync() 会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66073136/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com