我正在构建一个性能非常高的Linux服务器(基于epoll,非阻塞套接字和异步磁盘IO [基于io_submit/io_getevents/eventfd]).我的一些基准测试表明,我处理套接字的方式不足以满足我的要求.特别是,我关心的是将数据从用户空间缓冲区传输到网卡,从网卡返回到用户空间缓冲区(现在让我们忽略sendfile调用).
根据我的理解,在非阻塞Linux套接字上调用读/写并不是完全异步的 - 系统调用阻塞,同时将缓冲区从用户空间复制到内核(或者反过来),然后才返回.有没有办法避免在Linux中听到这种情况?特别是,我是否可以在一个立即返回的套接字上进行完全异步写入调用,必要时将用户空间缓冲区DMA发送到网卡,并发出信号/设置事件/等.在结束的时候?我知道Windows有一个接口,但我在Linux中找不到任何相关的东西.
谢谢!
caf*_*caf 19
最近在Linux内核上有一些关于为这些内容提供API的讨论,但关键是你不能从一般用户空间缓冲区到网卡,因为:
在最近的内核,你可以尝试使用vmsplice,并splice共同实现你想要的- vmsplice在页(SPLICE_F_GIFT您想发送到管道中),然后splice他们(与SPLICE_F_MOVE从管道)插入插座.