Created
August 20, 2012 10:37
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""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