巨大的UDP延迟/滞后与Android

我正在开发一个Android应用程序,它通过WLAN向Windows端点发送/接收大量UDP流量(不,我不能使用TCP)。

问题在于,当我增加流量时,我开始发现当我打电话给sendto(应用程序使用NDK写入)和当我看到数据包到达Windows端点时,发生了巨大的延迟。 在10秒附近! 同样的事情也发生了相反的情况:我发现Windows终端发送的数据包与recvfrom()被发现的数据包之间存在巨大的延迟。

  • 改变SO_SNDBUF没有任何作用,所以我认为这不是应用程序级缓冲控制的问题。
  • 我已经证实,这个问题存在于各种Android设备上,所以我不认为这是硬件/无线驱动程序的问题
  • 使用嗅探器并关联时间戳,我确认在调用sendto()和从Android设备发送的数据包之间发生延迟,因此缓冲不会发生在AP或Windows端点
  • 所以在这一点上,我几乎没有想法。 事实会让我相信,缓冲发生在Android操作系统层上,但10Mbps流量需要10秒? 对于内存占用如此巨大的操作系统而言,这似乎太高了。

    另外,如果问题在于我发送的数据太快而且压倒了操作系统,那么我希望sendto()返回ENOMEM或ENOBUFS ......但是没有迹象表明Android应用程序级别上的任何错误。

    所以我的问题是:是什么原因造成这种延迟? 有没有办法缓解它,或者我需要改变我的应用程序有更长的超时时间或某种方式来检测这种情况之前,它变得糟糕?


    你发送的太多了..你发送了多少? 10Mbps肯定太高了。 记住:

  • 您发送的每个UDP数据报都有一个额外的28字节报头(基于IPv4的UDP + IP)
  • 连接链路速度是您永远无法实现的理论最大限制
  • 手机操作系统可能会限制你,手机操作系统需要节约电池,并尽量减少套接字通信。
  • 要么

    你说你的CPU是20%,你有多少个核心 - 你可能正在完成发送的核心,即处理速度是瓶颈。


    对于有同样问题的人:

    尝试重新使用DatagramSocket。 这为我解决了它。


    最近我在linux-rt列表上看到了类似行为的报告,这可能是相关的。

    http://comments.gmane.org/gmane.linux.rt.user/10163

    几个月来,我一直被虚假的抖动困扰着,发现了

    UDP消息 - 在没有任何延迟的情况下在始发节点上接收的多播UDP消息,但在其他节点上检测到延迟范围为10毫秒。 简单地说,它看起来像一个消息被卡在内核中,然后才传输。 最后,感谢LTTng工具,我能够将问题定位在net / sched / sch_generic.c中代码的和平之处:

    传输上似乎存在锁定问题,导致tx失速。

    链接地址: http://www.djcxy.com/p/75133.html

    上一篇: Huge UDP delay/lag with Android

    下一篇: Scheduled tasks with multiple servers