O Mac OS X controla a taxa de criação de soquetes?

7

Isto pode parecer relacionado com programação, mas esta é uma questão do SO.

Estou escrevendo um pequeno daemon de alto desempenho que leva milhares de conexões por segundo. Está funcionando bem no Linux (especificamente no Ubuntu 9.10 no EC2). No Mac OS X, se eu jogar alguns milhares de conexões (cerca de 16.350) em um benchmark que simplesmente abre uma conexão, fecha a conexão, o programa de benchmark fica pendurado por vários segundos, esperando que um soquete fique disponível antes de continuar (ou tempo limite no processo).

Eu usei tanto o Apache Bench quanto o Siege (para garantir que não fosse o aplicativo de referência).

Então, por que / como o Mac OS X está limitando a TAXA na qual os soquetes podem ser usados, e posso impedi-lo de fazer isso?

Ou há algo mais acontecendo?

Eu sei que há um limite de descritor de arquivo, mas não estou atingindo isso. Não há erro em aceitar um socket, ele simplesmente pára por um tempo após o primeiro (aproximadamente) 16000, esperando - eu suponho - que o SO libere um soquete. Isso não deve acontecer desde que todos os anteriores estejam fechados nesse ponto. Eles devem vir disponíveis na taxa que eles estão fechados, e fazer no Ubuntu, mas parece haver algum tipo de atraso multi (5-10?) Segundo no Mac OS X.

Eu tentei mexer com o ulimit de todas as maneiras. Nada.

    
por pbhogan 27.05.2010 / 17:33

2 respostas

10

Por isso, o intervalo de portas efêmeras do Mac OS X é bastante baixo.

A Wikipedia me informa que a IANA sugere 49152 a 65535 como "portas dinâmicas e / ou privadas", enquanto muitos kernels Linux usam 32768 a 61000. O OS X usa o intervalo da IANA. Isso significa que o Linux tem quase o dobro das portas efêmeras disponíveis. Como cada soquete fechado passa por um estado TIME_WAIT (que eu não sabia), a taxa está sobrecarregando meu sistema.

Como consertar?

sudo sysctl -w net.inet.ip.portrange.first=32768
sudo sysctl -w net.inet.ip.portrange.hifirst=32768

Isso dará o dobro do intervalo.

(Obrigado ao Spiff que respondeu com mais detalhes aqui: link )

    
por 27.05.2010 / 18:50
0

Poderia ser um limite de buffer? link

Este site e alguns outros sugerem que os sistemas BSD Unix possuem soquetes ligados a descritores de arquivos, assim pode ser que a limitação do arquivo possa estar vinculada às suas limitações de soquete aberto.

    
por 27.05.2010 / 17:52