如何根据请求记录Django应用程序的内存使用情况

dde*_*eny 18 python apache django memory-leaks

您是否了解了根据请求记录django应用程序内存使用情况的有效方法?

我有一个apache/mod_wsgi/django堆栈,它通常运行良好,但有时一个进程最终会占用大量内存.服务器最终缺少内存,交换很多,服务大大减慢.

这种情况很难修复,因为我不知道哪个请求会被归咎于此行为,我无法重现它.

我希望在生产中部署一些内容,在每次请求之前和之后记录进程的内存使用情况,并且开销最小.


在我开始重新发明轮子之前,我的同伴们的社区是否知道解决这个问题的任何现有解决方案?建议,中间件,片段或apache日志配置赞赏.

(我认为)我不需要的是:

  • 一组dev-stage分析/调试工具,我已经知道了一些,如果我知道要分析/调试什么,我会使用它们,看起来有点太多,无法永远监视生产中运行的服务.最重要的是,那些tol通常显示的是代码碎片的内存使用情况报告,只是查明错误的请求真的很有帮助.
  • 关于如何优化django应用程序的mem使用的通用建议,总是很好阅读,但这里的想法是"如何有效地追踪需要优化的请求".

我最接近的搜索结果:

Gra*_*ton 18

用于跟踪内存使用情况并立即生成可用结果的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
Run Code Online (Sandbox Code Playgroud)

这需要安装'psutil'模块进行内存计算.

蛮力并且可能导致多线程系统中的误报.由于延迟加载,您还会看到它会因为内容加载而触发针对新进程的前几个请求.

  • @vijayshanker,我知道它已经很久了,你可能已经找到了问题,但是,仅仅为了记录,你看到错误的原因是某些请求不会触发process_request和process_response,例如301(重定向) )只触发process_response.这也意味着这种解决方案存在缺陷.在访问请求之前,您至少应该检查请求是否有"_mem". (2认同)
  • 一个非常有用的答案,但请谨慎使用,因为并不总是调用process_request来进行相应的process_response调用(请参阅https://docs.djangoproject.com/en/1.8/topics/http/middleware/#process-response).我只是将process_response逻辑包装在"if hasattr(request,"_ mem")中:"并为我修复了它. (2认同)