Retraso / retraso enorme de UDP con Android

Estoy trabajando en una aplicación de Android que envía / recibe un alto volumen de tráfico UDP a un punto final de Windows a través de una WLAN (y no, no puedo usar TCP).

El problema es que cuando empiezo el tráfico, empiezo a ver grandes retrasos entre cuando llamo sendto (la aplicación está escrita con el NDK) y cuando veo que el paquete llega al punto final de Windows. En el barrio de 10 segundos ! Lo mismo sucede a la inversa también: veo enormes retrasos entre el paquete que se envía por el punto final de Windows y ser recogido por recvfrom ().

  • Cambiar SO_SNDBUF no tiene ningún efecto, por lo que no creo que sea un problema con el control de nivel de nivel de aplicación.
  • He comprobado que el problema existe en una variedad de dispositivos Android, por lo que no creo que sea un problema con los controladores de hardware / inalámbricos
  • Utilizando un sniffer y correlacionando las marcas de tiempo, confirmé que el retardo se está produciendo entre llamar a sendto () y el paquete que se está enviando desde el dispositivo Android, por lo que el almacenamiento en búfer no está ocurriendo en el punto final de AP o Windows

Así que en este punto estoy casi fuera de las ideas. Los hechos me llevaría a creer que el almacenamiento en búfer está sucediendo en la capa de Android OS, pero 10 segundos de tráfico de 10Mbps ? Eso parece demasiado alto para ser factible para un sistema operativo donde la huella de memoria es una preocupación tan grande.

Además, si el problema es que estoy enviando datos demasiado rápido y abrumador el sistema operativo, entonces esperaría sendto () para devolver ENOMEM o ENOBUFS … Pero no hay indicios de que algo está mal en el nivel de aplicación de Android.

Así que mi pregunta es: ¿qué está causando este retraso? ¿Hay alguna manera de mitigarlo o necesito modificar mi aplicación para tener tiempos de espera más largos o alguna forma de detectar esta condición antes de que se ponga mala?

3 Solutions collect form web for “Retraso / retraso enorme de UDP con Android”

Estás enviando demasiado … ¿cuánto estás enviando? 10Mbps es definitivamente demasiado alto. Tener en cuenta:

  1. Cada datagrama UDP que envíe tiene un encabezado adicional de 28 bytes (UDP + IP sobre IPv4)
  2. Las velocidades del enlace de conexión son máximos teóricos que nunca podrás alcanzar
  3. El sistema operativo del teléfono podría estar limitándote, la necesidad del teléfono OS de conservar la batería e intentar minimizar los comms del zócalo para hacer tan.

O

Usted dice que su CPU está en un 20%, ¿cuántos núcleos tiene – podría ser maxing el núcleo que está haciendo el envío, es decir, la velocidad de procesamiento es el cuello de botella.

Para personas con el mismo problema:

Intente reutilizar el DatagramSocket. Eso me lo resolvió.

He visto informes de comportamiento muy similar en la lista de linux-rt últimamente, que pueden estar relacionados.

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

Durante varios meses estuve embrujado con jitter espuria, detectado en

Mensajes UDP – mensajes UDP de multidifusión donde se recibieron en el nodo de origen sin ningún retardo, pero en otros nodos se detectó un retardo en el intervalo de 10s de milisegundos. Simplemente, parecía que un mensaje estaba atrapado en el núcleo antes de que finalmente se transmitiera. Finalmente, gracias a la herramienta LTTng, pude localizar el problema en esta paz de código en net / sched / sch_generic.c:

Parece que hay un problema de bloqueo en la transmisión que causa la parada tx.

  • Enviar notificación a todos los dispositivos conectados a una red Wi-Fi
  • Conexión WiFi a través de Android
  • ¿Por qué WiFiP2P necesita permiso de Internet?
  • ¿Cómo puedo transferir archivos entre dispositivos Android mediante Wi-Fi Direct?
  • Chat wifi entre dos o más dispositivos Android
  • Comprobación de Wi-Fi activado o no en Android
  • ¿Podemos conectar más de 10 dispositivos con wi-fi hot-spot en Android
  • Cómo probar descargar y subir velocidad wifi / 3g?
  • Conexión WiFi de Android mediante programación
  • Averigüe si una dirección / puerto ya está enlazado bajo Android
  • Conecte Android a la red WiFi Enterprise EAP (PEAP)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.