gpt4 book ai didi

perl - 有效地监控 httpd child 并向那些使用过多内存/cpu 的 child 发出信号

转载 作者:行者123 更新时间:2023-12-02 02:23:12 26 4
gpt4 key购买 nike

我们使用 Apache/mod_perl 2,偶尔会有一个子 httpd 进程失控,消耗不断增加的内存量或最大 cpu。

我想每隔一秒左右监视一次这样的 child ,当找到一个时,向它发送一个 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 |”解析结果是我目前最好的主意。

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

谢谢!

最佳答案

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

关于perl - 有效地监控 httpd child 并向那些使用过多内存/cpu 的 child 发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7154938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com