【问题标题】:Django Initial Page Load Slow After Python 2 to 3 UpgradePython 2 到 3 升级后 Django 初始页面加载缓慢
【发布时间】:2020-01-20 22:56:37
【问题描述】:

我运行 Django 1.11.20。我刚刚(终于)从 Python 2.7 跳到了 3.7。

我注意到自从升级到 Python 3 后,清除缓存后的第一个页面加载非常慢。到目前为止,我的开发机器上只有我的 Python 3 环境,所以我在使用 ./manage.py runserverFileBasedCache 后端时遇到了这种情况。我不知道我是否会在生产堆栈(nginx、uwsgi、redis 等)上遇到同样的事情。

我正在使用 Django 调试工具栏,它为我提供了一些关于问题不是的提示,但我不确定应该从哪里查看问题所在。

在我的开发机器上的 Python 2.7 环境中,调试工具栏运行加载一个带有空缓存的简单页面的时间是:

  • CPU:4877.89ms
  • SQL 462.41 毫秒
  • 缓存:1154.54ms

调试工具栏给出的时间在我的开发机器上的 Python 3.7 环境中运行加载具有空缓存的同一页面是:

  • CPU:91661.71ms
  • SQL 350.44 毫秒
  • 缓存:609.65ms

(我在这台开发机器上使用基于文件的缓存,所以当我说“使用空缓存”时,我的意思是我在浏览器中加载 URL 之前rm -r cache。)

因此升级后 SQL 和缓存时间稍微加快了一点,但 CPU 时间翻了一番。当我在调试工具栏中打开“时间”面板时,我看到增加的“时间属性”是“请求”。

同样的事情发生在每个页面上(包括由TemplateView 生成的 HTML 页面,所以它们没有做任何棘手的事情),但只有在第一次从空缓存加载时才会发生。在第一次响应之后,所有页面都恢复到与 Python 2 环境中大致相同的响应时间。所以这与初始请求有关。

我不确定在哪里可以尝试找出 Django 仅在第一个请求时在做什么。任何指针?或者有什么明显的东西可以让我在从 Python 2.7 到 3.7 的过程中变慢?

【问题讨论】:

  • 您是如何将 Python-2.x 程序转换为 Python-3.x 的?
  • 我使用了 python-futurize。这是在两种环境中运行的相同代码库。

标签: python django python-3.7 django-debug-toolbar


【解决方案1】:

我终于能够将这个问题追溯到 Django 调试工具栏本身,它在我的 Python 3 升级期间从 1.11 升级到 2.0。具体来说,工具栏的 SQL 面板导致速度变慢。如果缓存对象不存在,我有一个上下文处理器执行查询。查询本身很快,但由于某种原因,Django Debug Toolbar 2.0 为其生成堆栈跟踪非常慢。我还没有弄清楚 1.11 和 2.0 之间是什么变化导致了这种可怕的性能损失,但现在我知道问题出在哪里,我可以解决它。

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2017-03-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多