最近我的服务器出现了负载过高的问题。我看了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
脚本,将显示所有命令的启动和退出时间以及它们的pid
和ppid
:
sysdig -p"*%evt.time %proc.pid %proc.ppid %evt.dir %proc.exeline" \
"( evt.dir=< and evt.type=execve ) or evt.type=procexit"
另一种方法是使用操作系统启用进程记帐(如果可用,通常是acct
Linux 下的软件包)并查看生成的日志。还有一个top
类似的程序利用流程会计:在顶上。
答案2
尝试top -Sd1
。这将显示每个进程的累积时间,而不仅仅是它自己的时间。这里的累积表示进程消耗的时间,加上不再存在的子进程消耗的时间。
通常,上升速度较快的进程(可能已经足够高)就是您要寻找的进程。之后,您可以跟踪该过程以验证您的怀疑。
答案3
ps ej |cut -d" " -f1 |sort |uniq -c
事实上,ps ej
显示进程的父进程的Pid,所以如果一个进程分叉很多,他的所有子进程都会有相同的Ppid。
cut -d" " -f1
是否只保留 ps 输出的第一个字段,然后是sort
data ,最后uniq -c
将显示每个 uniq pid 出现的次数。
您还可以有一个仅 awk 版本,通过数组计算出现次数:
ps ejx |awk -n '{count[$1]++}END{for(j in count) print "process:" j, "("count[j]")"}'