[CalendarServer-changes] [9038] CalendarServer/trunk/contrib/performance/loadtest

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 12 01:11:10 PDT 2012


Revision: 9038
          http://trac.macosforge.org/projects/calendarserver/changeset/9038
Author:   dre at apple.com
Date:     2012-04-12 01:11:09 -0700 (Thu, 12 Apr 2012)
Log Message:
-----------
Add some stats to the sim report, also minor enhancements to webadmin

Modified Paths:
--------------
    CalendarServer/trunk/contrib/performance/loadtest/population.py
    CalendarServer/trunk/contrib/performance/loadtest/webadmin.py

Modified: CalendarServer/trunk/contrib/performance/loadtest/population.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/population.py	2012-04-12 00:05:58 UTC (rev 9037)
+++ CalendarServer/trunk/contrib/performance/loadtest/population.py	2012-04-12 08:11:09 UTC (rev 9038)
@@ -26,6 +26,7 @@
 from tempfile import mkdtemp
 from itertools import izip
 from datetime import datetime
+import os
 
 from twisted.internet.defer import DeferredList
 from twisted.python.failure import Failure
@@ -388,9 +389,9 @@
 
 
     def printMiscellaneous(self, output, items):
-        sortedItems = sorted(items.iterkeys(), key=len, reverse=True)
-        fmt = "%"+str(len(sortedItems[0]))+"s : %-30s\n"
-        for k in sortedItems:
+        maxColumnWidth = str(len(max(items.iterkeys(), key=len)))
+        fmt = "%"+maxColumnWidth+"s : %-s\n"
+        for k in sorted(items.iterkeys()):
             output.write(fmt % (k.title(), items[k],))
 
 
@@ -399,23 +400,26 @@
         output.write("** REPORT **\n")
         output.write("\n")
         runtime = datetime.now() - self._startTime
-        hours, remainder = divmod(runtime.seconds, 3600)
-        minutes, seconds = divmod(remainder, 60)
-        self.printMiscellaneous(output, {
+        cpu = os.times()
+        cpuUser = cpu[0] + cpu[2]
+        cpuSys = cpu[1] + cpu[3]
+        cpuTotal = cpuUser + cpuSys
+        runHours, remainder = divmod(runtime.seconds, 3600)
+        runMinutes, runSeconds = divmod(remainder, 60)
+        cpuHours, remainder = divmod(cpuTotal, 3600)
+        cpuMinutes, cpuSeconds = divmod(remainder, 60)
+        items = {
             'Users': self.countUsers(),
             'Clients': self.countClients(),
             'Start time': self._startTime.strftime('%m/%d %H:%M:%S'),
-            'Run time': "%02d:%02d:%02d" % (hours,minutes,seconds),
-        })
+            'Run time': "%02d:%02d:%02d" % (runHours,runMinutes,runSeconds),
+            'CPU Time': "user %-5.2f sys %-5.2f total %02d:%02d:%02d" % (cpuUser, cpuSys, cpuHours, cpuMinutes, cpuSeconds,)
+        }
         if self.countClientFailures() > 0:
-            self.printMiscellaneous(output, {
-                'Failed clients': self.countClientFailures(),
-            })
+            items['Failed clients'] = self.countClientFailures()
             for ctr, reason in enumerate(self._failed_clients, 1):
-                self.printMiscellaneous(output, {
-                    'Failure #%d' % (ctr,): reason,
-                })
-            
+                items['Failure #%d' % (ctr,)] = reason
+        self.printMiscellaneous(output, items)
         output.write("\n")
         self.printHeader(output, [
                 (label, width)

Modified: CalendarServer/trunk/contrib/performance/loadtest/webadmin.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/webadmin.py	2012-04-12 00:05:58 UTC (rev 9037)
+++ CalendarServer/trunk/contrib/performance/loadtest/webadmin.py	2012-04-12 08:11:09 UTC (rev 9038)
@@ -26,6 +26,7 @@
 import cStringIO as StringIO
 import uuid
 
+from time import clock
 from twisted.web import resource
 
 
@@ -35,62 +36,75 @@
     """
     isLeaf = True
 
-    BODY = """<html>
+    HEAD = """\
+<html>
+<head>
+<style type="text/css">
+body {color:#000000;}
+h1 h2 h3 {color:#333333;}
+td {text-align: center; padding: 5px;}
+pre.light {color:#CCCCCC; font-size:12px;}
+table.rounded-corners {
+    border: 1px solid #000000; background-color:#cccccc;
+    -moz-border-radius: 5px;
+    -webkit-border-radius: 5px;
+    -khtml-border-radius: 5px;
+    border-radius: 5px;
+}
+</style>
+</head>
 <body>
+    <h1>Load Simulator Web Admin</h1>
     <form method="POST">
         <input name="token" type="hidden" value="%s" />
-        <input name="results" type="submit" value="Results" />
-        <p />
-        <input name="stop" type="submit" value="Stop Sim" />
+        <table class="rounded-corners">
+        <tr><td><input name="results" type="submit" value="Refresh" /></td></tr>
+        <tr><td><input name="stop" type="submit" value="Stop Sim" /></td></tr>
+        </table>
     </form>
-</body>
-</html>
 """
 
-    BODY_RESULTS = """<html>
-<body>
-    <form method="POST">
-        <input name="token" type="hidden" value="%s" />
-        <input name="results" type="submit" value="Results" />
-        <p />
-        <input name="stop" type="submit" value="Stop Sim" />
-    </form>
-    <p />
-    <pre>%s</pre>
+    BODY = """\
 </body>
 </html>
 """
 
-    BODY_RESULTS_STOPPED = """<html>
-<body>
-    <h3>LoadSim Stopped - Final Results</h3>
-    <pre>%s</pre>
+    BODY_RESULTS = """\
+<pre>%s</pre><pre class="light">Generated in %.1f milliseconds</pre>
 </body>
 </html>
 """
 
+    BODY_RESULTS_STOPPED = "<h3>LoadSim Stopped - Final Results</h3>" + BODY_RESULTS
+
     def __init__(self, loadsim):
         self.loadsim = loadsim
         self.token = str(uuid.uuid4())
 
     def render_GET(self, request):
-        return self.BODY % (self.token,)
+        return self._renderReport()
 
     def render_POST(self, request):
+        html = self.HEAD + self.BODY
         if 'token' not in request.args or request.args['token'][0] != self.token:
-            return self.BODY % (self.token,)
+            return html % (self.token,)
 
         if 'stop' in request.args:
             self.loadsim.stop()
             return self._renderReport(True)
         elif 'results' in request.args:
             return self._renderReport()
-        return self.BODY % (self.token,)
+        return html % (self.token,)
 
     def _renderReport(self, stopped=False):
         report = StringIO.StringIO()
+        before = clock()
         self.loadsim.reporter.generateReport(report)
+        after = clock()
+        ms = (after - before) * 1000
         if stopped:
-            return self.BODY_RESULTS_STOPPED % (report.getvalue(),)
+            html = self.HEAD + self.BODY_RESULTS_STOPPED
+            return html % (None, report.getvalue(), ms)
         else:
-            return self.BODY_RESULTS % (self.token, report.getvalue(),)
+            html = self.HEAD + self.BODY_RESULTS
+            return html % (self.token, report.getvalue(), ms)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120412/e797dfa5/attachment.html>


More information about the calendarserver-changes mailing list