4 votes

vmstat -f montre un grand nombre de forks

J'ai un serveur de production qui affiche un très grand nombre de fourches lors de l'exécution de la commande vmstat -f . Avez-vous des suggestions sur les étapes qui pourraient être utilisées pour aider à trouver l'origine des fourches ?

vmstat -f 1
      6650796 forks

EDIT :

[~]$ ./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

5voto

MarkR Points 2878

Selon la page de manuel, il inclut tous les appels à fork, vfork ou clone. Le dernier de ces trois éléments (clone) est utilisé par Java pour implémenter ses threads.

Ainsi, chaque fois que votre serveur Java crée un nouveau thread, cette valeur s'incrémente.

Si ça ne devient pas idiot, ça devrait aller. Combien en voyez-vous par seconde en moyenne ?

1voto

Luke Points 628

Tout processus qui engendre un autre processus sans se terminer lui-même est un fork - par exemple, toute commande exécutée à un Shell sera comptée comme un fork. Un nombre très élevé d'appels de fork depuis le démarrage du système est tout à fait normal.

1voto

Curt Hagenlocher Points 12432

La première chose à noter est que l'exécution de vmstat sans ses deux arguments de temps montre la valeur accumulée depuis le dernier redémarrage. Vous devriez l'exécuter plusieurs fois pour obtenir un nombre de "fourchettes par seconde" pour voir si c'est vraiment un grand nombre ou non. Quelque chose comme ceci (qui pourrait évidemment être transformé en un script beaucoup plus convivial) :

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

Donc, ce système a fait 5, 3, et 4 forks en 3 intervalles de 15 secondes, ce qui, étant donné que chaque appel de processus sur une boîte *nix implique un fork, ne semble pas être un grand nombre.

0voto

Dana the Sane Points 7976

Un nombre élevé de forks n'est pas vraiment un problème - j'utilise un routeur basé sur Gentoo depuis plusieurs mois maintenant, et mon nombre de forks est plus de deux fois supérieur au vôtre, mais la machine elle-même est solide comme un roc.

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

0voto

Simon Steele Points 8344

Si vous soupçonnez un certain processus (comme la JVM) d'être la raison du nombre élevé de forks (2/s n'est pas élevé et n'est pas un problème), vous pouvez utiliser strace/ltrace pour voir ce qu'il fait.

La fourchette spécifique devrait également être visible dans la comptabilité des processus (impact plus élevé) avec la commande accton. Mais je ne pense pas que cela couvre clone() pour le démarrage des threads.

Si vous atteignez les 100 clones/s, vous devriez vraiment examiner l'application.

BTW : concernant le commentaire ci-dessus (je ne peux pas encore le commenter) : non Tomcat ne bifurque pas, il démarre seulement des threads, mais pas pour chaque requête, il utilise un pool.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X