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.
Stai utilizzando un kernel basato su 2.4? Questa è parte del problema. –
Sì, uso ancora un giradischi;) Sapete se la versione successiva del kernal ottimizzerà il traffico di rete locale in modo diverso? – Jonathan
Probabilmente no, potresti spiegare perché usare pipe con nome non è adatto? Hai provato a usare UDP invece di TCP? (DatagramSocket) – Ivan