Domanda

Come si sceglie la dimensione di un buffer (byte da cui ho letto o che scrivo sul socket) per il massimo throughput quando si implementa un trasferimento HTTP e FTP di basso livello? La mia applicazione dovrebbe trasferire dati con HTTP o FTP su connessioni che variano da 130 Kbps a 3 Mbps (conosco in anticipo la velocità prevista). A volte è un trasferimento di sola andata, a volte va in entrambe le direzioni. Devo attenermi a una dimensione del buffer media o devo variare a seconda della velocità di connessione?

Grazie.

È stato utile?

Soluzione

Innanzitutto, ottieni alcune misurazioni.

Quindi, dopo aver effettuato una misurazione affidabile delle prestazioni, apportare modifiche alla dimensione del buffer e tracciare un grafico della velocità rispetto alla dimensione del buffer.

Poiché conosci in anticipo le velocità di connessione, dovresti essere in grado di ottenere alcune misurazioni delle velocità effettive con dimensioni del buffer effettive diverse.

Il sistema operativo, lo stack di protocollo e la rete sono troppo complessi per elaborare una risposta dai primi principi. Devi misurare prima di fare qualsiasi cosa.

Altri suggerimenti

Scegli una dimensione del buffer superiore a 8 KB. 9000 è in genere la più grande dimensione MTU (unità di trasmissione massima) utilizzata anche nelle reti più veloci.

Quando si utilizza un buffer più grande dell'MTU della connessione, il sistema operativo lo suddividerà in pezzi di dimensioni MTU secondo necessità, e quindi tutto ciò che si utilizza sull'MTU avrà scarso effetto sulle prestazioni della rete.

Tuttavia, l'utilizzo di un buffer di grandi dimensioni avrà probabilmente un altro effetto sulle prestazioni, se si trasferiscono file, l'utilizzo di buffer di grandi dimensioni può aumentare le prestazioni di lettura, migliorando così la velocità dell'applicazione.

Quindi, di solito è una buona idea scegliere un bel numero di round come 16KB. Sicuramente non andare al di sotto di 1500, poiché ciò può influire negativamente sulle prestazioni della rete (causando talvolta il sistema operativo di inviare piccoli pacchetti, che riducono le prestazioni sulla rete).

È possibile ottenere le dimensioni del buffer: httpSocket.getReceiveBufferSize (); Consiglio vivamente di scrivere questo buffer su RAM durante il processo di lettura. Ad esempio: ByteArrayOutputStream memoryFile. e solo dopo aver riempito il buffer, scriverlo sul disco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top