在Linux上使用共享内存进行低延迟数据包处理?

4
如果我想在Linux上接收UDP数据包(并且我不介意更改一些源代码),那么我的应用程序读取数据包的最快方法是什么?
我是否需要修改网络堆栈,以便一旦接收到UDP数据包,它就被写入共享内存,并让应用程序访问该内存?
是否有任何方法让堆栈通知应用程序进行反应,而不是让应用程序不断轮询共享内存?
欢迎任何建议/进一步资源-我只看到过:

http://www.kegel.com/c10k.html


2
抱歉,但你确定使用recvfrom(2)等普通方式读取UDP数据包不够快吗?更改Linux源代码会带来相当大的维护负担。 - Seg Fault
除非它直接使用零拷贝将数据包输出到内存中,否则@SegFault速度不够快。我不关心维护,只关心实现。 - user997112
2
可能是Is zero-copy UDP packing receiving possibly on Linux?的重复问题。 - rob mayoff
2
你在没有提供具体数字的情况下宣布延迟要求,因此你的问题无法立即得到回答。第一步应该是测量现有的延迟问题并报告它们。然后确定最佳解决方案(提示:用于读取数据的系统调用几乎从来不是问题的根源——而是考虑更改硬件)。这个问题充满了过早优化的味道。 - Andy Ross
2
你即使从使用标准的select / recvfrom循环中削减下来一个微秒,也是非常幸运的。互联网上的UDP延迟为10毫秒,而在服务器机房内则约为1毫秒。你正在错误的地方寻找。 - TerryE
1个回答

0

如果延迟成为问题,而默认的UDP网络堆栈无法满足您的要求,则尝试使用不同的现有(可安装的)网络堆栈。

例如,尝试使用 UDP Lite,与标准UDP堆栈进行比较,这个特定的堆栈在UDP数据报上不执行任何校验和,从而在提供损坏的数据报给应用程序层的代价下降低延迟。

副注:您不需要拥有 "轮询" 机制。阅读select的手册(以及它可能的派生物,如pselectppoll),使用此API,内核将会在管道中有东西可读或写时立即 "唤醒" 您的应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接