很多工人,delayed_job运行缓慢

时间:2012-01-16 03:11:03

标签: ruby-on-rails multithreading virtual-machine delayed-job cpu-usage

我们的应用程序有一个搜索任务,运行时间<30秒。我们使用delayed_job将任务移到后台,效果很好。为了处理更多的搜索请求,我们打开了60名delayed_job工作人员,当更多的工作人员同时工作时就出现问题。

如果我向服务器发送一个请求,则需要约30秒才能完成作业;然后我尝试向服务器发送10个请求,每个作业需要> 3分钟才能完成...如果我尝试同时向服务器发送30个请求,则每个作业需要26分钟才能完成.... ......我的上帝......

我们的搜索任务可分为两部分。首先,使用线程(http://www.tutorialspoint.com/ruby/ruby_multithreading.htm)向第三方服务器发送10-20个API请求,并等待响应,大约需要15秒才能完成。其次,我们处理响应数据,搜索本地mySQL数据库,进行一些循环和计算,最后将结果保存到文件系统(文件位置是使用NFS的共享空间),大约需要10秒才能完成。

我使用Linux'top'命令,发现当一个作业运行时,它有时需要100%的CPU功率。当我同时运行30个工作时,每个工作的CPU功率都低于10%,我想这就是每个工作需要26分钟的原因......

目前我不知道如何提高速度,使其支持更多用户,速度约为30秒......

我们正在使用Rails 3.0.x,Ruby 1.9.2p290(真正的线程?),一个运行4个VM的服务器(DB,Ngnix,Ruby / Unicorn,Ruby / delayed_job)。

现在我的想法是: - 真正的线程(如何测试我们是谁?) - jRuby(这种情况有帮助吗?) - 网络IO(服务器管理员说不太可能) - 文件系统/ NFS IO(服务器管理员说不太可能)

任何有类似经历的人都可以给我一些想法,所以我可以深入研究这个问题?非常感谢!

1 个答案:

答案 0 :(得分:1)

New Relic可以让您了解您的工作在哪里花费时间。您可以set it up to monitor your jobs并记录每一个的详细描述。有一个为期14天的免费试用版,其中包括详细的跟踪功能(“交易跟踪”)。

瓶颈可能出在你提到的任何领域。如果数据库是您的瓶颈,您可以通过添加索引来调整查询。如果您的Web请求并非真正并行执行(不确定您的代码是什么样的),您可以使用typhoeus之类的东西来处理所有并行业务。

Savon正在处理来自SOAP请求的XML,因此请确保您使用的是更快的XML库,如libxml或nokogiri。