你知道要登录每个请求的Django应用程序的内存使用情况的有效方式?
我有一个Apache / mod_wsgi的/ Django的堆栈,它通常运行良好,但有时一个过程结束了吃一个巨大的大量的内存。 该服务器结束了对MEM做空,换了很多,服务的显着放缓。
这种情况是非常难解决,因为我不知道哪个请求被指责这种行为,我不能复制。
我想有部署在生产一些东西,记录进程的内存使用情况在每次请求后,以最小的开销。
之前,我开始重新发明轮子,做我的同胞djangoists的社区了解任何现有的解决方案来解决这个问题呢? 建议,中间件,片段或也许Apache日志配置赞赏。
什么(我觉得)我不需要为:
- 一组开发阶段剖析/调试工具,我已经知道了一些,如果我知道什么资料/调试我会使用他们,这看起来有点过分永远监控生产运行的服务。 最重要的是,是什么通常是由那些TOL显示是代码的内存使用报告撕成细条,这将真正有助于刚刚确认故障请求。
- 关于如何优化Django应用程序的内存使用通用的建议,以及它总是很好看,但这里的想法是相当«如何有效地跟踪哪些需要被优化的请求»。
我最近的搜索结果:
- Django的/ WSGI -如何分析部分的要求吗? 我的分析工具是每个请求,但应用程序运行的内存,然后才
- Django的内存使用量上升的每个请求
- 每个请求的平均PHP的内存使用情况?
一个Django中间件用于跟踪内存使用和立即产生可用的结果,需要大钩处理请求和响应过程。 换句话说,看的要求开始和结束之间的差异,如果超过某个阈值记录警告。
一个完整的中间件的例子是:
import os
import psutil
import sys
THRESHOLD = 2*1024*1024
class MemoryUsageMiddleware(object):
def process_request(self, request):
request._mem = psutil.Process(os.getpid()).memory_info()
def process_response(self, request, response):
mem = psutil.Process(os.getpid()).memory_info()
diff = mem.rss - request._mem.rss
if diff > THRESHOLD:
print >> sys.stderr, 'MEMORY USAGE %r' % ((diff, request.path),)
return response
这需要安装做内存计算“psutil”模块。
是蛮力,并可能导致误报的多线程系统。 由于延迟加载,你也会看到它触发对新工艺的东西负载可达前几个请求。
这可能不会完全覆盖你的问题,但我建议尝试的nginx + uwsgi代替的Apache2 + mod_wsgi的。 在我的测试中,它竟然是稳定得多(mod_wsgi的在某些时候哽咽完全),速度更快,使用更少的内存(它可能只是解决你所有的问题完全)。
关于跟踪内存使用情况,您可以创建一个简单的中间件:
class SaveMemoryUsageMiddleware(object):
def process_response(self, request, response):
# track memory usage here and append to file or db
return response
并把它添加到您的中间件。
对于内存跟踪代码,我建议您检查出: 由Python进程使用的内存总量?
但是,它可能会更好,如果你能避免在生产这样做。 只是为了开发和测试,以追查真正的问题。