From d58f119fc17bd15edee5f3ac783703a8aec534b8 Mon Sep 17 00:00:00 2001 From: Martin Maney Date: Sat, 8 Nov 2008 11:33:19 -0600 Subject: Added fine-grained CPU usage to timer --- debug_toolbar/panels/timer.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'debug_toolbar/panels/timer.py') diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py index ea8ed4a..a1d6355 100644 --- a/debug_toolbar/panels/timer.py +++ b/debug_toolbar/panels/timer.py @@ -1,4 +1,4 @@ -import time +import time, resource from debug_toolbar.panels import DebugPanel class TimerDebugPanel(DebugPanel): @@ -9,12 +9,16 @@ class TimerDebugPanel(DebugPanel): def process_request(self, request): self._start_time = time.time() + self._start_rusage = resource.getrusage(resource.RUSAGE_SELF) def process_response(self, request, response): self.total_time = (time.time() - self._start_time) * 1000 + self._end_rusage = resource.getrusage(resource.RUSAGE_SELF) def title(self): - return 'Time: %0.2fms' % (self.total_time) + utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime + stime = self._end_rusage.ru_stime - self._start_rusage.ru_stime + return 'Time: %0.2fms, %0.2fms CPU' % (self.total_time, (utime + stime) * 1000.0) def url(self): return '' -- cgit v1.2.3 From 47d1a4ff38bc48a6dd54246556434a72c0476bb0 Mon Sep 17 00:00:00 2001 From: Martin Maney Date: Sat, 8 Nov 2008 19:48:18 -0600 Subject: Added more of the rusage stats in a drop-down panel (some items were commented out after I was reminded that not all of the original BSD items are supported under Linux) --- debug_toolbar/panels/timer.py | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'debug_toolbar/panels/timer.py') diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py index a1d6355..b93c843 100644 --- a/debug_toolbar/panels/timer.py +++ b/debug_toolbar/panels/timer.py @@ -1,11 +1,16 @@ import time, resource + +from django.template.loader import render_to_string + from debug_toolbar.panels import DebugPanel + class TimerDebugPanel(DebugPanel): """ Panel that displays the time a response took in milliseconds. """ name = 'Timer' + has_content = True def process_request(self, request): self._start_time = time.time() @@ -23,5 +28,41 @@ class TimerDebugPanel(DebugPanel): def url(self): return '' + def _elapsed_ru(self, name): + return getattr(self._end_rusage, name) - getattr(self._start_rusage, name) + def content(self): - return '' + + utime = 1000 * self._elapsed_ru('ru_utime') + stime = 1000 * self._elapsed_ru('ru_stime') + vcsw = self._elapsed_ru('ru_nvcsw') + ivcsw = self._elapsed_ru('ru_nivcsw') + minflt = self._elapsed_ru('ru_minflt') + majflt = self._elapsed_ru('ru_majflt') + +# these are documented as not meaningful under Linux. If you're running BSD +# feel free to enable them, and add any others that I hadn't gotten to before +# I noticed that I was getting nothing but zeroes and that the docs agreed. :-( +# +# blkin = self._elapsed_ru('ru_inblock') +# blkout = self._elapsed_ru('ru_oublock') +# swap = self._elapsed_ru('ru_nswap') +# rss = self._end_rusage.ru_maxrss +# srss = self._end_rusage.ru_ixrss +# urss = self._end_rusage.ru_idrss +# usrss = self._end_rusage.ru_isrss + + rows = ( + ('User CPU time', '%0.3f msec' % utime), + ('System CPU time', '%0.3f msec' % stime), + ('Total CPU time', '%0.3f msec' % (utime + stime)), + ('Elapsed time', '%0.3f msec' % self.total_time), + ('Context switches', '%d voluntary, %d involuntary' % (vcsw, ivcsw)), +# ('Memory use', '%d max RSS, %d shared, %d unshared' % (rss, srss, urss + usrss)), +# ('Page faults', '%d no i/o, %d requiring i/o' % (minflt, majflt)), +# ('Disk operations', '%d in, %d out, %d swapout' % (blkin, blkout, swap)), + ) + context = { + 'rows': rows, + } + return render_to_string('debug_toolbar/panels/timer.html', context) -- cgit v1.2.3 From 9f5c2280ec25c162b720a6e864b081934126cecc Mon Sep 17 00:00:00 2001 From: Rob Hudson Date: Tue, 9 Dec 2008 14:14:46 -0800 Subject: Minor cleanup and template change to previous commit. --- debug_toolbar/panels/timer.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'debug_toolbar/panels/timer.py') diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py index b93c843..cafdb05 100644 --- a/debug_toolbar/panels/timer.py +++ b/debug_toolbar/panels/timer.py @@ -1,7 +1,6 @@ -import time, resource - +import resource +import time from django.template.loader import render_to_string - from debug_toolbar.panels import DebugPanel -- cgit v1.2.3 From d163dea7a5e6f07de690a43a65409df072fdb612 Mon Sep 17 00:00:00 2001 From: Rob Hudson Date: Thu, 11 Dec 2008 14:04:45 -0800 Subject: Win32 systems don't have the resource module. This patch codes around it so only the basic timings are shown for those that don't have the resource module, and finer grained timings are shown for those that do. --- debug_toolbar/panels/timer.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'debug_toolbar/panels/timer.py') diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py index cafdb05..352bf55 100644 --- a/debug_toolbar/panels/timer.py +++ b/debug_toolbar/panels/timer.py @@ -1,4 +1,7 @@ -import resource +try: + import resource +except ImportError: + pass # Will fail on Win32 systems import time from django.template.loader import render_to_string from debug_toolbar.panels import DebugPanel @@ -9,20 +12,32 @@ class TimerDebugPanel(DebugPanel): Panel that displays the time a response took in milliseconds. """ name = 'Timer' - has_content = True + try: # if resource module not available, don't show content panel + resource + except NameError: + has_content = False + has_resource = False + else: + has_content = True + has_resource = True def process_request(self, request): self._start_time = time.time() - self._start_rusage = resource.getrusage(resource.RUSAGE_SELF) + if self.has_resource: + self._start_rusage = resource.getrusage(resource.RUSAGE_SELF) def process_response(self, request, response): self.total_time = (time.time() - self._start_time) * 1000 - self._end_rusage = resource.getrusage(resource.RUSAGE_SELF) + if self.has_resource: + self._end_rusage = resource.getrusage(resource.RUSAGE_SELF) def title(self): - utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime - stime = self._end_rusage.ru_stime - self._start_rusage.ru_stime - return 'Time: %0.2fms, %0.2fms CPU' % (self.total_time, (utime + stime) * 1000.0) + if self.has_resource: + utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime + stime = self._end_rusage.ru_stime - self._start_rusage.ru_stime + return 'Time: %0.2fms, %0.2fms CPU' % (self.total_time, (utime + stime) * 1000.0) + else: + return 'Time: %0.2fms' % (self.total_time) def url(self): return '' -- cgit v1.2.3