如何防止mod_wsgi Django应用反复重载?

4 投票
1 回答
517 浏览
提问于 2025-04-16 00:01

我的mod_wsgi Django应用在客户端发出的前几次请求时,总是会被重新加载。这让我的性能变得很差。

经过一段时间的请求后,应用似乎就稳定下来了,不再被重新加载了。有人知道为什么会这样吗?我该怎么做才能防止这种情况发生呢?

(我在httpd.conf里设置了MaxRequestsPerChild 0,所以这不是问题所在。)

1 个回答

5

这可能是因为你在UNIX系统上使用了mod_wsgi的嵌入模式和Apache,可能还用的是Apache的prefork MPM,这样会让问题更严重。简单来说,在这种配置下,Apache是一个多进程的网络服务器。再加上默认情况下,应用程序是在第一次请求时才加载的,所以你会发现每个Apache子进程在应用程序加载时,第一次请求会有延迟。

即使是对于Django框架来说,这种延迟也不应该太过分,所以我们要问问你的具体应用在启动时做了什么,导致了这么长的延迟或负载激增。

要理解这些问题,确保你阅读以下内容:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

然后,按照mod_wsgi的维基页面上的说明,改用daemon模式。特别是可以从这里开始:

http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide

如果确实需要运行多个守护进程,而不是仅仅希望你的应用会有多大的负载,并且加载时间仍然是个问题,那么你可以使用WSGIImportScript和其他方法来配置mod_wsgi,在进程启动时预加载你的WSGI应用,这样在请求到来之前就能加载好。对于Django,确保使用以下链接中描述的WSGI脚本文件:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

而不是Django文档中描述的那个,因为后者是懒加载的,你仍然会看到问题,以及WSGI托管机制和内置开发服务器之间的行为差异。

撰写回答