gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:11:53 31 4
gpt4 key购买 nike

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

起初,我的设置是:

  • :concurrency: 5sidekiq.yml
  • pool: 5在我的 database.yml
  • RAILS_MAX_THREADS在我的 Web 服务器 (puma) 配置中设置为 5。

  • 我的理解是:
  • 我的 Web 服务器( rails s )将使用最多 5 个线程,因此最多有 5 个连接到我的数据库,因为连接池设置为 5,所以这没问题。
  • 我的 sidekiq 进程将使用 5 个线程(因为并发设置为 5),这也可以,因为连接池设置为 5。

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

    因此,现在的设置是:
  • :concurrency: 25sidekiq.yml
  • pool: 25在我的 database.yml
  • RAILS_MAX_THREADS在我的 Web 服务器 (puma) 配置中设置为 5。

  • 我可以看到 25 个 sidekiq worker 正在工作 但每个工作都需要更多的时间 (有时超过 40 分钟而不是 1 分钟)!?

    实际上,我一直在做一些测试并意识到用 5、10 或 25 的 sidekiq 并发处理我的 50 个作业会导致相同的持续时间。好像不知何故,某处存在 5 个连接的瓶颈。

    我已经检查了 Sidekiq 文档和其他一些关于 SO( sidekiq - Is concurrency > 50 stable?Scaling sidekiq network archetecture: concurrency vs processes )的帖子,但我无法解决我的问题。

    所以我想知道:
  • 是我对rails的理解database.yml连接pool和 sidekiq concurrency对 ?
  • 设置这些参数的正确方法是什么?
  • 最佳答案

    把它放在这里以防其他人可以使用一个快速、非常通用的指针:
    有时增加并发工作人员的数量可能不会产生预期的结果。
    例如,如果任务数量和内核数量之间存在很大差异,调度程序将不断切换您的任务,实际上并没有太多收获,作业将花费大致相同或更多的时间。
    这是有关作业调度如何工作的相当有趣的阅读链接 https://en.wikipedia.org/wiki/Scheduling_(computing)#Operating_system_process_scheduler_implementations
    还有其他方面需要考虑,例如数据存储访问,您的工作人员是否使用相同的表?它是否由锁定整个表的存储引擎支持,例如 MyISAM?如果是这样的话,如果你有 100 个 worker 同时运行,以及足够的 RAM 和内核,它们都将排队等待正在运行的任何查询以释放表上的锁,它们都没有关系打算与之合作。
    这也可能发生在使用 InnoDB 等引擎的表上,它不会在写入时锁定整个表,但您可能有不同的工作人员访问相同的行(InnoDB 使用行级锁定)或只是一些不锁定的大索引但放慢 table 。
    我遇到的另一个问题与 Rails(我假设您正在使用)有关,在某些情况下会对 RAM 造成相当大的损失,因此您可能还想查看您的内存占用量。
    我的建议是打开日志记录并查看数据,您的员工在何处花费最多时间?它是否在网络层(不太可能)上,是否正在等待访问核心?从您的数据存储读取/写入?你的机器换了吗?

    关于ruby-on-rails - Sidekiq 并发和数据库连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45771783/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com