Soquete Unix x host TCP / IP: porta

42

Alguém poderia me descrever os prós e os contras do uso de um arquivo de soquete Unix vs um localhost: port tcp / ip ao configurar serviços em um servidor (Ubuntu, FWIW)?

Neste exemplo em particular, é para um servidor Python WSGI (uWSGI), mas estou interessado apenas em geral (por exemplo, eu sei que você pode configurar o MySQL nos dois sentidos).

Sei que o uso do tcp / ip significa que os serviços podem ser expostos a outras máquinas, mas estou interessado apenas em saber se há alguma troca de desempenho ao acessar serviços localmente.

Felicidades.

Ludo
fonte
1
Respostas brilhantes e realmente úteis - obrigado! :)
Ludo

Respostas:

40

Os soquetes Unix são um pouco mais rápidos, pois você não possui o tcp-overhead. Se você perceber que essa perda de desempenho é uma questão de carga do servidor. Se você não tiver uma carga de servidor muito alta, não a reconhecerá.

Se você usa o Jails (FreeBSD) ou alguma outra tecnologia de virtualização para separar, por exemplo, o MySQL-Server do servidor da Web, costuma usar a configuração tcp / ip em vez de soquetes. As regras de firewall precisam restringir o acesso.

Você precisa descobrir se o seu sistema está sob carga pesada, de modo que um soquete é obrigatório ou se você pode se concentrar em um bom design de sistema (serviços de separação), então uma solução tcp / ip seria melhor.

Portanto, faça uma resposta longa curta:

Sim, há uma diferença de desempenho, os soquetes são mais rápidos. Se você não está sofrendo muita carga no servidor, basta escolher o que melhor se adapta ao design do seu sistema.

Benedikt Niessen
fonte
3
Re: soquetes são mais rápidos ... não são os dois soquetes?
Bart Silverstrim
4
@ Silverstrim Bart: não, soquetes são soquetes; O TCP tem uma API semelhante a um soquete
Javier
7
Eu acredito que eles são chamados de "soquetes Unix" e "soquetes da Internet". ( socket(AF_INET, SOCK_STREAM, ...))
grawity
1
Acabei de testar algumas consultas mysql com php-mysql (unix vs tcp-socket, ambos localhost). por exemplo "selecione SQL_NO_CACHE 1" para eliminar fatores não relacionados ao transporte. não houve diferença mensurável. Ambos tiveram uma média de 0,25 ms, o melhor momento para ambos foi de 0,19 ms.
Jens
11

É basicamente uma troca entre desempenho e flexibilidade. Os soquetes de domínio Unix oferecem um desempenho um pouco melhor, enquanto um soquete conectado ao host local oferece uma portabilidade um pouco melhor. Você pode mover o aplicativo do servidor com facilidade para outro sistema operacional alterando apenas o endereço IP de localhost para um nome de host diferente.

Um soquete de domínio Unix usa o sistema de arquivos local para criar um mecanismo IPC entre os processos do servidor e do cliente. Você verá um arquivo em / var em algum lugar quando o soquete do domínio Unix estiver conectado.

Se você procura puramente a melhor solução de desempenho, pode explorar um IPC de memória compartilhada. Mas isso é um pouco mais complexo.

IAPaddler
fonte
3

Prós de soquetes de domínio Unix.

  1. O acesso pode ser gerenciado através do sistema de permissão do usuário Unix, definindo as permissões no próprio soquete ou pelo servidor lendo o nome de usuário do cliente conectado.
  2. Menos chance de expor inadvertidamente o soquete ao mundo exterior. Por exemplo, se o servidor também executar um proxy da Web, isso poderá inadvertidamente permitir conexões para soquetes no host local.

Contras de soquetes de domínio Unix

  1. Não é portátil para sistemas não-unix.
  2. Pode ser estranho com chroots, prisões ou similares
Peter Green
fonte