vmstat -f mostra grande número de garfos

3

Eu tenho um servidor de produção que está exibindo um número muito grande de forquilhas ao executar vmstat -f . Alguma sugestão sobre as etapas que poderiam ser usadas para ajudar a descobrir qual é a origem dos garfos?

vmstat -f 1
      6650796 forks

EDITAR:

[~]$ ./forks.sh 
Forks in last 2 seconds: 20 
Forks in last 2 seconds: 40 
Forks in last 2 seconds: 58 
Forks in last 2 seconds: 9 
Forks in last 2 seconds: 6 
Forks in last 2 seconds: 28 
Forks in last 2 seconds: 8 
Forks in last 2 seconds: 10 
Forks in last 2 seconds: 15 
Forks in last 2 seconds: 9
    
por Taylor Leese 19.05.2009 / 21:04

5 respostas

5

De acordo com a página man, inclui todas as chamadas para fork, vfork ou clone. O último desses três (clone) é usado pelo Java para implementar seus threads

Assim, cada vez que seu servidor Java criar um novo encadeamento, esse valor será incrementado.

Desde que não seja bobo, tudo bem. Quantos por segundo você vê em média?

    
por 19.05.2009 / 23:33
1

Qualquer processo que gera outro processo sem terminar é um fork - por exemplo, cada comando executado em um shell será contado como um fork. Um número muito alto de chamadas bifurcadas desde que o sistema foi inicializado é totalmente normal.

    
por 19.05.2009 / 21:09
1

A primeira coisa a notar é que executar o vmstat sem seus dois argumentos mostra o valor acumulado desde a última reinicialização. Você teria que executá-lo várias vezes para obter um número de "garfos por segundo" para ver se é realmente um grande número ou não. Algo parecido com isso (que obviamente poderia ser transformado em um roteiro muito mais amigável):

g3 0 /home/jj33 ># while true
> do
>   vmstat -f
>   sleep 15
> done
       278039 forks
       278044 forks
       278047 forks
       278051 forks

Então, esse sistema fez 5, 3 e 4 garfos em intervalos de 3 15 segundos, o que, dado que cada chamada de processo em uma caixa * nix envolve uma bifurcação, não parece ser um grande número.

    
por 19.05.2009 / 21:59
0

Uma alta contagem de garfos realmente não é um problema - eu tenho rodado um roteador baseado no Gentoo há vários meses, e minha contagem de garfos é duas vezes maior que a sua, mas a máquina em si é sólida.

dijkstra ~ # vmstat -f 1
     14623947 forks
dijkstra ~ # uptime
 15:29:26 up 291 days, 14:02,  1 user,  load average: 0.02, 0.04, 0.07
    
por 19.05.2009 / 22:30
0

Se você suspeitar que um determinado processo (como a JVM) é o motivo da alta contagem de fork (2 / s não é alto e não é um problema), você pode usar strace / ltrace para ver o que está fazendo.

Especificamente, bifurcação também deve ser visível na contabilidade do processo (maior impacto) com o comando accton. Mas eu não acho que ele cobre clone () para iniciar threads.

Se você entrar no intervalo de 100 clones / s, então você deve realmente dar uma olhada na aplicação.

BTW: sobre o comentário acima (não posso comentar sobre isso ainda): não Tomcat não bifurca, ele só inicia threads, mas não para cada solicitação, ele usa um pool.

    
por 28.05.2009 / 04:17

Tags