当消耗一定数量的内存时重置正在运行的进程

Tom*_*ica 6 debian raspberry-pi raspbian hydra

我在树莓派上运行Hydra。该程序存在一些问题,但除此之外,程序中存在隐藏的内存泄漏。源码挺大的,实在找不到问题所在。不幸的是,在达到内存限制时,程序不会崩溃——而是返回一堆错误消息。当我说一堆时,我的意思是数百。 在此处输入图片说明

所以我想如果我不能在程序中取消分配内存,我可能需要重置整个过程。所以我需要:

  1. 守护进程资源使用
  2. 优雅地停止进程(类似于Ctrl+ C,然后程序说“收到信号 2 ”)
  3. 重新开始这个过程

我必须这样做,直到修复程序因错误而死亡 - 或者首先不生成它们。


如果您了解 hydra 并且对我在代码中发现的错误感到好奇:

[错误] fork for children 失败:无法分配内存
[错误] socketpair 创建失败:打开的文件太多

错误的第二部分来自perrorC 系统函数。这是最后一个错误。

slm*_*slm 6

#1 -上帝

这是一个使用进程监控框架God的想法。此应用程序是用 Ruby 编写的,但可用于监视其他进程,并防止它们执行某些操作,例如死亡或在您的情况下使用过多 RAM。

红宝石设置

假设您已经安装了 Ruby ——如果没有,您可以使用rvm(又名 Ruby 版本管理器)来执行此操作,但需要以 root 身份安装和/或运行它。这是神的要求。如果可用,您也可以从发行版的存储库中安装 Ruby。

神设置

通过运行的 Ruby 安装,您可以像这样安装 God gem:

$ [sudo] gem install god
Run Code Online (Sandbox Code Playgroud)

例子

然后你可以使用这个简单的 God 配置来做你想做的事。

# /path/to/simple.god
God.watch do |w|
  w.name = "hydra"
  w.start = "<command to run hydra>"
  w.keepalive(:memory_max => 150.megabytes,
              :cpu_max => 50.percent)
end
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

$ god -c /path/to/simple.god -D
Run Code Online (Sandbox Code Playgroud)

现在,如果 Hydra 超过 CPU 利用率或使用的内存,上帝会重新启动它。注意: 默认情况下,这些属性将每 30 秒检查一次,如果任何五次检查中的三次出现超额,则会采取行动。

走得更远

看看上帝网站上的文档。上面的例子来自那里,他们在涵盖细节方面做得更彻底。

#2 -过程资源监视器

另一种选择是Process Resource Monitor。功能列表显示它可以监控每个进程的资源。

  • 基于每进程/每用户规则的资源限制

描述摘录

进程资源监视器 (PRM) 是 Linux 和 BSD 的 CPU、内存、进程和运行(已用)时间资源监视器。PRM 的灵活性是通过全局范围的资源限制或基于规则的每进程/每用户限制来实现的。通过许多忽略选项、配置软/硬终止触发器的能力、等待/重新检查时间以及向父/子进程树发送终止信号的能力,可以保持对 PRM 的大量控制。此外,默认情况下状态输出非常详细,支持通过 syslog 发送日志数据。

例子

为了监控 Hydra,我们可以创建一个这样的规则文件/usr/local/prm/rules//hydra.cmd

IGNORE=""
MAX_CPU="50"
MAX_MEM="150"
MAX_PROC="0"
# we dont care about the process run time, set value 0 to disable check
MAX_ETIME="0"
KILL_TRIG="3"
# we want to set a bit longer soft rechecks as sometimes the problem fixes
# itself
KILL_WAIT="20"
KILL_PARENT="1"
KILL_SIG="9"
KILL_RESTART_CMD="/etc/init.d/hydra restart"
Run Code Online (Sandbox Code Playgroud)

prm通过 cron 运行,/etc/cron.d/prm间隔为 5 分钟。根据文档,这可能应该单独留下。