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:35

1 resposta

16

O Mac OS X inicia a abertura de portas efêmeras em 49152. Números de porta são inteiros não assinados de 16 bits, portanto, há 65535 portas possíveis. 65535 - 49152 = 16383. Acho que você tem 16K portas em TIME_WAIT.

Update : Você pode querer olhar para as seguintes variáveis sysctl (8):

net.inet.ip.portrange.lowfirst: 1023  
net.inet.ip.portrange.lowlast: 600  
net.inet.ip.portrange.first: 49152  
net.inet.ip.portrange.last: 65535  
net.inet.ip.portrange.hifirst: 49152  
net.inet.ip.portrange.hilast: 65535  

Acho que se você definir o hifirst para algo menor, aumentará o número de portas efêmeras disponíveis em seu sistema.

Pode haver uma opção de soquete ou algo para dizer à pilha que basicamente viole a especificação TCP e use um valor não padrão para TIME_WAIT, mas eu não sou o suficiente de um programador de soquetes do Mac OS X para saber disso.

Update 2 : Você provavelmente desejará usar o setsockopt (2) para definir o SO_REUSEADDR.

    
por 27.05.2010 / 17:47