使用内核 AIO 和O_DIRECT|O_SYNC
,不会复制到内核缓冲区中,并且当数据实际刷新到磁盘时可以获得细粒度的通知。但是,它需要将数据保存在用户空间缓冲区中io_prep_pwrite()
。
使用splice()
,可以将数据从内核空间缓冲区(管道)直接移动到磁盘,而无需到处复制。但是,splice()
在数据排队后立即返回,并且不等待实际写入磁盘。
目标是将数据从套接字移动到磁盘而不复制它,同时确认它已被清除。如何结合以前的两种方法?
通过与 结合splice()
,O_SYNC
我希望splice()
阻止并且必须使用多个线程来掩盖延迟。或者,可以使用异步io_prep_fsync()
/ io_prep_fdsync()
,但这会等待所有数据被刷新,而不是等待特定的写入。两者都不完美。
需要的是splice()
与内核 AIO 的组合,允许零复制和异步写入确认,这样单个事件驱动的线程可以将数据从套接字移动到磁盘并在需要时获得确认,但这似乎不是支持的。有没有好的解决方法/替代方法?