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