有效地监视httpd子节点并发出使用太多内存/ CPU的信号

时间:2011-08-22 23:58:45

标签: perl apache monitoring mod-perl

我们使用Apache / mod_perl 2并偶尔获得一个旋转失控的子httpd进程,要么消耗不断增加的内存量,要么消耗max cpu。

我想每隔一秒左右监视这些孩子,当找到一个时,发送一个USR2信号,这样它就可以将当前的Perl堆栈转储到我们的错误日志中。

(注意我们正在使用rlimit / BSD :: Resource,但是当一个进程超过其内存rlimit时,它会立即死亡而没有好的方法来记录或采取行动(参见Getting stack trace from Perl "Out of memory" error)。所以AFAICT rlimit将必须得到外部监测计划的补充。)

我看到monit受到高度重视,但我无法想办法监控并向单个httpd进程发送信号。它似乎是为了杀死或重新启动像apache这样的服务。我错过了什么吗?

如果我必须编写一个执行此操作的Perl脚本,是否有任何可以有效监视进程表的内容? Proc::ProcessTable需要0.02秒的cpu来生成一个表,因此每秒运行一次似乎不必要的昂贵。打开“/ usr / bin / top -b -d 1 |”并解析结果是我目前最好的想法。

如果可能的话,显然不会重新发明轮子。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用control groups快速获取与apache相关的进程列表,并将注意力集中在那里。简单地将主apache进程放入控制组,然后生成任何子进程(例如,您可以将启动程序进程添加到控制组),然后读取cgroup虚拟目录中的tasks文件。对于那里的每个PID,通过正常/ proc机制检查其CPU使用情况。