19

您知道记录每个请求的 django 应用程序的内存使用情况的有效方法吗?

我有一个 apache/mod_wsgi/django 堆栈,它通常运行良好,但有时一个进程最终会占用大量内存。服务器最终内存不足,交换了很多,并且服务速度大大减慢。

这种情况很难解决,因为我不知道该行为应该归咎于哪个请求,我无法重现它。

我想在生产中部署一些东西,以最小的开销记录每个请求之前和之后进程的内存使用情况。


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

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

  • 一套开发阶段的分析/调试工具,我已经知道一些,如果我知道要分析/调试什么,我会使用它们,看起来有点太多了,永远监控生产中运行的服务。最重要的是,这些 tol 通常显示的是代码碎片的 mem 使用报告,这将有助于查明错误的请求。
  • 关于如何优化 django 应用程序的内存使用的一般建议,读起来总是很好,但这里的想法是“如何有效地跟踪需要优化的请求”。

我最接近的搜索结果:

4

2 回答 2

21

用于跟踪内存使用情况并立即生成可用结果的 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”模块来进行内存计算。

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

于 2012-09-03T21:48:57.273 回答
1

这可能无法完全涵盖您的问题,但我建议尝试使用 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 进程使用的总内存?

但是,如果您可以避免在生产环境中执行此操作,可能会更好。只是为了开发和测试来追踪真正的问题。

于 2012-09-03T14:04:03.420 回答