Conexão de loopback TCP vs desempenho de soquete de domínio Unix

116

Trabalhar em um aplicativo baseado em Android e iOS que requer comunicação com um servidor em execução no mesmo dispositivo. Atualmente usando conexão de loopback TCP para comunicação com o aplicativo e o servidor (aplicativo escrito na camada do usuário, servidor escrito em C ++ usando Android NDK)

Eu queria saber se a substituição da intercomunicação pelo soquete do domínio Unix melhoraria o desempenho?

Ou, em geral, há alguma evidência / teoria que prova que o soquete de domínio Unix daria melhor desempenho do que a conexão de loopback TCP?

RDX
fonte
3
Lembre-se de que os soquetes locais (soquetes de domínio UNIX) precisam de um arquivo no sistema de arquivos. Usar o endereço de loopback do TCP mantém tudo na memória. E se você tiver que usar soquetes TCP remotos, pode ser mais fácil integrar outro soquete TCP em vez de mexer com um novo soquete e família de endereços.
Algum programador cara de
1
@JoachimPileborg Ao desenvolver apenas para Linux (Android), há a opção de usar endereços de soquete de domínio UNIX abstratos , que não precisam de um arquivo no sistema de arquivos.
thuovila de
consulte stackoverflow.com/questions/14643571/… para conexão com o Android.
RDX de
8
@Someprogrammerdude Eles precisam de um arquivo no sistema de arquivos, mas isso não significa que tudo vai para o disco e volta.
Marquês de Lorne
3
@Someprogrammerdude Apenas as informações de nome de arquivo, propriedade e permissões são armazenadas no sistema de arquivos. Toda a transferência de dados real ocorre inteiramente na memória.
Jesin

Respostas:

105

Sim, a comunicação local entre processos por soquetes de domínio unix deve ser mais rápida do que a comunicação por conexões de loopback localhost porque você tem menos sobrecarga de TCP, veja aqui .

0x4a6f4672
fonte
12
o primeiro link está citando o segundo link, que é de 2005 (antigo). e cobre apenas o FreeBSD
Janus Troelsen
7
Esta resposta está errada, quando testado, o loopback tcp no Linux moderno é tão rápido e às vezes mais rápido que o UDS. pode fornecer benchmark se necessário
easytiger
10
Esta resposta está absolutamente correta. A interface de loopback ainda é TCP, o que significa que você ainda tem a sobrecarga do TCP (controle de congestionamento, controle de fluxo, gerenciamento de fluxo (ordenação de pacotes IP, retransmissão, etc)). Os soquetes de domínio Unix não fazem nenhuma das opções acima porque foram projetados desde o início para serem executados localmente, o que significa sem problemas de congestionamento, sem diferenças de velocidade entre servidor / cliente exigindo controle de fluxo, sem pacotes perdidos etc. Pesquise no Google em caso de dúvida , não é uma coisa nova.
JSON
4
E quanto ao UDP local?
CMCDragonkai
2
dado que o primeiro link está inativo (HTTP 404) ... é por isso que a prática recomendada do stackoverflow é fornecer pelo menos uma citação relevante curta / concisa do URL de origem no momento da redação da resposta (então quando o link cair o breve resumo ainda está disponível).
Trevor Boyd Smith
80

Este benchmark: https://github.com/rigtorp/ipc-bench fornece testes de latência e taxa de transferência para soquetes TCP, Unix Domain Sockets (UDS) e PIPEs.

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

A redução de latência de 66% e quase 7 vezes mais taxa de transferência explicam por que a maioria dos softwares de desempenho crítico tem seu próprio protocolo IPC personalizado.

Guillermo Lopez
fonte
7
Parece-me que o produto deles é uma resposta para o problema! Talvez seja por isso que eles estão respondendo a essas perguntas; porque eles sabem uma resposta.
GreenReaper
Essa é uma ótima resposta porque tem alguns números. A taxa de transferência de TCP para UNIX é 350% melhor, UNIX para PIPE 40% em um i5.
ScalaWilliam
13
@GreenReaper A resposta é realmente relevante, mas a linha de nosso produto Torusware Speedus ... vem com 2 versões, Speedus Lite e Speedus Extreme Performance (EP) não é, e faz com que tudo pareça um anúncio barato.
Dmitry Grigoryev
3
Spam. E não, seu produto não é relevante em uma comparação entre soquetes TCP e Unix. Há muitas alternativas de bom senso para os soquetes - cada um fora do que o OP está pedindo
JSON
O uso dessa ferramenta não é suficientemente explicado. Existe alguma página explicando como chamar cliente e servidor?
falkb
40

O benchmark Redis mostra que o soquete de domínio unix pode ser significativamente mais rápido do que o loopback de TCP.

Quando os programas de benchmark de servidor e cliente são executados na mesma caixa, tanto o loopback TCP / IP quanto os soquetes de domínio unix podem ser usados. Dependendo da plataforma, os soquetes de domínio Unix podem atingir cerca de 50% mais throughput do que o loopback TCP / IP (no Linux, por exemplo). O comportamento padrão do redis-benchmark é usar o loopback TCP / IP.

No entanto, essa diferença só importa quando o rendimento é alto.

Taxa de transferência por tamanho de dados

bosques
fonte
8

Os soquetes de domínio Unix costumam ser duas vezes mais rápidos que um soquete TCP quando ambos os pares estão no mesmo host. Os protocolos de domínio Unix não são um conjunto de protocolos real, mas uma maneira de realizar a comunicação cliente / servidor em um único host usando a mesma API usada para clientes e servidores em hosts diferentes. Os protocolos de domínio Unix são uma alternativa aos métodos de comunicação entre processos (IPC).

peterDriscoll
fonte