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