Django" migrate"消耗太多的CPU

时间:2016-03-30 08:11:19

标签: django django-migrations

我们的登台服务器,AWS上的t2.micro实例不断下降。在调查中,我们发现当manage.py migrate运行时CPU使用率高达99%。它很容易在本地机器上重现。我们正在运行Django 1.9postgresql数据库。我现在不确定,是我们做错了什么,或者是这样做的。我们在项目中有大约18个应用程序,但运行migrate app_name也会导致相同的行为。附上CPU使用情况的屏幕截图。

Staging server

另外,我描述了迁移功能,这是一个图表:

enter image description here

3 个答案:

答案 0 :(得分:3)

您是否依赖migrate定期投放?因为一旦项目接近然后进入生产状态,就不应该进行多次迁移。或者你的意思是migrate需要这么长时间,即使migrate --list表明没有任何东西需要迁移?

另外,要了解Postgres正在做什么,您应该设置查询记录,包括他们的时间。您可以过滤以仅记录更长时间运行的查询: http://www.postgresql.org/docs/9.5/static/runtime-config-logging.html

通过explain analyze sql命令运行这些查询:

psql> EXPLAIN ANALYZE <complete query>;

http://www.postgresql.org/docs/9.5/static/using-explain.html

您需要提供从explain获得的信息以获得进一步的帮助。

编辑:

另外,如果您有大量迁移文件,可以尝试squash migrations。我可以想象Django一个接一个地完成所有这些工作。因此,如果您有许多应用程序,其中许多文件相互依赖,您可以想象会发生什么。 https://docs.djangoproject.com/en/1.9/topics/migrations/#squashing-migrations

编辑2:

将此评论从评论转移到答案:

migrate --list是否也消耗了那么多CPU?如果没有,那么您可以先运行它,看看是否真的需要迁移,只在那些具有开放迁移的应用上运行migrate

我认为这将是最好的。如果您可以更详细地了解,可能实际上可以向Django社区寻求帮助。我可以想象你有一个有趣的设置,可以找到如何调整Django迁移以减少(实际上是不必要的)工作。但我不太了解迁移代码,所以我无法分辨。 但这也取决于我们谈论的应用程序数量,以及迁移文件的数量。如果您的应用程序少于30个(包括第三方),我认为应该可以正常工作,还有其他问题(恕我直言!)。

此外,您尚未显示服务器的资源使用情况。如果缓慢是由于交换/过多的RAM使用,你真的可以通过提供更多的RAM(到进程)来提升它。

答案 1 :(得分:1)

我认为迁移消耗很多,特别是当拥有许多模型和许多应用程序时,更多应用程序的依赖性更多,迁移复杂性更高。

我建议启动一个只在此之后运行迁移和关闭的新实例。这样您就可以访问Web服务器了。

答案 2 :(得分:0)

这并不能完全解决问题陈述,而是解决问题的一部分。我浏览了documentation of AWS t2.micro,发现T2.Micro实例设计用于处理在合理的长间隔后发生的CPU Burst短间隔(~1分钟)。来自t2.micro文档:

  

CPU Credit可在一分钟内提供完整CPU内核的性能。传统的Amazon EC2实例类型提供固定的性能,而T2实例提供基准级别的CPU性能,并能够突破该基线级别。基线性能和突发能力由CPU信用额度决定。

即使耗尽100%的CPU,运行迁移也不应该成为问题。我们调查了更多,发现服务器上运行的crons不应该是。