使用Android的巨大UDP延迟/延迟

时间:2013-10-28 22:40:21

标签: android sockets android-ndk udp wifi

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

问题在于,当我增加流量时,我开始看到当我调用sendto(应用程序是用NDK写入)和我看到数据包到达Windows端点之间的巨大延迟。在 10秒附近!反过来也是如此:我发现Windows端点发送的数据包与recvfrom()接收的数据包之间存在巨大的延迟。

  • 更改SO_SNDBUF无效,因此我认为这不是应用程序级缓冲控制的问题。
  • 我已经验证了各种Android设备上存在的问题,所以我认为这不是硬件/无线驱动程序的问题
  • 使用嗅探器并关联时间戳,我确认在调用sendto()和从Android设备发送的数据包之间发生延迟,因此缓冲不会发生在AP或Windows端点

所以在这一点上我只是出于想法。事实会让我相信缓冲是在Android OS层上发生的,但 10秒的10Mbps流量?对于内存占用非常大的操作系统而言,这似乎太高了。

此外,如果问题是我发送的数据太快并且压倒了操作系统,那么我希望sendto()返回ENOMEM或ENOBUFS ...但是没有迹象表明Android应用程序出了什么问题水平。

所以我的问题是:导致这种延迟的原因是什么?有没有办法减轻它,或者我是否需要更改我的应用程序以获得更长的超时或某种方式在它变坏之前检测到这种情况?

3 个答案:

答案 0 :(得分:3)

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

  1. 您发送的每个UDP数据报都有一个额外的28字节标头(UDP + IP over IPv4)
  2. 连接链接速度是您永远无法实现的理论最大限制
  3. 手机操作系统可能会限制您,手机操作系统需要节省电池并尽量减少插座通信。
  4. OR

    你说你的CPU是20%,你有多少核心 - 你可以最大限度地发挥正在发送的核心,即处理速度是瓶颈。

答案 1 :(得分:1)

对于有同样问题的人:

尝试重用DatagramSocket。这解决了我。

答案 2 :(得分:0)

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

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

几个月来,我在

上检测到了虚假的抖动
  
    

UDP消息 - 在发起时收到的多播UDP消息     节点没有任何延迟,但在其他节点上的延迟范围为10s     检测到毫秒。简单地说,它看起来像一条消息被卡住了     在最终传输之前在内核中。     最后,感谢LTTng工具,我能够找到问题所在     net / sched / sch_generic.c中的代码和平:     

  

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