2013-10-28 40 views
7

私は、WLANを介してWindowsエンドポイントに大量のUDPトラフィックを送受信するAndroidアプリケーションで作業しています(いいえ、TCPは使用できません)。Androidで巨大なUDP遅延/遅延

問題は、私がトラフィックを増やすと、sendto(NDKでアプリケーションが書かれている)とパケットがWindowsエンドポイントに届くのを見たときの間に大きな遅延が見られることです。 の10秒以内の近くに!逆も同じことが起こります:パケットがWindowsのエンドポイントによって送信され、recvfrom()によってピックアップされている間に膨大な遅延が発生します。

  • SO_SNDBUFを変更しても効果はありません。アプリケーションレベルのバッファリング制御では問題にはならないと思います。
  • さまざまなAndroid搭載デバイスに問題があることを確認しましたので、ハードウェア/ワイヤレスドライバの問題ではないとは思いません。
  • スニファを使用してタイムスタンプを関連付けると、 sendto()とAndroidデバイスから送信されたパケットの呼び出しの間に発生するので、APまたはWindowsエンドポイントでバッファリングが行われていません。

この時点では、事実は私に、バッファリングがAndroid OS層で起こっていると信じさせるだろうが、10秒間の10Mbpsのトラフィック?メモリフットプリントがそれほど大きな関心事であるOSにとっては、それは実現するには高すぎるようです。

また、データを送信しすぎてOSを圧倒してしまうという問題がある場合は、sendto()がENOMEMまたはENOBUFSを返すと期待しています...しかし、Androidで何か間違っているという兆候はありませんアプリケーションレベル。

私の質問です:この遅延の原因は何ですか?それを緩和する方法があるのですか、タイムアウトが長くなるようにアプリケーションを変更する必要がありますか、悪化する前にこの状態を検出する方法がありますか?

+0

おそらく、あなたのCPUがビジーですか? –

+0

@AlexCohn私はちょうどCPU監視アプリケーションでチェックしました。忙しいですが忙しくはありません(最大約20%) –

+0

http://developer.android.com/reference/android/os/Debug.html#startMethodTracing()http://developer.android.com/tools/ debugging/ddms.html#network – auselen

答えて

3

あなたはどれくらい送信していますか? 10Mbpsは間違いなく高すぎます。あなたが送信するすべてのUDPデータグラムが(IPv4の上のUDP + IP)追加の28バイトのヘッダを持っている

  1. 接続リンク速度は、あなたが
  2. 達成することができないだろう理論上の最大値を制限している:覚えておいてください電話OSがあなたを制限している可能性があります。電話OSはバッテリーを節約し、ソケット通信を最小限に抑える必要があります。

OR

あなたは、あなたのCPUが20%であると言う、あなたはどのように多くのコア持っていない - あなたが送信を行っているコアを限界いっぱいまですることができ、すなわち、処理速度がボトルネックとなっています。

+0

私はあまりにも多くを送信していることを理解します。私の目標はデバイスの限界を押し進めることです。それは意図的で、私はそれが失敗することを期待しています。 10MBのデータをバッファリングするのではなく、エラーを返すことでエラーが発生することが予想されます。 –

+0

私は、10MBをバッファリングすることができますが、私は驚くことではありませんが、よく見ています。 – markmnl

0

最近、linux-rtのリストの動作が非常に似ているという報告がありますが、これは関連している可能性があります。

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

UDPメッセージで検出されたIスプリアスジッタで悩まされた数ヶ月間

、 - 遅延なし ノードを起点に受信したマルチキャストUDPメッセージが、他のノードに範囲が10秒の ミリ秒の遅延が検出されました。単純に、最終的に送信される前に、メッセージがカーネルの に貼り付けられたように見えました。 最後に、LTTngツールのおかげで、私はネット/ SCHED/sch_generic.cに までのコードのこの平和を問題を見つけることができました:

その送信のロックの問題があるように見えますtxストールを引き起こします。同じ問題を持つ人々のために

1

:DatagramSocketのを再利用する

してみてください。それは私のためにそれを解決しました。

+0

ありがとうございます。私はいつかこれを試してみるよ –