Linux套接字:零拷贝本地,TCP / IP远程
网络是我操作系统中最糟糕的区域,所以请原谅我提出一个不完整的问题.我已经读了几个小时这个,但它有点游泳在我脑海里. (对我而言,与制定网络协议相比,我觉得芯片设计很容易.)
我有一些通过套接字相互通信的网络服务.具体来说,套接字是使用fd = socket(PF_INET,SOCK_STREAM,0);创建的,它会自动获取TCP / IP.我需要这个作为基本案例,因为这些服务可能在不同的机器上运行. 但是对于一个项目,我们试图将它们全部压缩到基于Atom Z530P的动力不足的嵌入式“设备”中,因此在我看来,内存复制开销是我们可以优化的.我一直在读这里:data-link-access-and-zero-copy和Linux_packet_mmap和packet_mmap. 对于这种情况,可以创建如下的套接字:fd = socket(PF_PACKET,PF_RAW,0);.还有很多其他的事情要做,比如分配环形缓冲区,映射它们,将它们与套接字相关联等等.看起来你只能使用sendto和recvfrom来传输数据.据我所知,由于套接字是本地的,你不需要一个可靠的“流”类型套接字,所以原始套接字是适当的接口,我猜测环形缓冲区是以页面粒度使用的,每个数据包(或数据报)从页面边界开始. 在我花费大量时间尝试进一步调查之前,我希望一些有用的人可以帮助我解决一些问题: >我期望从零拷贝套接字获得多少性能优势?我想最后一次检查,我们从一个进程到另一个进程最多移动到40 MB /秒,最后到磁盘.在最基本的场景中,数据从捕获过程转移到一对多进程(其他人可以监听流),转移到写入磁盘的归档进程.这是两个不计算磁盘和内部东西的啤酒花. 在此先感谢您的帮助! 解决方法
有可能.使用PF_PACKET套接字仅适用于专门的东西.你可能想看一下 > sendfile(2)
根本不要“忘记”这些信息.
不,你必须自己做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |