1

我设置了监控来密切关注正在运行的延迟作业进程,以确保它们不会占用太多内存。最初设置为在进程超过 700MB 时重新启动,因此 monitrc 文件的相关部分如下所示。

check process delayed_job_worker
  with pidfile /path/to/pidfile.pid
  start program = "/usr/bin/dj start" with timeout 60 seconds
  stop program = "/usr/bin/dj stop" with timeout 60 seconds
  if totalmem is greater than 700 MB then restart

这按预期工作,但延迟的工作没有被删除,所以在重新启动工作人员后,另一个工作人员会来接工作,延迟工作会处理这个问题,但工作会用完资源工作几次,所以我想删除延迟的在这种情况下工作。我的解决方案看起来像这样。

check process delayed_job_worker
  with pidfile /path/to/pidfile.pid
  start program = "/usr/bin/dj start" with timeout 60 seconds
  stop program = "/usr/bin/dj stop" with timeout 60 seconds
  if totalmem is greater than 700 MB then
exec "/path/to/script/kill_and_remove_dj /path/to/pidfile.pid"

所以现在脚本被执行了,这个脚本从 pidfile 中获取 pid,杀死它并通过 rails runner 运行一个 ruby​​ 脚本,从 pid 中找到 delay_job 并将其从数据库中删除。这一切似乎都按预期工作,但是当我ps aux | grep kill_and_remove_dj在创建一个我知道会达到内存限制的作业后注意到的是,该命令正在一遍又一遍地执行。

我的理解是,在这种情况下,totalmem 将是来自 pid 和所有子进程的进程的内存。当 exec 运行脚本时,它将处于一个完全独立的进程中。只是从任何对可能导致此问题的原因有所了解的人那里寻找任何指示或信息。如果需要,很高兴提供更多信息。

4

0 回答 0