我正在开发一个Android应用程序,它通过WLAN向Windows端点发送/接收大量UDP流量(不,我不能使用TCP)。
问题在于,当我增加流量时,我开始看到当我调用sendto(应用程序是用NDK写入)和我看到数据包到达Windows端点之间的巨大延迟。在 10秒附近!反过来也是如此:我发现Windows端点发送的数据包与recvfrom()接收的数据包之间存在巨大的延迟。
所以在这一点上我只是出于想法。事实会让我相信缓冲是在Android OS层上发生的,但 10秒的10Mbps流量?对于内存占用非常大的操作系统而言,这似乎太高了。
此外,如果问题是我发送的数据太快并且压倒了操作系统,那么我希望sendto()返回ENOMEM或ENOBUFS ...但是没有迹象表明Android应用程序出了什么问题水平。
所以我的问题是:导致这种延迟的原因是什么?有没有办法减轻它,或者我是否需要更改我的应用程序以获得更长的超时或某种方式在它变坏之前检测到这种情况?
答案 0 :(得分:3)
你发送的太多了......你送多少钱? 10Mbps肯定是太高了。请记住:
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失速。