Hei*_*ezi 5 postgresql activerecord ruby-on-rails heroku sidekiq
这是我的问题:每天晚上,我必须处理大约50k的后台作业,每个作业平均需要60s。这些工作基本上是在调用Facebook,Instagram和Twitter API,以收集用户的帖子并将其保存在我的数据库中。作业由sidekiq处理。
首先,我的设置是:
:concurrency: 5
在 sidekiq.yml
pool: 5
在我的 database.yml
RAILS_MAX_THREADS
在我的Web服务器(puma)配置中设置为5 。
我的理解是:
我的网络服务器(rails s
)将最多使用5个线程,因此最多可与数据库建立5个连接,因为连接池设置为5,所以可以。
我的sidekiq进程将使用5个线程(因为并发设置为5),也可以,因为连接池设置为5。
为了同时处理更多作业并减少处理所有作业的全局时间,我决定将sidekiq并发性提高到25。在生产中,我预配置了最大连接数为120的Heroku Postgres标准数据库。确保我将能够使用Sidekiq并发。
因此,现在的设置是:
:concurrency: 25
在 sidekiq.yml
pool: 25
在我的 database.yml
RAILS_MAX_THREADS
在我的Web服务器(puma)配置中设置为5 。
我可以看到有25个sidekiq工人正在工作,但每个Job正在占用更多时间(有时是40分钟而不是1分钟)!
实际上,我一直在进行一些测试,并意识到以50、10或25的sidekiq并发处理50个Job会得到相同的持续时间。好像某个地方存在5个连接的瓶颈。
我已经检查了Sidekiq文档以及关于SO的其他一些文章(sidekiq-并发> 50是否稳定?,扩展sidekiq网络体系结构:并发与进程),但是我无法解决我的问题。
所以我想知道:
我对Rails database.yml
连接pool
和sidekiq的理解concurrency
正确吗?
设置这些参数的正确方法是什么?
将其放在这里以防其他人可以使用快速、非常通用的指针:
有时增加并发工作线程的数量可能不会产生预期的结果。
例如,如果任务数量和核心数量之间存在很大差异,调度程序将不断切换您的任务,并且实际上没有什么好处,作业只会花费大约相同或更多的时间。
这是关于作业调度如何工作的相当有趣的阅读的链接https://en.wikipedia.org/wiki/Scheduling_(computing)#Operating_system_process_scheduler_implementations
还有其他方面需要考虑,例如数据存储访问,您的工作人员是否使用相同的表?它是否由锁定整个表的存储引擎(例如 MyISAM)支持?如果是这样的话,如果你有 100 个工作进程同时运行,并且有足够的 RAM 和内核,那么它们都将排队等待正在运行的任何一个查询来释放它们所在表上的锁。意味着要与. 使用 InnoDB 等引擎的表也会发生这种情况,它不会在写入时锁定整个表,但可能有不同的工作人员访问相同的行(InnoDB 使用行级锁定),或者只是一些不锁定的大型索引但减慢桌子的速度。
我遇到的另一个问题与 Rails(我假设您正在使用)有关,在某些情况下会对 RAM 造成相当大的影响,因此您可能还想查看一下您的内存占用量。
我的建议是打开日志记录并查看数据,您的员工在哪里花费最多时间?它是否位于网络层(不太可能),是否正在等待访问核心?从您的数据存储中读取/写入?你的机器换了吗?
归档时间: |
|
查看次数: |
2412 次 |
最近记录: |