Django "migrate" 消耗太多 CPU

Django "migrate" consuming too much CPU

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

此外,我分析了 migrate 函数,这是一张图表:

我相信迁移会消耗很多,特别是当有很多模型和很多应用程序时,更多应用程序更多依赖项更多迁移复杂性。

我建议启动一个新实例,此后仅 运行 迁移和关闭。这样你的网络服务器就可以访问了。

您是否经常依赖 migrate 至 运行?因为一旦项目接近并进入生产状态,应该不会有很多迁移到 运行。还是您的意思是 migrate 需要这么长时间,即使 migrate --list 显示没有要迁移的内容?

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

运行那些通过explain analyzesql命令的查询:

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 个(包括第 3 方),我认为它应该可以正常工作,但还有其他问题(恕我直言!)。

此外,您还没有显示服务器的资源使用情况。如果缓慢是由于 swapping/too 大量 RAM 使用,您真的可以通过提供更多 RAM(给进程)来提高速度。

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

A CPU Credit provides the performance of a full CPU core for one minute. Traditional Amazon EC2 instance types provide fixed performance, while T2 instances provide a baseline level of CPU performance with the ability to burst above that baseline level. The baseline performance and ability to burst are governed by CPU credits.

运行 考虑到这一点,迁移应该不是问题 ^ 即使它消耗了 100% 的 CPU。我们进行了更多调查,发现服务器上有 crons 运行 不应该存在。