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

C 在Linux上使用共享内存进行低延迟数据包处理?,c,linux,performance,udp,latency,C,Linux,Performance,Udp,Latency,如果我要在Linux上接收UDP数据包(我不介意更改一些源代码),我的应用程序读取数据包的最快方式是什么 我是否希望修改网络堆栈,以便在收到UDP数据包后将其写入共享内存,并让应用程序访问该内存 堆栈是否有办法通知应用程序作出反应,而不是让应用程序连续轮询共享内存 欢迎提供任何建议/进一步的资源-我只看到: 如果延迟是一个问题,并且默认的UDP网络堆栈不能按照您的意愿运行,那么请尝试使用不同的现有(可安装)网络堆栈 例如,请尝试,与标准UDP堆栈相比,此特定堆栈不会对UDP数据报执行任何校验和,

如果我要在Linux上接收UDP数据包(我不介意更改一些源代码),我的应用程序读取数据包的最快方式是什么

我是否希望修改网络堆栈,以便在收到UDP数据包后将其写入共享内存,并让应用程序访问该内存

堆栈是否有办法通知应用程序作出反应,而不是让应用程序连续轮询共享内存

欢迎提供任何建议/进一步的资源-我只看到:


如果延迟是一个问题,并且默认的UDP网络堆栈不能按照您的意愿运行,那么请尝试使用不同的现有(可安装)网络堆栈

例如,请尝试,与标准UDP堆栈相比,此特定堆栈不会对UDP数据报执行任何校验和,从而以向应用层提供损坏的数据报为代价减少延迟


旁注:您不需要“轮询”机制。阅读
select
(可能是类似
pselect
ppoll
)的手册,有了这样的API,内核将在应用程序管道中有东西要读或写时“唤醒”应用程序。

对不起,但您确定,通过recvfrom读取UDP数据包的正常方式(2)等等,速度不够快吗?更改Linux源代码会造成相当大的维护负担,除非它使用zero copy直接将数据包输出到内存,否则它的速度就没有我希望的那么快。我不关心维护,只关心实现。可能重复的是,您在宣布延迟要求时没有提供数字,因此您的问题无法立即得到回答。第一步需要测量您现有的延迟问题并报告它们。然后确定最佳解决方案(提示:用于读取数据的syscall几乎从来都不是问题——请改为查看更改硬件)。这个问题散发出过早优化的味道。使用std select/recvfrom循环的延迟即使减少一微秒,你也会非常幸运。互联网上的UDP在服务器机房结构内为10毫秒或~1毫秒。你找错地方了。