gpt4 book ai didi

写入磁盘时的 Linux splice() + 内核 AIO

转载 作者:IT王子 更新时间:2023-10-29 00:22:13 27 4
gpt4 key购买 nike

使用内核 AIO 和 O_DIRECT|O_SYNC,不会复制到内核缓冲区,并且可以在数据实际刷新到磁盘时获得细粒度通知。但是,它需要将数据保存在 io_prep_pwrite() 的用户空间缓冲区中。

使用 splice(),可以将数据从内核空间缓冲区(管道)直接移动到磁盘,而无需复制它。但是,splice() 在数据排队后立即返回,并不等待实际写入磁盘。

目标是将数据从套接字移动到磁盘而不复制它,同时确认它已被清除。如何结合之前的两种方法?

通过将 splice()O_SYNC 结合使用,我预计 splice() 会阻塞,并且必须使用多个线程来屏蔽延迟。或者,可以使用异步 io_prep_fsync()/io_prep_fdsync(),但这会等待所有数据被刷新,而不是等待特定的写入。两者都不完美。

需要的是 splice() 与内核 AIO 的组合,允许零复制和异步写入确认,这样单个事件驱动的线程就可以将数据从套接字移动到磁盘,并且在需要时获得确认,但这似乎不受支持。是否有好的解决方法/替代方法?

最佳答案

要获得写入确认,您不能使用 splice()。

用户空间中有 aio 的东西,但如果你在内核中这样做,它可能会找出生成了哪些 bio( block I/O)并等待它们:

block I/O 结构:

如果你想使用AIO,你需要使用io_getevents():

以下是有关如何执行 AIO 的一些示例:

如果您从用户空间执行此操作并使用 msync 如果它实际上正在旋转生锈,它仍然有点悬而未决。

msync() 文档:

您可能不得不降低预期以使其更健壮,因为实际确保写入是按逻辑写入磁盘可能非常昂贵。

鉴于断电之类的情况,写保证的“最高”典型标准是修改存储的日志记录操作。日志本身只是附加的,您可以在回放时查看条目是否完整。最后的日记条目可能不完整,因此仍有可能丢失某些内容。

关于写入磁盘时的 Linux splice() + 内核 AIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20239939/

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