Skip to content

Instantly share code, notes, and snippets.

@akaihola
Created August 20, 2012 10:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akaihola/3403036 to your computer and use it in GitHub Desktop.
Save akaihola/3403036 to your computer and use it in GitHub Desktop.
Middleware for dumping the effect of each view to the RSS memory usage
"""Django Middleware for printing view's RSS usage after each request
Code for retrieving process memory information adapted from
http://code.activestate.com/recipes/286222-memory-usage/
"""
import inspect
import os
_scale = {'kb': 1024.0, 'mb': 1024.0 * 1024.0}
def resident():
# read pseudo file /proc/<pid>/status
stat = open('/proc/{0}/status'.format(os.getpid())).read()
# get VmRSS line e.g. 'VmRSS: 9999 kB\n ...'
offset = stat.index('VmRSS:')
value, unit = stat[offset:].split(None, 3)[1:3] # whitespace
return float(value) * _scale[unit.lower()]
class DebugMemoryMiddleware(object):
debug_format = ('{delta:+8.1f}KiB '
'{rss:5.1f}MiB '
'{view_filename}:{view_name}(\n'
'{indent}request,\n'
'{indent}{args})')
indent = 27 * ' '
def process_response(self, request, response):
rss = resident()
arglist = [repr(arg) for arg in self.view_args]
kwlist = ['{0}={1!r}'.format(k, v)
for k, v in self.view_kwargs.items()]
print self.debug_format.format(
delta=(rss - self.rss_before_view) / _scale['kb'],
rss=rss / _scale['mb'],
uri=request.META['PATH_INFO'],
view_filename=self.view_filename,
view_name=self.view_name,
args=',\n{0}'.format(self.indent).join(arglist + kwlist),
indent=self.indent)
return response
def process_view(self, request, callback, callback_args, callback_kwargs):
# pylint: disable=W0613
# Unused argument
# pylint: disable=W0201
# Attribute defined outside __init__
self.rss_before_view = resident()
try:
self.view_filename = callback.func_code.co_filename
self.view_name = callback.func_name
except AttributeError:
self.view_filename = inspect.getfile(callback.__class__)
self.view_name = callback.__class__.__name__ + '.__call__'
self.view_args = callback_args
self.view_kwargs = callback_kwargs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment