如何找出分叉次数较多的进程?

如何找出分叉次数较多的进程?

最近我的服务器出现了负载过高的问题。我看了top大概半个小时,发现是Nagios fork了很多短命的进程。弹跳Nagios后,一切恢复正常。

我的问题是,如何更快地找出产生大量此类分支的根进程?

谢谢。

答案1

如果您运行支持 的操作系统dtrace,此脚本将帮助您识别哪些进程正在启动短期进程:

#!/usr/sbin/dtrace -qs

proc:::exec
{
  self->parent=stringof((unsigned char*)curpsinfo->pr_psargs);
}

proc:::exec-success
/self->parent != NULL/
{
  printf("%s -> %s\n",self->parent,curpsinfo->pr_psargs);
  self->parent=NULL;
}

如果您使用的操作系统不受支持dtrace,请寻找替代方案,例如systemtap或者sysdig与Linux,ProbeView与 AIX 一起。

这是一个sysdig脚本,将显示所有命令的启动和退出时间以及它们的pidppid

sysdig -p"*%evt.time %proc.pid %proc.ppid %evt.dir %proc.exeline" \
    "( evt.dir=< and evt.type=execve ) or evt.type=procexit"

另一种方法是使用操作系统启用进程记帐(如果可用,通常是acctLinux 下的软件包)并查看生成的日志。还有一个top类似的程序利用流程会计:在顶上

答案2

尝试top -Sd1。这将显示每个进程的累积时间,而不仅仅是它自己的时间。这里的累积表示进程消耗的时间,加上不再存在的子进程消耗的时间。

通常,上升速度较快的进程(可能已经足够高)就是您要寻找的进程。之后,您可以跟踪该过程以验证您的怀疑。

答案3

ps ej |cut -d" " -f1 |sort |uniq -c

事实上,ps ej显示进程的父进程的Pid,所以如果一个进程分叉很多,他的所有子进程都会有相同的Ppid。

cut -d" " -f1是否只保留 ps 输出的第一个字段,然后是sortdata ,最后uniq -c将显示每个 uniq pid 出现的次数。

您还可以有一个仅 awk 版本,通过数组计算出现次数: ps ejx |awk -n '{count[$1]++}END{for(j in count) print "process:" j, "("count[j]")"}'

相关内容