Pergunta

Alguém tem uma idéia de quantas conexões TCP soquetes são possíveis em um servidor raiz padrão moderno? (Há no trânsito menos geral em cada conexão, mas todas as ligações têm que ser o tempo todo.)

EDIT:. Vamos usar um servidor Linux

Foi útil?

Solução

O Google ao redor para o problema "C10K". Esta é basicamente a discussão e tecnologia em torno de gestão 10.000 ou mais simultâneas conexões.

Eu suspeito que este número foi escolhido porque é difícil, mas teoricamente possível.

Outras dicas

Eu alcançado 1600K conexões de soquete ocioso simultâneos, e ao mesmo tempo 57k req / s em um desktop Linux (16G RAM, I7 2600 CPU). É um único servidor rosca http escrito em C com epoll. O código fonte está em github , a blogue aqui .

Editar:

Eu fiz 600k conexões HTTP simultâneas (cliente e servidor), tanto no mesmo computador, com JAVA / Clojure. informação do detalhe pós , discussão HN: http://news.ycombinator.com/item?id=5127251

O custo de uma ligação (com epoll):

  • necessidade de aplicação alguns RAM por conexão
  • tampão TCP 2 * 4k ~ 10k, ou mais
  • necessidade epoll alguma memória para um descritor de arquivo, de epoll (7)

Cada descritor de arquivo registrada custa cerca de 90 bytes sobre um núcleo de 32 bits, e cerca de 160 bytes em um kernel de 64 bits.

Isso depende não apenas no sistema operacional em questão, mas também da configuração, potencialmente em tempo real configuração.

Para Linux:

cat /proc/sys/fs/file-max

irá mostrar o número máximo atual de descritores de arquivo total permitido ser abertas simultaneamente. Confira http://www.cs.uwaterloo.ca/~brecht/servers /openfiles.html

10.000? 70.000? é que todos:)

FreeBSD é provavelmente o servidor que deseja, aqui está uma href="http://rerepi.wordpress.com/2008/04/19/tuning-freebsd-sysoev-rit/" rel="noreferrer"> pouco sobre o ajuste para lidar com 100.000 conexões, sua teve algumas características interessantes como soquetes de cópia zero por algum tempo agora, juntamente com kqueue para atuar como um mecanismo de porta de conclusão.

Solaris pode lidar com 100.000 conexões volta no século passado !. Eles dizem linux seria melhor

A melhor descrição que eu vim transversalmente é esta apresentação / papel em escrever um servidor web escalável. Ele não tem medo de dizer como ela é:)

Mesmo para software: os cretinos no camada de aplicação forçada grande inovações na camada OS. Porque Lotus Notes mantém conexão um TCP per aberto cliente, a IBM contribuiu grande otimizações para o “um processo, 100.000 conexões abertas”caso para Linux

E a O (1) programador era originalmente criado para marcar bem em algum irrelevantes referência Java. O fundo linha é que este bene fi inchaço ts todos -nos.

No Linux você deve estar olhando para usar epoll para async I / O. Ele também pode valer a pena fine-tuning soquete-buffers para não perder muito espaço do kernel por conexão.

Eu acho que você deve ser capaz de atingir 100 mil ligações em uma máquina razoável.

Um limite para o número de soquetes abertos é configurável no sistema de arquivos / proc

cat /proc/sys/fs/file-max

Max para recebida ligações no sistema operacional definido pelos limites de inteiros.

O Linux permite bilhões de soquetes abertos.

Para utilizar as tomadas você precisa de uma escuta aplicação, por exemplo, um servidor web, e que vai usar uma certa quantidade de RAM por soquete.

RAM e CPU irá introduzir os limites reais. (Moderna 2017, acho milhões não bilhões)

1 milhões é possível, não é fácil. Esperar para usar X Gigabytes de RAM para gerenciar 1 milhão de sockets.

saída conexões TCP são limitados por números de porta ~ 65000 por IP. Você pode ter vários endereços IP, mas não endereços IP ilimitados. Este é um limite em TCP não Linux.

depende da aplicação. se houver apenas alguns pacotes de cada cliente, 100K é muito fácil para linux. Um engenheiro da minha equipe tinha feito um ano de teste atrás, os shows de resultado:., Quando não há nenhum pacote do cliente após a conexão estabelecida, linux epoll pode assistir 400k fd para readablity a nível de uso da CPU abaixo de 50%

Qual sistema operacional?

Para máquinas com Windows, se você estiver escrevendo um servidor para dimensionar bem, e, portanto, usando I portas E / S conclusão e async I / O, em seguida, a principal limitação é a quantidade de pool não paginado que você está usando para cada ligação activa. Isso se traduz diretamente em um limite com base na quantidade de memória que sua máquina tem instalado (não-paginável é um finito, quantidade tamanho fixo que é baseada no total de memória instalado).

Para as ligações que não vê muito tráfego você pode reduzir torná-los mais eficientes ao destacamento 'byte zero lê' que não usam não paginado e não afetam o limite de páginas bloqueado (outro recurso potencialmente limitado que pode impedir que você ter um monte de conexões de soquete aberto).

Além de que, bem, você terá de perfil, mas eu consegui obter mais de 70.000 conexões simultâneas em um (memória 760MB) modestamente especificado servidor; veja aqui http://www.lenholgate.com/ blogue / 2005/11 / windows-tcpip-server-performance.html para mais detalhes.

Obviamente, se você estiver usando uma arquitetura menos eficiente, como 'thread por conexão' ou 'escolha', então você deve esperar para conseguir figuras menos impressionantes; mas, IMHO, não há simplesmente nenhuma razão para selecionar essas arquiteturas para Windows Socket servidores.

Editar: veja aqui http://blogs.technet.com/ markrussinovich / Arquivo / 2009/03/26 / 3211216.aspx ; a maneira que a quantidade de pool não paginado é calculado mudou no Vista e Server 2008 e há agora muito mais disponíveis.

Realisticamente para uma aplicação, mais de 4000-5000 sockets abertos em uma única máquina torna-se impraticável. Apenas a verificação de atividade em todas as tomadas e gerenciá-los começa a se tornar um problema de desempenho -. Especialmente em ambientes em tempo real

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top