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