Sto lavorando a un'applicazione Android che invia/riceve un volume elevato di traffico UDP a un endpoint Windows su una WLAN (e no, non posso usare TCP).Ritardo UDP/lag enorme con Android
Il problema è che quando accelero il traffico, comincio a vedere ENORME ritardi tra quando chiamo sendto (l'app è scritta con l'NDK) e quando vedo il pacchetto arrivare all'endpoint di Windows. Nelle vicinanze di 10 secondi! La stessa cosa accade anche al contrario: vedo ritardi enormi tra il pacchetto inviato dall'endpoint di Windows e rilevato da recvfrom().
- La modifica di SO_SNDBUF non ha alcun effetto, quindi non penso che sia un problema con il controllo del buffering a livello di applicazione.
- Ho verificato che il problema esiste su una varietà di dispositivi Android, quindi non credo che sia un problema con l'hardware/driver wireless
- con uno sniffer e correlare i timestamp, mi ha confermato che il ritardo è che si verificano tra chiamare sendto() e il pacchetto viene inviato dal dispositivo Android, in modo che il buffer non sta accadendo nel AP o endpoint di Windows
quindi a questo punto io sono tutto, ma a corto di idee. I fatti mi porterebbero a credere che il buffering stia accadendo sul livello del SO Android, ma 10 secondi di traffico a 10 Mbps? Sembra troppo alto per essere fattibile per un sistema operativo in cui l'impronta della memoria è una preoccupazione così grande.
Inoltre, se il problema è che sto invio di dati troppo veloce e travolgente il sistema operativo, quindi mi aspetterei sendto() per restituire ENOMEM o ENOBUFS ... Ma non ci sono indicazioni che qualcosa è sbagliato su Android livello di applicazione.
Quindi la mia domanda è: cosa sta causando questo ritardo? E c'è un modo per mitigarlo, o devo modificare la mia applicazione per avere timeout più lunghi o qualche modo per scoprire questa condizione prima che diventi cattiva?
Forse la tua CPU è troppo occupata? –
@AlexCohn Ho appena controllato con un'app di monitoraggio della CPU; è occupato ma non troppo occupato (massimo del 20% circa) –
http://developer.android.com/reference/android/os/Debug.html#startMethodTracing() http://developer.android.com/tools/ debugging/ddms.html # network – auselen