Connessione loopback TCP rispetto alle prestazioni del socket di dominio Unix


116

Lavorare su un'applicazione basata su Android e iOS che richiede la comunicazione con un server in esecuzione sullo stesso dispositivo. Attualmente utilizza una connessione loopback TCP per comunicare con App e Server (App scritta a livello utente, server scritta in C ++ utilizzando Android NDK)

Mi chiedevo se la sostituzione dell'intercomunicazione con il socket di dominio Unix migliorerebbe le prestazioni?

O in generale ci sono prove / teorie che dimostrano che il socket di dominio Unix darebbe prestazioni migliori rispetto alla connessione loopback TCP?


3
Ricorda che i socket locali (socket di dominio UNIX) necessitano di un file nel filesystem. L'utilizzo dell'indirizzo di loopback TCP mantiene tutto in memoria. E se devi usare socket TCP remoti, potrebbe essere più facile integrare un altro socket TCP invece di armeggiare con un nuovo socket e una nuova famiglia di indirizzi.
Un tizio programmatore il

1
@JoachimPileborg Quando si sviluppa solo per Linux (Android) c'è la possibilità di utilizzare indirizzi socket di dominio UNIX astratti , che non richiedono un file nel filesystem.
thuovila

fare riferimento a stackoverflow.com/questions/14643571/… per la connessione Android.
RDX

8
@Someprogrammerdude Hanno bisogno di un file nel filesystem, ma questo non significa che tutto vada su disco e viceversa.
Marchese di Lorne

3
@Someprogrammerdude Solo il nome del file, la proprietà e le informazioni sui permessi vengono mai archiviati nel filesystem. Tutto il trasferimento dati effettivo avviene interamente in memoria.
Jesin

Risposte:


105

Sì, la comunicazione interprocesso locale tramite socket di dominio unix dovrebbe essere più veloce della comunicazione tramite connessioni loopback localhost perché hai meno overhead TCP, vedi qui .


12
il primo collegamento sta citando il secondo collegamento, che è del 2005 (vecchio). e copre solo FreeBSD
Janus Troelsen

7
Questa risposta è sbagliata, quando testato loopback tcp su linux moderno è veloce e talvolta più veloce di UDS. può fornire benchmark, se necessario
easytiger

10
Questa risposta è assolutamente corretta. L'interfaccia di loopback è ancora TCP, il che significa che hai ancora il sovraccarico di TCP (controllo della congestione, controllo del flusso, gestione del flusso (ordinamento dei pacchetti IP, ritrasmissione, ecc.)). I socket di dominio Unix non eseguono nessuna delle operazioni precedenti perché sono stati progettati da zero per essere eseguiti localmente, il che significa nessun problema di congestione, nessuna differenza di velocità tra server / client che richiede il controllo del flusso, nessun pacchetto perso, ecc. Google in caso di dubbio , non una cosa nuova.
JSON

4
E l'UDP locale?
CMCDragonkai

2
dato che il primo collegamento è morto (HTTP 404) ... questo è il motivo per cui la migliore pratica di stackoverflow è di fornire almeno una citazione pertinente breve / concisa dall'URL di origine al momento della scrittura della risposta (quindi quando il collegamento si interrompe il breve riassunto è ancora disponibile).
Trevor Boyd Smith

80

Questo benchmark: https://github.com/rigtorp/ipc-bench fornisce test di latenza e velocità effettiva per socket TCP, Unix Domain Sockets (UDS) e PIPE.

Here you have the results on a single CPU 3.3GHz Linux machine :

TCP average latency: 6 us

UDS average latency: 2 us

PIPE average latency: 2 us

TCP average throughput: 0.253702 million msg/s

UDS average throughput: 1.733874 million msg/s

PIPE average throughput: 1.682796 million msg/s

La riduzione della latenza del 66% e la velocità effettiva di quasi 7 volte superiore spiegano perché la maggior parte dei software critici per le prestazioni dispone del proprio protocollo IPC personalizzato.


7
Mi sembra che il loro prodotto sia una risposta al problema! Forse è per questo che stanno rispondendo a quelle domande; perché sanno una risposta.
GreenReaper

Questa è un'ottima risposta perché ha dei numeri. Il throughput da TCP a UNIX è migliore del 350%, da UNIX a PIPE del 40% su i5.
ScalaWilliam

13
@GreenReaper La risposta è davvero rilevante, ma la linea del nostro prodotto Torusware Speedus ... viene fornito con 2 versioni, Speedus Lite e Speedus Extreme Performance (EP) non lo è, e fa sembrare il tutto come una pubblicità economica.
Dmitry Grigoryev

3
Spam. E no, il suo prodotto non è rilevante in un confronto tra i socket TCP e Unix. Ci sono molte alternative di buon senso alle prese, ognuna al di fuori di ciò che chiede l'OP
JSON

L'utilizzo di tale strumento non è sufficientemente spiegato. C'è in qualche modo una pagina che spiega come chiamare client e server?
falkb

40

Il benchmark Redis mostra che il socket di dominio unix può essere significativamente più veloce del loopback TCP.

Quando i programmi di benchmark server e client vengono eseguiti sulla stessa scatola, è possibile utilizzare sia il loopback TCP / IP che i socket di dominio unix. A seconda della piattaforma, i socket di dominio unix possono raggiungere circa il 50% in più di throughput rispetto al loopback TCP / IP (su Linux ad esempio). Il comportamento predefinito di redis-benchmark è utilizzare il loopback TCP / IP.

Tuttavia, questa differenza è importante solo quando la velocità effettiva è elevata.

Velocità effettiva per dimensione dati


8

I socket di dominio Unix sono spesso due volte più veloci di un socket TCP quando entrambi i peer si trovano sullo stesso host. I protocolli di dominio Unix non sono una vera e propria suite di protocolli, ma un modo per eseguire la comunicazione client / server su un singolo host utilizzando la stessa API utilizzata per client e server su host diversi. I protocolli di dominio Unix sono un'alternativa ai metodi di comunicazione interprocesso (IPC).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.