Sockets de localhost Linux dolorosamente mais lentos que no Mac

5

Esta questão é baseada neste tópico em OpenOffice .

Estou usando o Python e a ponte do Office UNO para analisar documentos. Para a maior parte eu corro no meu Mac e giro uma instância de escritório para ouvir em localhost:

soffice --accept=socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"

Usando isso, a execução de um documento de teste demora cerca de 2 segundos no meu Mac. No Linux, no entanto, exatamente o mesmo cenário é executado por cerca de 45 segundos, uma diferença de desempenho severa. E isso é no Mint, no Gentoo e no Ubuntu.

Curiosamente, usando o Office e conectando-se a ele por meio de um pipe nomeado:

soffice --accept="pipe,name=abraxas;urp;StarOffice.ServiceManager"

é executado praticamente na mesma velocidade em todas as plataformas testadas: cerca de 1,5 segundos.

Pergunta : o que há de tão diferente entre as conexões de soquete para Mac e Linux, e por que o soquete do Linux é muito mais lento?

    
por Jens 04.01.2015 / 08:43

2 respostas

5

Tente ativar TCP_NODELAY .

Por padrão, o TCP usa o algoritmo de Nagle para coletar pequenos pacotes de saída, a fim de enviar todos de uma só vez como um grande pacote, o que pode ter um efeito prejudicial na latência.

    
por 08.01.2015 / 18:02
2

Estou vendo um comportamento semelhante na minha máquina Ubuntu Desktop (portanto, não é relacionado ao X), e está levando ~ 45 segundos para ser concluído. Aqui estão os maiores ofensores com base em um strace do processo soffice :

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 68.50   23.948922         323     74067      1611 futex
 23.90    8.356000      151927        55           poll
  7.31    2.555215          95     26915           recv
  0.10    0.036301       18151         2           waitpid
  0.06    0.019407           2      9586           send
  0.05    0.016330          30       539        15 read
  0.03    0.009430           1     16675           gettimeofday

Parece-me que pode haver alguns problemas em como eles implementaram sua sincronização de threads no Linux. Eu não tenho acesso a um Mac para comparar, mas esta é a linha de comando que eu executei:

strace -cf soffice --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" --headless
    
por 08.01.2015 / 18:07