Ruby on rails Sidekiq并发和数据库连接池

Ruby on rails Sidekiq并发和数据库连接池,ruby-on-rails,postgresql,heroku,activerecord,sidekiq,Ruby On Rails,Postgresql,Heroku,Activerecord,Sidekiq,我的问题是:每天晚上,我都要处理大约5万份背景工作,平均每个工作60秒。这些工作基本上是调用Facebook、Instagram和Twitter API来收集用户的帖子并保存在我的数据库中。这些作业由sidekiq处理 起初,我的设置是: :并发:在sidekiq.yml pool:5在我的数据库中。yml RAILS\u MAX\u THREADS在我的Web服务器(puma)配置中设置为5 我的理解是: 我的web服务器(rails s)将使用最多5个线程,因此最多可以连接到我的数据库

我的问题是:每天晚上,我都要处理大约5万份背景工作,平均每个工作60秒。这些工作基本上是调用Facebook、Instagram和Twitter API来收集用户的帖子并保存在我的数据库中。这些作业由sidekiq处理

起初,我的设置是:

  • :并发:在
    sidekiq.yml

  • pool:5
    在我的
    数据库中。yml

  • RAILS\u MAX\u THREADS
    在我的Web服务器(puma)配置中设置为5

我的理解是:

  • 我的web服务器(
    rails s
    )将使用最多5个线程,因此最多可以连接到我的数据库5个连接,这是正常的,因为连接池设置为5

  • 我的sidekiq进程将使用5个线程(因为并发性设置为5),这也可以,因为连接池设置为5

为了同时处理更多的作业并减少处理所有作业的全局时间,我决定将sidekiq并发性增加到25。在生产中,我提供了一个Heroku Postgres标准数据库,最大连接数为120,以确保能够使用Sidekiq并发

因此,现在的设置是:

  • :并发:在
    sidekiq.yml

  • pool:25
    在我的
    数据库中。yml

  • RAILS\u MAX\u THREADS
    在我的Web服务器(puma)配置中设置为5

我可以看到25名sidekiq工人正在工作,但每项工作都花费了更多的时间(有时超过40分钟而不是1分钟)

实际上,我已经做了一些测试,并意识到在sidekiq并发度为5、10或25的情况下处理50个作业会导致相同的持续时间。似乎不知何故,某个地方出现了5个连接的瓶颈

我已经检查了Sidekiq文档和其他一些关于SO(,)的帖子,但是我还没有解决我的问题

所以我想知道:

  • 我对rails
    database.yml
    connection
    pool
    和sidekiq
    并发性的理解是否正确

  • 设置这些参数的正确方法是什么


将此项放在此处,以防其他人使用快速、非常通用的指针:

有时,增加兼职员工的数量可能不会产生预期的结果

例如,如果任务数量和内核数量之间存在较大差异,调度程序将继续切换任务,但实际上没有多少收益,作业将花费相同或稍长的时间

这里有一个链接,链接到一本关于作业调度工作原理的有趣读物

<> P>还有其他方面需要考虑,比如数据存储访问,你的工作人员使用同一个表吗?它是否由锁定整个表的存储引擎(如MyISAM)支持?如果是这种情况,那么如果您同时运行100个工作线程,并且有足够的RAM和内核,它们都将排队等待运行哪个查询来释放它们都要使用的表上的锁就无关紧要了。 这种情况也可能发生在使用InnoDB等引擎的表上,InnoDB在写入时不会锁定整个表,但可能有不同的工作人员访问相同的行(InnoDB使用行级锁定),或者只是一些不锁定但会减慢表速度的大索引

我遇到的另一个问题是Rails(我假设您正在使用它)在某些情况下会对RAM造成很大的损失,所以您可能还需要查看内存占用情况


我的建议是打开日志并查看数据,您的员工在哪里花费的时间最多?它是不是在网络层(不太可能),它是否在等待访问核心?从数据存储读取/写入?您的机器正在交换吗?

不是硬件/网络人员,但最终这是在您的硬件之上。你们有多少个处理器?例如,如果您有四个处理器,那么五个线程可能均匀分布在它们之间。当您将线程数增加到25个时,最好的情况是,每个处理器运行6个线程。我会逐渐增加线程,从应用程序一直到硬件检查统计数据,以查看瓶颈发生的时间和地点。这可能对您有用