Postgres:优先考虑主要应用程序而不是背景芹菜作业

时间:2013-12-22 17:09:23

标签: django postgresql celery

我正在研究使用芹菜作为后台任务的django应用程序。 这些任务解析用户上传,进行一些api调用,然后将结果写入postgres数据库。芹菜与20名工人一起运行。 有时,当用户上传较大的文件(如200k记录进行处理)时,主站点变得不可用,因为芹菜任务查询会使数据库过载。

你知道我怎么解决它?

一方面 - 我可以减少芹菜工人的数量并使解析速度变慢 - 另一方面 - 当没有很多人使用主站点时,利用免费资源会很棒。

我对postgres配置不太熟悉,所以我不确定是否需要修改postgres或芹菜配置,甚至修改任务。

请告诉我你将如何解决它,或者告诉我应该在哪个方向阅读文档。

谢谢

2 个答案:

答案 0 :(得分:0)

需要更多信息才能提供更好的答案,但需要考虑的候选人包括:

  • 如果可能,避免不必要地锁定您的芹菜任务。 (可能不是......)
  • 在启动芹菜任务之前运行飞行前检查,如果发生太多任务则进行睡眠。

关于第二点,您可以通过查询目录来获取列表:

select count(*) from pg_stat_activity;
select count(*) from pg_locks;

答案 1 :(得分:0)

拥有这么多工作人员没有意义,当所有工作人员都处于活动状态时,数据库会过载,所以除非你能找到另一个优化,否则减少工人数量是一个好主意。当很少有人使用该网站时,这不会使事情变慢,因为并非所有工作者都被使用(为了简化,否则,数据库会被重载)。

在配置工作人员时,也许可以将您的任务拆分为oder以获得更好的粒度。比方说,您可以将任务分为三个部分:

  • 解析 - 长且占用大量CPU
  • api调用 - 长期和低负载
  • db update - quick

然后,您可以将Celery队列专用于每种任务类型,并在每个队列上配置不同数量的worker。例如,将更多的worker专用于I / O绑定的API调用,并且只使用一个或两个worker进行数据库更新。

如果瓶颈在db中,这可能无法解决您的问题,但至少您可以更好地查看问题,并且您将DB任务减少到可能的最小范围(因此,在此期间没有锁定)解析例子。)