Todo mundo parece dizer que os pipes nomeados são mais rápidos do que os soquetes IPC. Eles são muito mais rápidos? Eu preferiria usar soquetes porque eles podem fazer comunicação bidirecional e são muito flexíveis, mas optarei pela velocidade em vez da flexibilidade se for em quantidade considerável.
linux
performance
sockets
ipc
named-pipes
user19745
fonte
fonte
pipe(2)
(ermkfifo(3)
,?) pode ser o vencedor, mas você não saberá até tentar.Respostas:
Eu sugeriria que você pegasse o caminho fácil primeiro, isolando cuidadosamente o mecanismo IPC para que você pudesse mudar de soquete para tubo, mas eu definitivamente escolheria primeiro com o soquete. Você deve ter certeza de que o desempenho do IPC é um problema antes de otimizar preventivamente.
E se você tiver problemas por causa da velocidade do IPC, acho que você deve considerar mudar para memória compartilhada em vez de canalizar.
Se você quiser fazer algum teste de velocidade de transferência, deve experimentar o socat , que é um programa muito versátil que permite criar quase qualquer tipo de túnel.
fonte
Melhores resultados que você obterá com a solução de memória compartilhada .
Pipes nomeados são apenas 16% melhores do que soquetes TCP .
Os resultados são obtidos com o benchmarking IPC :
Referência de tubo:
Referência FIFOs (pipes nomeados):
Comparativo de mercado do Message Queue:
Referência de memória compartilhada:
Referência de soquetes TCP:
Comparativo de mercado de soquetes de domínio Unix:
Referência ZeroMQ:
fonte
Eu vou concordar com shodanex, parece que você está prematuramente tentando otimizar algo que ainda não é problemático. A menos que você saiba que os soquetes serão um gargalo, eu apenas os usaria.
Muitas pessoas que juram por pipes nomeados encontram um pouco de economia (dependendo de como tudo o mais está escrito), mas acabam com um código que passa mais tempo bloqueando uma resposta IPC do que fazendo um trabalho útil. Claro, esquemas sem bloqueio ajudam nisso, mas podem ser complicados. Passando anos trazendo códigos antigos para a era moderna, posso dizer que a aceleração é quase nula na maioria dos casos que vi.
Se você realmente acha que os soquetes vão atrasar você, então saia do portão usando a memória compartilhada com atenção cuidadosa em como você usa os bloqueios. Novamente, na realidade, você pode encontrar uma pequena aceleração, mas observe que está desperdiçando uma parte dela esperando bloqueios de exclusão mútua. Não vou defender uma viagem ao inferno do futex (bem, não exatamente mais o inferno em 2015, dependendo da sua experiência).
Libra por libra, os soquetes são (quase) sempre a melhor maneira de obter IPC de espaço do usuário em um kernel monolítico ... e (normalmente) a mais fácil de depurar e manter.
fonte
Lembre-se de que soquetes não significam necessariamente IP (e TCP ou UDP). Você também pode usar soquetes UNIX (PF_UNIX), que oferecem uma melhoria de desempenho perceptível em relação à conexão com 127.0.0.1
fonte
Como frequentemente, os números dizem mais do que sentimento, aqui estão alguns dados: Pipe vs Unix Socket Performance (opendmx.net) .
Este benchmark mostra uma diferença de velocidade cerca de 12 a 15% mais rápida para tubos.
fonte
Se você não precisa de velocidade, os soquetes são o caminho mais fácil!
Se o que você está vendo é a velocidade, a solução mais rápida é a memória compartilhada, não os canais nomeados.
fonte
Para comunicação bidirecional com canais nomeados:
Pipes nomeados são muito fáceis de implementar.
Por exemplo, eu implementei um projeto em C com pipes nomeados, graças à comunicação baseada em entrada-saída de arquivo padrão (fopen, fprintf, fscanf ...) foi tão fácil e limpo (se isso também for uma consideração).
Até os codifiquei com java (estava serializando e enviando objetos sobre eles!)
Pipes nomeados têm uma desvantagem:
fonte
Um problema com os soquetes é que eles não têm uma maneira de liberar o buffer. Existe algo chamado algoritmo de Nagle, que coleta todos os dados e os libera após 40 ms. Portanto, se for a capacidade de resposta e não a largura de banda, talvez seja melhor usar um tubo.
Você pode desabilitar o Nagle com a opção de socket TCP_NODELAY, mas o final da leitura nunca receberá duas mensagens curtas em uma única chamada de leitura.
Então teste, acabei sem nada disso e implementei filas baseadas em mapeamento de memória com pthread mutex e semáforo em memória compartilhada, evitando muitas chamadas de sistema do kernel (mas hoje elas não são mais lentas).
fonte
Pipes e soquetes nomeados não são funcionalmente equivalentes; os soquetes fornecem mais recursos (eles são bidirecionais, para começar).
Não podemos dizer qual terá melhor desempenho, mas suspeito fortemente que não importa.
Os soquetes de domínio Unix farão praticamente o que os soquetes tcp farão, mas apenas na máquina local e com (talvez um pouco) menor sobrecarga.
Se um soquete Unix não for rápido o suficiente e você estiver transferindo muitos dados, considere o uso de memória compartilhada entre o cliente e o servidor (que é MUITO mais complicado de configurar).
Tanto o Unix quanto o NT têm "pipes nomeados", mas são totalmente diferentes no conjunto de recursos.
fonte
Você pode usar uma solução leve como ZeroMQ [ zmq / 0mq ]. É muito fácil de usar e muito mais rápido que os soquetes.
fonte
nanomsg
. De qualquer forma, seja bem-vindo e aproveite este ótimo lugar e torne-se um membro contribuinte ativamente.