Flutuações de largura de banda durante a execução do servidor java

2

Estamos executando um sistema distribuído de servidores java (os: linux) fazendo muita computação com comunicação via TCP. Embora nosso padrão de tráfego não seja não , em algumas máquinas, vemos uma flutuação no uso da largura de banda da rede, conforme descrito abaixo:

    02:56:32 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
    02:56:33 PM        lo     61.00     61.00      8.69      8.69      0.00      0.00      0.00
    02:56:33 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

    02:56:33 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
    02:56:34 PM        lo    107.00    107.00     13.70     13.70      0.00      0.00      0.00
    02:56:34 PM      eth0  15514.00  15794.00   8036.93   7148.15      0.00      0.00      0.00

    02:56:34 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
    02:56:35 PM        lo     59.00     59.00      8.85      8.85      0.00      0.00      0.00
    02:56:35 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    [pattern continues] 

Essencialmente, o uso da largura de banda oscila entre 0-8MB / seg. Nós não fomos capazes de descobrir a causa de tais flutuações.

Todos os ponteiros / sugestões seriam de grande ajuda.

Editar 1: temos TCPNODELAY definido como verdadeiro.

Editar 2: O Java ParNew GC é executado a cada dois segundos nessas máquinas.

Editar 3: Estamos executando apenas um único processo java.

Editar 4: estamos executando com + XX: + DisableExplicitGC

    
por Sumit 29.01.2013 / 00:09

1 resposta

0

Acho que esta é a sua pista:

The Java ParNew GC runs every other second on these machines.

Seu aplicativo Java se comunica pela rede. A cada segundo alternativo, você está pausando o aplicativo Java para executar o Garbage Collection. Você está vendo apenas o tráfego de rede a cada segundo alternado, o que significa que o aplicativo só está sendo executado a cada segundo alternativo.

Parece que seu padrão de tráfego de rede é exatamente o esperado?

A execução da coleta de lixo a cada dois segundos certamente não está ajudando você. Se a JVM estiver executando isso, você precisará de um tamanho de heap maior. Se você estiver solicitando essa coleta com System.gc() ou Runtime.gc() , tente não solicitar isso com muita frequência e veja se o padrão de tráfego segue as pausas do GC.

Entrar em uma solução de problemas da Garbage Collection do seu aplicativo específico está muito além do escopo de uma resposta neste site, mas sugiro que você escolha algumas métricas importantes para seu aplicativo e meça essa métrica enquanto experimenta diferentes tamanhos de heap intervalos de solicitação de GC diferentes e os diferentes GCs na sua JVM. Há muitos artigos disponíveis ao usar garbagecat para analisar o desempenho do GC.

Não se preocupe muito com a frequência de pausas ou com o número de pausas ou duração das pausas. Use o Coletor de lixo e as configurações que resultam nas melhores métricas para o que é importante para seu aplicativo.

Acho que você encontrará muitos engenheiros Java que diriam que não solicitam a coleta de lixo manualmente. Os desenvolvedores da JVM colocaram muito esforço em ajustar os GCs para serem automaticamente inteligentes. Eles sabem mais do que meros mortais como você ou eu jamais iremos. Confie neles.

    
por 20.05.2013 / 14:13