io_getevents
通知机制乍一看似乎非常能胜任,因此我希望找到可以与之配合使用的东西。但是我还没有找到合适的东西。在Windows上,这很容易:只有TransmitFile
,它可以异步(重叠)工作,并且如果需要的话,可以使用一些通知机制(IOCP、事件)。在Linux上肯定也有相应的等效物,对吧?或者说,为了让我的问题更具体一些,我该如何在Linux上创建一个高效的文件服务器?io_getevents
通知机制乍一看似乎非常能胜任,因此我希望找到可以与之配合使用的东西。但是我还没有找到合适的东西。在Windows上,这很容易:只有TransmitFile
,它可以异步(重叠)工作,并且如果需要的话,可以使用一些通知机制(IOCP、事件)。在Linux上肯定也有相应的等效物,对吧?或者说,为了让我的问题更具体一些,我该如何在Linux上创建一个高效的文件服务器?哎呀,对于您来说,在Linux上没有什么是容易的,几乎任何事情都可能在错误的情况下被阻塞(甚至包括io_submit
)。回答您的问题(标题和正文中):
sendfile
的系统级异步版本(Linux不是Windows或FreeBSD)。有一篇优秀的文章涵盖了sendfile
阻塞、注意事项和想法,在TANK分布式日志问题中。其中指出lighttpd提出了一个“异步”sendfile
的hack,但它很复杂并使用线程。这就是现实...
有一个建议是,一些未来的Linux内核(晚于5.5,因为在撰写本文时已经更新到了5.5-rc7)可以通过io_uring实现异步sendfile,如果io_uring获得对splice()
的支持...
io_submit
只在极端情况下阻塞,比如I/O请求队列或完成队列已满。也就是说,在这种情况下,你确实需要等待任务完成。 - purefanaticio_submit
可能会阻塞,这并不算是什么奇特或极端的情况。 - Anonio_submit
的参考!我认为POSIX从未强制要求一个合适的异步框架,这正是Linux没有考虑异步I/O的确切原因之一。这就是为什么我称之为一种劣势的原因。 - purefanatic
sendfile
也是如此(它将报告在套接字的“缓冲区”中计划发送多少数据)。您需要轮询套接字以查看何时可以继续sendfile
操作(参见epoll
)... 或者更好的办法是使用一个为您完成此操作的库。 - Mystreadahead
来解决这个问题:http://brad.livejournal.com/2228488.html。这引入了更复杂的应用程序设计和更多的延迟,因为在实际工作之前需要进行多次上下文切换。我并不真正满意整个“非阻塞”方法。 - purefanatic