vmstat -f显示大量的叉子

我有一台生产服务器,在运行vmstat -f时显示了大量的分支。 任何可以用来帮助找出叉子的起源的步骤build议?

 vmstat -f 1 6650796 forks 

编辑:

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

根据手册页,它包括所有对fork,vfork或clone的调用。 这三个(克隆)中的最后一个被Java用来实现它的线程

所以每当你的Java服务器创build一个新的线程时,该值就会增加。

提供它不会愚蠢,应该没问题。 你平均每秒看到多less个?

任何产生另一个进程而没有自己终止的进程都是一个fork,例如,在shell中执行的每个命令都将被视为一个fork。 自从系统启动以来,叉路数量非常多,完全正常。

首先要注意的是,用两个时间参数运行vmstat会显示上次重新启动以来的累计值。 你必须多次运行它才能得到“每秒分叉数”的数字,看看它是否真的是一个大数字。 像这样的东西(这显然可以成为一个更友好的脚本):

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

因此,该系统以3 15秒的间隔完成了5次,3次和4次分叉,因为在* nix盒上的每个进程调用都包含一个分叉,所以看起来不是一个大数字。

高叉数真的不是问题 – 我已经运行了一个基于Gentoo的路由器好几个月了,我的叉路数已经超过了两倍,但是机器本身是坚如磐石的。

 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 

如果你怀疑一个特定的进程(如JVM)是​​高分叉数的原因(2 / s不高并且没有问题),你可以使用strace / ltrace来查看它在做什么。

特别是fork还应该在进程记帐中可见(影响较大),使用accton命令。 但我不认为它涵盖了克隆()开始线程。

如果你进入100克隆/秒的范围,那么你应该真的看看应用程序。

顺便说一句:关于上面的评论(暂不评论):没有Tomcat不分叉,它只启动线程,但不是为每个请求,它使用一个池。