UDP数据包未按时发送

时间:2012-09-17 09:09:43

标签: c++ udp delay

我正在开发一个可以被认定为路由器的C ++应用程序。此应用程序在给定端口上接收UDP数据包(每秒近37个字节),并且必须在10 ms周期内将它们多播到另一个目标。但是,有时在数据包接收之后,重传超过10毫秒的限制并且可以达到100毫秒。这些禁区延迟是随机的。 应用程序在同一个以太网接口上接收但在不同端口上接收其他类型的数据包(每秒最多200个数据包,接近100个字节)。我不确定这个后来的流程是否会扰乱另一个流量因为这些延迟峰值太稀缺(10000个数据包中有2个数据包)

这些零星延误的原因是什么?以及如何解决它们?

P.S。我的应用程序运行在Linux 2.6.18-238.el5PAE上。在接收数据包和传输成功之间测量延迟!

图像更清晰: enter image description here

1 个答案:

答案 0 :(得分:2)

对于非实时操作系统来说,10毫秒是一个艰难的最后期限。

  • 将您的流程分配给其中一个实时调度策略,例如: SCHED_RR或SCHED_FIFO(some reading)。它可以通过sched_setscheduler()在代码中完成,也可以通过chrt从命令行完成。你也可以调整优先级。

  • 确保您的代码不会消耗CPU,或者它会影响整个系统的性能。

  • 您可能还需要RT_PREEMPT patch

总的来说,生成以太网流量以便在Linux上进行调度的任务并不容易。例如。见BRUTE,一个高性能的流量发生器;也许你会在其代码或研究论文中找到有用的东西。