
Estou trabalhando em um servidor usando Vert.x em Java e estou percebendo alguns problemas de desempenho ao executar em um servidor dedicado rodando Ubuntu 12.04.
O servidor coleta as solicitações HTTP recebidas, faz alguma autenticação usando HMACs, analisa os corpos das solicitações, faz algum processamento de texto e envia dados para um servidor diferente por UDP. Não há E/S de disco e apenas uma quantidade relativamente pequena de uso de memória (nem perto da troca). Estou fazendo testes de carga no servidor usando instâncias do Grinder e da AWS, mas mesmo com um servidor bem equipado, não consigo obter mais de 10 mil solicitações por segundo.
O que estou vendo é que um núcleo na máquina servidor está absolutamente fixado, principalmente no kernel, e os outros núcleos estão com apenas cerca de 20-25% de utilização. Minha suposição é que a CPU está sendo gasta no recebimento de conexões TCP de entrada. JMX relata a maior parte do meu tempo em io.netty.channel.nio.NioEventLoop.select(), que presumo que conta o tempo de espera pelo kernel, e strace mostra muito tempo gasto em futex() e epoll_wait(). Tentei brincar com as configurações do kernel para aumentar o rendimento do servidor, mas não tive sorte.
Execução do criador de perfil:
URL original:https://i.stack.imgur.com/6wIZA.png
Utilização do CPU:
URL original:https://i.stack.imgur.com/9mM5u.png
Estou me perguntando o que pode ser ajustado no nível do kernel para ajudar com isso. Tentei mexer nos tamanhos dos buffers TCP, aumentar os identificadores de arquivos, desativar recursos TCP, etc., sem sucesso. Este sistema operacional de servidor está realmente rodando no Xen, é 'dedicado' por ser o único residente.
Responder1
Eu examinaria seu aplicativo e as bibliotecas que ele está usando. No que diz respeito ao Kernel do Linux, os threads JVM são implementados como threads nativos no Linux (processos leves), pelo menos com a implementação Sun/Oracle JVM.
A JVM é um processo único com muitos threads. Cada thread que ele gira pode ser executado em qualquer um dos núcleos disponíveis. Um único processo no Linux pode ter muitos threads.
Além disso, você pode querer dar uma olhada nestes recursos: