2010-07-27 23 views
5

A seguito della mia ultima domanda:prestazioni Socket su Linux

Performance issue using Javas Object streams with Sockets

sto guardando le prestazioni presa su Linux. Con l'esempio sopra ho un tempo di andata e ritorno di ~ 65 μ sec. Se faccio due fifo sul file system questo scende a ~ 45 μ sec. Il tempo extra che utilizza i socket localhost deve essere perché sto colpendo lo stack di rete.

C'è qualche configurazione del sistema operativo che può far diventare un socket localhost veloce come una named pipe?

uname -a 
Linux fiatpap1d 2.4.21-63.ELhugemem #1 SMP Wed Oct 28 23:12:58 EDT 2009 i686 athlon i386 GNU/Linux 

Grazie in anticipo!

+4

Stai utilizzando un kernel basato su 2.4? Questa è parte del problema. –

+0

Sì, uso ancora un giradischi;) Sapete se la versione successiva del kernal ottimizzerà il traffico di rete locale in modo diverso? – Jonathan

+0

Probabilmente no, potresti spiegare perché usare pipe con nome non è adatto? Hai provato a usare UDP invece di TCP? (DatagramSocket) – Ivan

risposta

1

Non posso aiutarti sul fronte Java, ma potresti dare un'occhiata ai socket di dominio UNIX. Ecco una domanda con la discussione su come usarli in Java:

UNIX socket implementation for Java?

+0

Sì, potrei usare qualcosa basato su jni. Preferirei non farlo, se possibile. Speravo che qualche versione successiva di Linux avrebbe fatto questa ottimizzazione per me. – Jonathan

1

Le vostre domande prima fanno due ipotesi false:

  1. ICMP_ECHO (anche noto come ping) i rendimenti informazioni temporali significative. Non lo è, tra le altre cose, lo strato ICMP può essere (e dovrebbe essere) a bassa priorità di servizio.
  2. Il marshalling dei dati tramite un'enorme interfaccia Java non è il collo di bottiglia. Perchè è.

I vostri metodi di test sono altamente sospetti. Cosa stai cercando di realizzare?

+0

Hell yeah. Bella risposta. Accidenti a quelle mille interfacce Java e al loro costo delle prestazioni. –

+0

On 1. ping mi sta dando ~ nello stesso tempo del mio test usando pipe con nome. On 2. Come sei giunto a questa conclusione? – Jonathan

2

Con l'esempio precedente ottengo un tempo di andata e ritorno di ~ 65μsec. Se faccio due fifo sul file system questo scende a ~ 45μsec. Il tempo extra che utilizza i socket localhost deve essere perché sto colpendo lo stack di rete.

Sì, e questo è normale.

I FIFO sono un metodo di comunicazione piuttosto primitivo. Il loro stato è essenzialmente una variabile bool. Le letture e le scritture passano attraverso lo stesso buffer pre-allocato di dimensioni fisse. Pertanto, il sistema operativo può ottimizzare e ottimizzare le operazioni.

Gli zoccoli sono più complessi. Loro hanno una macchina di stato del TCP a pieno titolo. Il buffering è dinamico e bidirezionale (recv, send sono bufferizzati separatamente). Ciò significa che quando si scrive qualcosa nel socket locale, si ha sempre una sorta di gestione dinamica della memoria. Linux cerca di evitarlo il più possibile: trucchi a zero copia/copia singola sono implementati dappertutto. Eppure, ovviamente, poiché le chiamate devono passare attraverso più codice, sarebbero più lente.

Alla fine, considerando la quantità di socket in più rispetto ai FIFO, la differenza di 20 è francamente un'affermazione su quanto siano buone le prestazioni del socket di Linux.

P.S. 65us rtt = ~ 35us in una direzione. 1s/35us = ~ 30K pacchetti al secondo. Per il codice di rete senza ottimizzazioni usando un'unica connessione che suona bene.

Problemi correlati