rufus scheduler 可以处理多少个调度?
How many schedules can be handled by rufus scheduler?
我正在构建一个类似 IFTTT 的平台。
简而言之,rufus scheduler 很棒。我知道它使用线程池(默认28个线程?=> 3.x.x)
我的平台预计可以处理 1000 多个调度,可能更多。
在 Jruby 上,作为单例。这种期望是否存在性能问题?我应该增加最大线程池大小吗?那我应该增加多少个线程?有这个问题的指南吗?
Rufus-scheduler 按照 "next to trigger first" 的顺序对它的调度进行排队。所以你的列表可能会变长,但 rufus 不会每次都遍历整个列表(每次意味着大约每 0.3 秒(默认频率)),它会在下一个元素为 "in the future" 时立即停止迭代。所以长列表应该没问题。
阅读这个问题,我的印象是您更关心同时触发的大量计划 and/or 重叠。 IIRC,JRuby 使用 Java 线程,据说这些线程对多核友好,所以好的硬件可以提供帮助。
你为什么不建立一个原型?你用时间表轰炸它并观察、学习、调整(如果不够好,可能会丢弃 rufus-scheduler)。建立你的基准,然后你的问题就会得到答案。
我完成了基准测试,代码如下。我的系统中有一个作业队列,所以 rufus-scheduler 的处理程序将只执行非常短和轻的任务。例如排队作业。在代码中,只记录 job.last_time 和 time 之间的间隔。
我假设间隔越大,性能越低。喜欢 "delayed"
require 'rufus-scheduler'
require 'awesome_print'
require 'logger'
SCHEDULE_COUNT = 1000
MAX_THREAD = 224
schedule_samples = { type: "cron", schedule: "* * * * *"}
$logger = Logger.new("benchmark.log")
scheduler = Rufus::Scheduler.singleton(:max_work_threads => MAX_THREAD)
class Handler
def self.call(job, time)
$logger.info job.last_time - time
end
end
SCHEDULE_COUNT.times do
scheduler.send( schedule_samples[:type].to_sym, schedule_samples[:schedule], Handler)
end
sleep 600
结果有点失望..线程越多越好。但我得到了我未来系统的大致延迟,这是可以接受的。
我 运行 我的笔记本电脑上有这个代码,1 核 1GB RHEL 64 位 Vmware 和 4 核 4GB RHEL 64 位 Vmware。
Jruby 版本
- labtop jruby 1.7.16.1 (1.9.3p392)
- Linuxjruby 1.7.19 (1.9.3p551)
这些不完全一样,但应该没问题..?
link 图表是所有时间间隔的平均值。
Benchmark Result
我可以不断增加最大线程以找出性能峰值。但我决定不做。我会在生产环境中使用更好的机器。 1000 ~ 2000ms 的延迟应该不是问题。 (在基准测试中,1 核时最大延迟为 700 毫秒)
同样,Rufus-Scheduler 很棒!!
我正在构建一个类似 IFTTT 的平台。
简而言之,rufus scheduler 很棒。我知道它使用线程池(默认28个线程?=> 3.x.x)
我的平台预计可以处理 1000 多个调度,可能更多。
在 Jruby 上,作为单例。这种期望是否存在性能问题?我应该增加最大线程池大小吗?那我应该增加多少个线程?有这个问题的指南吗?
Rufus-scheduler 按照 "next to trigger first" 的顺序对它的调度进行排队。所以你的列表可能会变长,但 rufus 不会每次都遍历整个列表(每次意味着大约每 0.3 秒(默认频率)),它会在下一个元素为 "in the future" 时立即停止迭代。所以长列表应该没问题。
阅读这个问题,我的印象是您更关心同时触发的大量计划 and/or 重叠。 IIRC,JRuby 使用 Java 线程,据说这些线程对多核友好,所以好的硬件可以提供帮助。
你为什么不建立一个原型?你用时间表轰炸它并观察、学习、调整(如果不够好,可能会丢弃 rufus-scheduler)。建立你的基准,然后你的问题就会得到答案。
我完成了基准测试,代码如下。我的系统中有一个作业队列,所以 rufus-scheduler 的处理程序将只执行非常短和轻的任务。例如排队作业。在代码中,只记录 job.last_time 和 time 之间的间隔。 我假设间隔越大,性能越低。喜欢 "delayed"
require 'rufus-scheduler'
require 'awesome_print'
require 'logger'
SCHEDULE_COUNT = 1000
MAX_THREAD = 224
schedule_samples = { type: "cron", schedule: "* * * * *"}
$logger = Logger.new("benchmark.log")
scheduler = Rufus::Scheduler.singleton(:max_work_threads => MAX_THREAD)
class Handler
def self.call(job, time)
$logger.info job.last_time - time
end
end
SCHEDULE_COUNT.times do
scheduler.send( schedule_samples[:type].to_sym, schedule_samples[:schedule], Handler)
end
sleep 600
结果有点失望..线程越多越好。但我得到了我未来系统的大致延迟,这是可以接受的。
我 运行 我的笔记本电脑上有这个代码,1 核 1GB RHEL 64 位 Vmware 和 4 核 4GB RHEL 64 位 Vmware。
Jruby 版本
- labtop jruby 1.7.16.1 (1.9.3p392)
- Linuxjruby 1.7.19 (1.9.3p551)
这些不完全一样,但应该没问题..? link 图表是所有时间间隔的平均值。 Benchmark Result
我可以不断增加最大线程以找出性能峰值。但我决定不做。我会在生产环境中使用更好的机器。 1000 ~ 2000ms 的延迟应该不是问题。 (在基准测试中,1 核时最大延迟为 700 毫秒)