[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