如何调试 Django 网站的长时间等待

How to debug long wait times for Django Website

我有一个 Django 网站,我想改进其响应时间。当我点击我网站上的站内链接时,结果要么立即加载下一页,要么在页面加载前等待 20-30 秒。我发现此行为中没有可重现的模式来帮助我确定修复方法。我意识到有很多很多原因可能会导致这种情况,并且需要更多关于我的特定配置的信息才能获得这方面的具体帮助。

但是,我希望其他人可以提供关于我应该调查的一般领域的建议,而不是转储配置信息页面并寻求具体建议,这将与以下观察结果一致:

Debug-Toolbar 显示总 CPU 时间和 SQL 查询时间在合理范围内(< 1 秒),但是总浏览器请求时间为 22 秒(见图)。为什么这些值可能如此不同?什么可能导致几秒钟的请求时间不属于 CPU 时间?


更新 1:在修改 gunicorn 中的 --access-logfile 标志后,我能够从 Django 看到更详细的日志(如此处所述:http://docs.gunicorn.org/en/stable/settings.html#logging)。这告诉我,在发生延迟的情况下,Django 直到 gunicorn worker 重新启动(大约需要 30 秒)才会收到请求:

web_1 | 2019-07-23 15:33:06 +0000 [CRITICAL] WORKER TIMEOUT (pid:9)
web_1 | [2019-07-23 11:33:06 -0400] [9] [INFO] Worker exiting (pid: 9)
web_1 | [2019-07-23 15:33:06 +0000] [10] [INFO] Booting worker with pid: 10

现在我只需要找出我的 gunicorn worker 出现故障的原因。


更新 2:我将 -w 4 标志添加到 gunicorn(之前未指定此标志),问题似乎已经消失。我会继续测试,看看这是否是一个长期解决方案。

好的,这是我找到的答案:

Debug 工具栏的 CPU 时间仅反映 Django 代码所花费的时间。总请求时间比 CPU 时间长得多这一事实反映了其他服务器端非 Django 代码的组合所花费的时间。因此,修复不在 django 中,而是在服务器设置的其余部分之外。典型的 Django 部署通常怀疑是 Django 本身前面的一切(例如 ngix、gunicorn 等)。

了解更多关于 gunicorn 标志(特别是 --access-logfile)的信息让我看到了 gunicorn worker 产生的错误消息,这些错误消息反复(但不能重现)超时。虽然仍然不知道超时发生的原因,但从 1 个更改为 4 个 worker(使用 -w 4 标志)已经解决了最初的 30 秒页面加载延迟问题。