Servidor fixando um núcleo

3

Estou trabalhando em um servidor usando o Vert.x em Java e estou observando alguns problemas de desempenho quando rodando em um servidor dedicado rodando o Ubuntu 12.04.

O servidor seleciona as solicitações HTTP de entrada, faz alguma autenticação usando HMACs, analisa os corpos das solicitações, faz algum processamento de texto e envia dados para um servidor diferente em UDP. Não há E / S de disco e apenas uma quantidade relativamente pequena de uso de memória (nem perto de swap). Eu estou fazendo loadtesting contra o servidor usando instâncias Grinder e AWS, mas mesmo com um servidor bem orientado eu sou incapaz de obter mais de 10 mil pedidos por segundo.

O que estou vendo é que um núcleo na máquina do servidor é absolutamente fixo, principalmente no kernel, e os outros núcleos têm apenas 20-25% de utilização. Minha suposição é que a CPU está sendo gasta em receber conexões TCP de entrada. O JMX reporta a maior parte do meu tempo em io.netty.channel.nio.NioEventLoop.select (), que eu suponho que conta o tempo de espera pelo kernel, e strace mostra muito tempo gasto em futex () e epoll_wait (). Eu tentei brincar com as configurações do kernel para aumentar a taxa de transferência do servidor, mas não tive sorte.

Execução do Profiler:

URLoriginal: link

Uso da CPU:

URLoriginal: link

Eu estou querendo saber o que pode ser ajustado no nível do kernel para ajudar nisso. Eu tentei mexer com tamanhos de buffer TCP, aumentando alças de arquivo, desativando os recursos do TCP, etc., sem sucesso. Se isso ajudar, este sistema operacional do servidor está realmente rodando no Xen, é 'dedicado', pois é o único residente.

    
por Braden Walker 18.09.2013 / 19:31

1 resposta

0

Eu escrutínio seu aplicativo e as bibliotecas que ele está usando. No que diz respeito ao Kernel do Linux, os encadeamentos JVM são implementados como encadeamentos nativos no Linux (processos leves), pelo menos com a implementação Sun / Oracle JVM.

A JVM é um processo único com muitos encadeamentos. Cada thread que ele roda pode ser executado em qualquer um dos núcleos disponíveis. Um único processo no Linux pode ter muitos threads.

Você também pode querer dar uma olhada nestes recursos:

por 19.09.2013 / 03:44