0

我有一个关于 django-rq 的问题。它是 pip 安装的库,作为 python-rq 之上的一个小层,它在 redis 实例上运行。目前,我在本地 redis 实例上使用数据库 0 的默认队列上运行所有作业。

我通过在默认队列上为 x 个工作人员运行以下脚本 x 次来启动工作人员:

nohup ~/.virtualenvs/prod/bin/python3 manage.py rqworker default &
nohup rq resume --url="redis://localhost:6379/0"

我在 8 核 / 32GB RAM 机器上运行。对于每个传入的请求,都需要一个工作人员来处理该作业,这在后台进程中通常需要 3 到 60 分钟,该进程使用 OpenCV、Tesseract 和一些其他 API,并在此过程中发出一些 HTTP 请求。

我如何知道我应该使用的 rq 工作人员的理想数量?我正在查看管理面板,上面写着 8 名工人。这是我应该使用的理想工人数量吗?我应该使用 20 吗?100个怎么样?

我如何考虑以下变量,以便选择我应该启动的正确数量的工人:

  1. 传入请求数
  2. 每个进程所需的 RAM 量
  3. 核心数
  4. 工人可能崩溃的可能性
4

1 回答 1

0

已经使用 RQ 大约一年了。

这个答案完全取决于您正在运行的内容。如果你是 CPU/内存密集型计算,你显然不能启动很多。例如,我做了很多数字运算,所以我在 2gb RAM vps 上运行大约 2 个,有时是 3 个 RQ 工作人员。我不确定这是否适合每个人,但是运行 django RQ worker 没有工人做任何事情会从 getgo 吃掉大约 150mb RAM。也许我配置错了。当它实际处理作业时,有时每个工作人员的 RAM 使用率会高达 700 MB。

如果打包太多作业,则会收到 JobFailed 错误,但没有明确说明原因。由于 RQ(异步计算)的性质,除非您投入大量日志记录或有测量和收集 CPU/内存使用量的开销,否则您真的无法判断。要么,要么运行 htop 并手动查看利用率。

我的建议:

  1. 水平扩展(每台服务器更少的工人)而不是垂直(拥有大量工人的强大机器)
  2. 限制每个作业的执行时间.. 100 个 1 分钟的作业优于 1 100 分钟的作业
  3. 使用 microdict 和 blist 模块进行大型 CSV / 列表处理......它们在 RAM / CPU 使用率方面的效率提高了 100 倍
于 2021-08-19T12:24:59.493 回答