我有一个生产服务器,它在运行时显示了大量的分叉vmstat -f
。关于可用于帮助找出叉子起源的步骤的任何建议?
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 服务器创建一个新线程时,该值都会增加。
如果它不会变得愚蠢,它应该没问题。你平均每秒看到多少个?
任何产生另一个进程但自身没有终止的进程都是一个分叉——例如,在 shell 中执行的每个命令都将被算作一个分叉。自系统启动以来,非常多的 fork 调用是完全正常的。
首先要注意的是,在没有两个时间参数的情况下运行 vmstat 会显示自上次重新启动以来的累积值。您必须多次运行它才能获得“每秒分叉”数字,以查看它是否真的是一个大数字。像这样的东西(显然可以制作成更友好的脚本):
因此,该系统在 3 个 15 秒的间隔内进行了 5、3 和 4 次分叉,考虑到 *nix 机器上的每个进程调用都涉及一个分叉,这似乎不是一个大数字。
高叉数真的不是问题——我已经运行基于 Gentoo 的路由器几个月了,我的叉数是你的两倍多,但机器本身是坚如磐石的。
如果您怀疑某个进程(如 JVM)是导致分叉计数高的原因(2/s 并不高而且不是问题),您可以使用 strace/ltrace 来查看它在做什么。
特别是 fork 也应该在使用 accton 命令的进程记帐(更高的影响)中可见。但我认为它不包括用于启动线程的 clone() 。
如果你进入 100 克隆/秒的范围,那么你真的应该看看这个应用程序。
顺便说一句:关于上面的评论(还不能评论):没有Tomcat不分叉,它只启动线程,但不是针对每个请求,它使用一个池。