为什么Heroku工作者有100%的dyno负载?

时间:2017-01-17 05:05:02

标签: ruby heroku rufus-scheduler

我在Heroku中有这个工作进程,它可以进行一些清理工作。它每两小时运行一次并收听Heroku终止信号。它工作正常,但我看到100%dyno一直负载。

我的问题是:如何在没有100%dyno加载的情况下在Heroku中运行这种工作进程?循环导致dyno加载,但是使用什么而不是无限循环?

# Scheduler here
cleanup = Rufus::Scheduler.new
cleanup.cron '* */2 * * *' do
  do_some_cleaning
end

# Signal trapping
Signal.trap("TERM") {
  terminate = true
  shut_down
  exit 0
}

# Infinite loop

while terminate == false
end

2 个答案:

答案 0 :(得分:2)

这是因为你在无睡眠周期的情况下进行无限循环。这意味着您基本上告诉CPU您应该立即执行循环条件的每个循环。

这会很快耗尽你的CPU。

相反,尝试将睡眠语句抛入无限循环 - 这会暂停执行并将使用率降低到0%=)

while terminate == false
  sleep 1
end

答案 1 :(得分:1)

我应该早点考虑一下。你实际上可以简单地加入rufus-scheduler的循环:

cleanup_scheduler = Rufus::Scheduler.new
cleanup_scheduler.cron '* */2 * * *' do
  do_some_cleaning
end

Signal.trap('TERM') do
  shut_down
  exit 0
end

cleanup_scheduler.join

加入rufus-scheduler调度线程,伪等价于:

while !terminated
  sleep 0.3
  trigger_schedules_if_any
end