我该如何调查这些神秘的Django崩溃?

时间:2012-05-03 19:28:54

标签: mysql django apache profiling

一个Django网站(托管在Webfaction上)每月提供大约950k次综合浏览量,但我遇到了崩溃的问题,我无法弄清楚如何调试。在不可预测的时间间隔(平均每天一次,但不是每天同一时间),对站点的所有请求都开始挂起/超时,使得站点完全无法访问,直到我们重新启动Apache。这些请求在前端访问日志中显示为499,但根本不会出现在我们的应用程序日志中。

在仔细检查服务器日志(包括由django-timelog生成的日志)时,我似乎找不到在网站出现故障之前点击哪些页面的任何模式。对于最近的崩溃,在网站停止之前点击的所有页面似乎都是使用模板的标准渲染到响应操作,这些模板看起来非常简单并且在其余时间运行良好。根据时间日志,崩溃之前的请求似乎不会花费更长的时间,而且我无法通过负载测试有意复制崩溃。

Webfaction表示,这不是超出我们允许的内存使用量的情况,否则他们会通知我们。需要注意的一点是,当我们重新启动网站时,数据库不会重新启动(只有app / Apache)。

您将如何调查此类重复出现的问题?似乎必须在某处悬挂一行代码 - 你对找到它的过程有什么建议吗?

2 个答案:

答案 0 :(得分:0)

由于在复制崩溃之前无法真正描述失败条件,因此您可能需要使用abapache benchmark)强制执行此操作。如果您不想对生产站点执行此操作,则可以在子域中复制该站点。警告:ab可以击败服务器中的爱好者,所以RTM。您可能还想让WF管理员了解您将要做什么。

评论更新:

我建议使用完全相同的机器,以便子域名是唯一的区别。鉴于您使用了不同的机器,存在大量微妙(并非如此微妙)的环境因素,可能会使您远离使错误显示出来。如果新机器运行正常,并且您愿意在没有实际解决问题的情况下放弃问题,那么您可以简单地将其作为生产机器并且开心。就个人而言,我倾向于对这样的事情着迷,但是我又退休了,并且有充足的时间和我的脚趾一起玩。 : - )

答案 1 :(得分:0)

我曾经遇到过这样的问题,它基本上归结为我对django中间件中线程安全的误解。基本上django中间件是我相信在所有线程之间共享的单例,并且这些线程与我在自定义中间件类上设置的值进行颠倒。我的解决方案是重写我的中间件,不使用更改的实例或类属性,并将我的应用程序的关键部分切换为不使用我的uwsgi服务器的线程,因为这些似乎是我的应用程序的整体性能下降。当您拥有可能以不同间隔(一些长时间运行的视图和一些快速视图)完成的视图时,线程uwsgi设置似乎效果最佳。