Eu tenho uma caixa de 8 núcleos relativamente nova executando o CentOS. Eu gostaria de desenvolver um servidor de estatísticas que use TCP. É muito simples, aceita uma conexão TCP, incrementa um contador e fecha a conexão. O problema é que ele precisa fazer isso em pelo menos 10 mil solicitações por segundo. Suspeito que CPU / Memória não seja um problema, mas estou mais preocupado com limites artificiais (como conexões semi-abertas) que talvez precise configurar no meu servidor para permitir esse tipo de volume. Então, isso é possível? Quais configurações devo estar ciente? Minha NIC não será capaz de lidar com isso?
18
Respostas:
Isso é conhecido como o problema c10k . Essa página tem muitas informações boas sobre os problemas que você encontrará.
fonte
você deve ser capaz de fazê-lo [embora isso seja provavelmente uma má ideia].
no appserv resina eu posso obter ~ 5k req / seg no quad core 2.6ghz xeon. Os pedidos chamam um servlet simples que lê 1 linha do mysql e envia uma resposta xml muito pequena.
teste foi realizado com
Resultado dos testes:
mas acho que você ficará muito melhor usando o programa c simples, sem gerar novos threads para cada solicitação. O link de Greg Hewgill deve lhe dar uma boa idéia.
mesmo durante o teste prolongado, não tenho problemas com a conectividade [mencionados soquetes entreabertos]; O teste é executado entre duas caixas Linux conectadas à Ethernet Gigabit [embora, como você vê, a largura de banda não seja um gargalo].
fonte
Você pode estar interessado em um limite do kernel do Linux que atingi ao testar o Apache. No meu caso, o kernel produziu algumas mensagens de erro úteis, então meu conselho é escrever seu programa e, se você parece estar atingindo um limite, preste atenção nos logs do kernel.
fonte
Eu usaria o UDP em vez do TCP, se possível. Deve ser mais leve e, portanto, escalar melhor.
fonte
Seu nic deve ser capaz de lidar com isso, mas eu questiono o design de ter 10k novas conexões TCP por segundo; se você estiver criando / destruindo conexões com tanta rapidez, a) mantenha-as abertas por mais tempo ou b) use o UDP.
No caso de você ter 1 milhão de clientes que precisam fazer uma consulta periodicamente, mas onde a carga atinge 10k por segundo, o UDP provavelmente é uma escolha melhor.
No caso de você ter apenas 10 mil clientes que precisam fazer uma consulta a cada segundo, eles podem manter abertas as conexões existentes e reutilizá-las. Isso seria muito mais gentil com o sistema operacional e também produziria muito menos latência, pois não exigiria um novo aperto de mão a cada vez.
No caso de você ter 10 mil solicitações por segundo, imagino que você tenha um balanceador de carga de front-end de qualquer maneira, portanto, será necessário testá-lo também.
(Nota: acho que isso pertencia ao Stack Overflow)
fonte