我现在达到了一个目的,在那里需要很长时间才能完成队列,因为新的作业被添加到该队列中。 解决这个问题的最佳方案是什么。
我已经使用了50个处理器,但我注意到如果我打开更多处理器,则完成作业需要更长时间。
我的设置: nginx的, 独角兽, ruby-on-rails 4, PostgreSQL的
谢谢
答案 0 :(得分:1)
您需要衡量受资源约束的位置。
如果您在添加更多工作人员时看到事情变慢,则您可能会被数据库服务器阻止。您是否升级了Redis服务器以处理此负载量?你在哪里存储刮下的数据?该系统能否处理增加的写入负载?
如果您在CPU或I / O上被阻止,您应该会在添加更多工作人员时看到系统中的工作量线性增加。由于您在扩展时看到事情变慢,因此您应该衡量问题所在。我建议为您的工作流程检测NewRelic,并测量花费的时间。
我的猜测是你的Redis实例无法处理负载来管理50个工作进程的工作队列。
修改强>
根据您的评论,听起来您完全I/O Bound
正在进行网页抓取。在这种情况下,您应该使用-c
选项为每个Sidekiq worker增加并发选项以生成更多线程。拥有更多线程将允许您继续处理抓取作业,即使在网络I / O上阻止了刮刀。