Author: chrisz
Date: Sun Mar 18 05:29:05 2007
New Revision: 6332
Added:
Webware/trunk/WebKit/Testing/ShowTime.rr
- copied, changed from r6328, /Webware/trunk/WebKit/Testing/Time.rr
Removed:
Webware/trunk/WebKit/Testing/Time.rr
Modified:
Webware/trunk/WebKit/Testing/CountVisits.rr
Webware/trunk/WebKit/Testing/ListBox.rr
Webware/trunk/WebKit/Testing/Welcome.rr
Webware/trunk/WebKit/Testing/stress.py
Log:
Cleanup and minor improvements in stress test.
Modified: Webware/trunk/WebKit/Testing/CountVisits.rr
==============================================================================
--- Webware/trunk/WebKit/Testing/CountVisits.rr (original)
+++ Webware/trunk/WebKit/Testing/CountVisits.rr Sun Mar 18 05:29:05 2007
@@ -1 +1 @@
-{'format': 'CGI', 'time': 958871602.895, 'environ': {'DOCUMENT_ROOT': '/home/httpd/html', 'SERVER_ADDR': '127.0.0.1', 'HTTP_ACCEPT_ENCODING': 'gzip', 'SERVER_PORT': '80', 'PATH_TRANSLATED': '/home/httpd/html/CountVisits', 'REMOTE_ADDR': '127.0.0.1', 'SERVER_SOFTWARE': 'Apache/1.3.9 (NetRevolution Advanced Extranet Server/Linux-Mandrake) PHP/3.0.13 mod_perl/1.21 mod_fastcgi/2.2.4', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT_LANGUAGE': 'en', 'REMOTE_PORT': '1045', 'SERVER_NAME': 'localhost.localdomain', 'HTTP_CONNECTION': 'Keep-Alive', 'HTTP_USER_AGENT': 'Mozilla/4.7 [en] (X11; I; Linux 2.2.14-15mdk i686)', 'HTTP_ACCEPT_CHARSET': 'iso-8859-1,*,utf-8', 'HTTP_ACCEPT': 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*', 'REQUEST_URI': '/~echuck/Projects/Webware/WebKit/WebKit.cgi/CountVisits', 'PATH': '/usr/local/bin:/usr/bin:/bin', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.0', 'PATH_INFO': '/CountVisits', 'HTTP_HOST': 'localhost.localdomain', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '/~echuck/Projects/Webware/WebKit/WebKit.cgi', 'SERVER_ADMIN': 'root@...', 'SCRIPT_FILENAME': '/home/echuck/public_html/Projects/Webware/WebKit/WebKit.cgi', 'HTTP_COOKIE': '_SID_=2000052021124570402', 'HTTP_REFERER': 'http://localhost.localdomain/~echuck/Projects/Webware/WebKit/WebKit.cgi/Time'}}
+{'format': 'CGI', 'time': 0, 'environ': {'DOCUMENT_ROOT': '.', 'SERVER_ADDR': '127.0.0.1', 'HTTP_ACCEPT_ENCODING': 'gzip', 'SERVER_PORT': '80', 'PATH_TRANSLATED': 'CountVisits', 'REMOTE_ADDR': '127.0.0.1', 'SERVER_SOFTWARE': 'Webware', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT_LANGUAGE': 'en', 'SERVER_NAME': 'localhost', 'HTTP_CONNECTION': 'Keep-Alive', 'HTTP_USER_AGENT': 'Mozilla', 'HTTP_ACCEPT_CHARSET': 'iso-8859-1', 'HTTP_ACCEPT': '*/*', 'REQUEST_URI': '../Adapters/WebKit.cgi/CountVisits', 'PATH': '', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.0', 'PATH_INFO': '/CountVisits', 'HTTP_HOST': 'localhost', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '../Adapters/WebKit.cgi', 'SERVER_ADMIN': 'root@...', 'SCRIPT_FILENAME': '../Adapters/WebKit.cgi'}}
Modified: Webware/trunk/WebKit/Testing/ListBox.rr
==============================================================================
--- Webware/trunk/WebKit/Testing/ListBox.rr (original)
+++ Webware/trunk/WebKit/Testing/ListBox.rr Sun Mar 18 05:29:05 2007
@@ -1 +1 @@
-{'format': 'CGI', 'time': 958871613.809, 'environ': {'DOCUMENT_ROOT': '/home/httpd/html', 'SERVER_ADDR': '127.0.0.1', 'HTTP_ACCEPT_ENCODING': 'gzip', 'SERVER_PORT': '80', 'PATH_TRANSLATED': '/home/httpd/html/ListBox', 'REMOTE_ADDR': '127.0.0.1', 'SERVER_SOFTWARE': 'Apache/1.3.9 (NetRevolution Advanced Extranet Server/Linux-Mandrake) PHP/3.0.13 mod_perl/1.21 mod_fastcgi/2.2.4', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT_LANGUAGE': 'en', 'REMOTE_PORT': '1055', 'SERVER_NAME': 'localhost.localdomain', 'HTTP_CONNECTION': 'Keep-Alive', 'HTTP_USER_AGENT': 'Mozilla/4.7 [en] (X11; I; Linux 2.2.14-15mdk i686)', 'HTTP_ACCEPT_CHARSET': 'iso-8859-1,*,utf-8', 'HTTP_ACCEPT': 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*', 'REQUEST_URI': '/~echuck/Projects/Webware/WebKit/WebKit.cgi/ListBox', 'PATH': '/usr/local/bin:/usr/bin:/bin', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.0', 'PATH_INFO': '/ListBox', 'HTTP_HOST': 'localhost.localdomain', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '/~echuck/Projects/Webware/WebKit/WebKit.cgi', 'SERVER_ADMIN': 'root@...', 'SCRIPT_FILENAME': '/home/echuck/public_html/Projects/Webware/WebKit/WebKit.cgi', 'HTTP_COOKIE': '_SID_=2000052021124570402', 'HTTP_REFERER': 'http://localhost.localdomain/~echuck/Projects/Webware/WebKit/WebKit.cgi/View'}}
+{'format': 'CGI', 'time': 0, 'environ': {'DOCUMENT_ROOT': '.', 'SERVER_ADDR': '127.0.0.1', 'HTTP_ACCEPT_ENCODING': 'gzip', 'SERVER_PORT': '80', 'PATH_TRANSLATED': 'ListBox', 'REMOTE_ADDR': '127.0.0.1', 'SERVER_SOFTWARE': 'Webware', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT_LANGUAGE': 'en', 'SERVER_NAME': 'localhost', 'HTTP_CONNECTION': 'Keep-Alive', 'HTTP_USER_AGENT': 'Mozilla', 'HTTP_ACCEPT_CHARSET': 'iso-8859-1', 'HTTP_ACCEPT': '*/*', 'REQUEST_URI': '../Adapters/ListBox', 'PATH': '', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.0', 'PATH_INFO': '/ListBox', 'HTTP_HOST': 'localhost', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '../Adapters/WebKit.cgi', 'SERVER_ADMIN': 'root@...', 'SCRIPT_FILENAME': '../Adapters/WebKit.cgi'}}
Copied: Webware/trunk/WebKit/Testing/ShowTime.rr (from r6328, /Webware/trunk/WebKit/Testing/Time.rr)
==============================================================================
--- /Webware/trunk/WebKit/Testing/Time.rr (original)
+++ Webware/trunk/WebKit/Testing/ShowTime.rr Sun Mar 18 05:29:05 2007
@@ -1 +1 @@
-{'format': 'CGI', 'time': 958871601.529, 'environ': {'DOCUMENT_ROOT': '/home/httpd/html', 'SERVER_ADDR': '127.0.0.1', 'HTTP_ACCEPT_ENCODING': 'gzip', 'SERVER_PORT': '80', 'PATH_TRANSLATED': '/home/httpd/html/Time', 'REMOTE_ADDR': '127.0.0.1', 'SERVER_SOFTWARE': 'Apache/1.3.9 (NetRevolution Advanced Extranet Server/Linux-Mandrake) PHP/3.0.13 mod_perl/1.21 mod_fastcgi/2.2.4', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT_LANGUAGE': 'en', 'REMOTE_PORT': '1043', 'SERVER_NAME': 'localhost.localdomain', 'HTTP_CONNECTION': 'Keep-Alive', 'HTTP_USER_AGENT': 'Mozilla/4.7 [en] (X11; I; Linux 2.2.14-15mdk i686)', 'HTTP_ACCEPT_CHARSET': 'iso-8859-1,*,utf-8', 'HTTP_ACCEPT': 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*', 'REQUEST_URI': '/~echuck/Projects/Webware/WebKit/WebKit.cgi/Time', 'PATH': '/usr/local/bin:/usr/bin:/bin', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.0', 'PATH_INFO': '/Time', 'HTTP_HOST': 'localhost.localdomain', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '/~echuck/Projects/Webware/WebKit/WebKit.cgi', 'SERVER_ADMIN': 'root@...', 'SCRIPT_FILENAME': '/home/echuck/public_html/Projects/Webware/WebKit/WebKit.cgi', 'HTTP_COOKIE': '_SID_=2000052021124570402', 'HTTP_REFERER': 'http://localhost.localdomain/~echuck/Projects/Webware/WebKit/WebKit.cgi/Welcome'}}
+{'format': 'CGI', 'time': 0, 'environ': {'DOCUMENT_ROOT': '.', 'SERVER_ADDR': '127.0.0.1', 'HTTP_ACCEPT_ENCODING': 'gzip', 'SERVER_PORT': '80', 'PATH_TRANSLATED': 'ShowTime', 'REMOTE_ADDR': '127.0.0.1', 'SERVER_SOFTWARE': 'Webware', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT_LANGUAGE': 'en', 'SERVER_NAME': 'localhost', 'HTTP_CONNECTION': 'Keep-Alive', 'HTTP_USER_AGENT': 'Mozilla', 'HTTP_ACCEPT_CHARSET': 'iso-8859-1', 'HTTP_ACCEPT': '*/*', 'REQUEST_URI': '../Adapters/WebKit.cgi/ShowTime', 'PATH': '', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.0', 'PATH_INFO': '/ShowTime', 'HTTP_HOST': 'localhost', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '../Adapters/WebKit.cgi', 'SERVER_ADMIN': 'root@...', 'SCRIPT_FILENAME': '../Adapters/WebKit.cgi'}}
Modified: Webware/trunk/WebKit/Testing/Welcome.rr
==============================================================================
--- Webware/trunk/WebKit/Testing/Welcome.rr (original)
+++ Webware/trunk/WebKit/Testing/Welcome.rr Sun Mar 18 05:29:05 2007
@@ -1 +1 @@
-{'format': 'CGI', 'time': 958871565.572, 'environ': {'DOCUMENT_ROOT': '/home/httpd/html', 'SERVER_ADDR': '127.0.0.1', 'HTTP_ACCEPT_ENCODING': 'gzip', 'SERVER_PORT': '80', 'PATH_TRANSLATED': '/home/httpd/html/Welcome', 'REMOTE_ADDR': '127.0.0.1', 'SERVER_SOFTWARE': 'Apache/1.3.9 (NetRevolution Advanced Extranet Server/Linux-Mandrake) PHP/3.0.13 mod_perl/1.21 mod_fastcgi/2.2.4', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT_LANGUAGE': 'en', 'REMOTE_PORT': '1041', 'SERVER_NAME': 'localhost.localdomain', 'HTTP_CONNECTION': 'Keep-Alive', 'HTTP_USER_AGENT': 'Mozilla/4.7 [en] (X11; I; Linux 2.2.14-15mdk i686)', 'HTTP_ACCEPT_CHARSET': 'iso-8859-1,*,utf-8', 'HTTP_ACCEPT': 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*', 'REQUEST_URI': '/~echuck/Projects/Webware/WebKit/WebKit.cgi/Welcome', 'PATH': '/usr/local/bin:/usr/bin:/bin', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.0', 'PATH_INFO': '/Welcome', 'HTTP_HOST': 'localhost.localdomain', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '/~echuck/Projects/Webware/WebKit/WebKit.cgi', 'SERVER_ADMIN': 'root@...', 'SCRIPT_FILENAME': '/home/echuck/public_html/Projects/Webware/WebKit/WebKit.cgi', 'HTTP_REFERER': 'http://localhost.localdomain/~echuck/', 'HTTP_PRAGMA': 'no-cache'}}
+{'format': 'CGI', 'time': 0, 'environ': {'DOCUMENT_ROOT': '.', 'SERVER_ADDR': '127.0.0.1', 'HTTP_ACCEPT_ENCODING': 'gzip', 'SERVER_PORT': '80', 'PATH_TRANSLATED': 'Welcome', 'REMOTE_ADDR': '127.0.0.1', 'SERVER_SOFTWARE': 'Webware', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT_LANGUAGE': 'en', 'SERVER_NAME': 'localhost', 'HTTP_CONNECTION': 'Keep-Alive', 'HTTP_USER_AGENT': 'Mozilla', 'HTTP_ACCEPT_CHARSET': 'iso-8859-1', 'HTTP_ACCEPT': '*/*', 'REQUEST_URI': '../Adapters/WebKit.cgi/Welcome', 'PATH': '', 'QUERY_STRING': '', 'SERVER_PROTOCOL': 'HTTP/1.0', 'PATH_INFO': '/Welcome', 'HTTP_HOST': 'localhost', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '../Adapters/WebKit.cgi', 'SERVER_ADMIN': 'root@...', 'SCRIPT_FILENAME': '../Adapters/WebKit.cgi', 'HTTP_PRAGMA': 'no-cache'}}
Modified: Webware/trunk/WebKit/Testing/stress.py
==============================================================================
--- Webware/trunk/WebKit/Testing/stress.py (original)
+++ Webware/trunk/WebKit/Testing/stress.py Sun Mar 18 05:29:05 2007
@@ -1,6 +1,6 @@
#!/usr/bin/env python
-"""
-stress.py
+"""stress.py
+
By Chuck Esterbrook
Mods by Jay Love
@@ -9,13 +9,13 @@
* Test concurrency
* Investigate performance
-This stress test skips the web server and the WebKit adaptor, so it's not
+This stress test skips the web server and the WebKit adapter, so it's not
useful for measuring absolute performance. However, after making a
modification to WebKit or your web-based application, it can be useful to
see the relative difference in performance (although still somewhat
unrealistic).
-To Run:
+To run:
> stress.py -OR-
> python stress.py
@@ -31,14 +31,13 @@
Caveat: HTTP cookies are blown away from the raw requests. Mostly due to
the fact that they will contain stale session ids.
+
"""
-import sys, os, time
+import sys, os, time, socket
from glob import glob
-from socket import *
from marshal import dumps
-from thread import start_new_thread
from random import randint
from time import asctime, localtime, time, sleep
from threading import Thread
@@ -60,17 +59,19 @@
def request(names, dicts, host, port, count, delay=0, slowconn=0):
- """
- Performs a single AppServer request including sending the request and receiving the response.
+ """Perform a single AppServer request.
+
+ This includes sending the request and receiving the response.
slowconn simulates a slowed connection from the client.
+
"""
complete = 0
filecount = len(names)
totalbytes = 0
while complete < count:
i = randint(0, filecount-1)
- # Taken from CGIAdaptor:
- s = socket(AF_INET, SOCK_STREAM)
+ # taken from CGIAdapter:
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
data = dumps(dicts[i])
s.send(dumps(len(data)))
@@ -78,87 +79,89 @@
if delay and slowconn:
sleep(delay)
s.shutdown(1)
- data = ''
+ data = []
while 1:
newdata = s.recv(8192)
if not newdata:
break
else:
- data = data+newdata
- #sys.stdout.write(data)
- # END
- if data.count('Session Expired'):
- raise Exception, 'Session expired.'
+ data.append(newdata)
+ data = ''.join(data)
+ # process response
+ # sys.stdout.write(data)
+ if not data.startswith('Status: 200 OK'):
+ status = data.split('\n', 1)[0]
+ status = dicts[i]['environ']['PATH_INFO'] + ' ' + status
+ raise Exception, status
if delay:
sleep(delay)
- complete = complete +1
- totalbytes = totalbytes+len(data)
+ complete += 1
+ totalbytes += len(data)
-def stress(maxRequests, minParallelRequests=1, maxParallelRequests=1, delay=0.0, slowconn=0):
- """ Executes a stress test on the AppServer according to the arguments. """
- # Taken from CGIAdaptor:
- (host, port) = open('../address.text').read().split(':')
- if os.name == 'nt' and host == '': # MS Windows doesn't like a blank host name
+def stress(maxRequests,
+ minParallelRequests=1, maxParallelRequests=1, delay=0.0, slowconn=0):
+ """Execute stress test on the AppServer according to the arguments."""
+ # taken from CGIAdapter:
+ host, port = open('../address.text').read().split(':')
+ if os.name == 'nt' and host == '':
+ # MS Windows doesn't like a blank host name
host = 'localhost'
port = int(port)
bufsize = 32*1024
- # END
-
- # Get the requests from .rr files which are expected to contain raw request dictionaries
+ # get the requests from .rr files
+ # which are expected to contain raw request dictionaries
requestFilenames = glob('*.rr')
- requestDicts = map(lambda filename: eval(open(filename).read()), requestFilenames)
- # Kill the HTTP cookies, which typically have an invalid session id
- # from when the raw requests were captured.
+ requestDicts = map(lambda filename:
+ eval(open(filename).read()), requestFilenames)
+ # kill the HTTP cookies (which typically have an invalid session id)
+ # from when the raw requests were captured
for dict in requestDicts:
environ = dict['environ']
if environ.has_key('HTTP_COOKIE'):
del environ['HTTP_COOKIE']
requestCount = len(requestFilenames)
- count = 0
-
- if maxParallelRequests<minParallelRequests:
+ if maxParallelRequests < minParallelRequests:
maxParallelRequests = minParallelRequests
- sequential = minParallelRequests==1 and maxParallelRequests==1
-
+ sequential = minParallelRequests == 1 and maxParallelRequests == 1
startTime = time()
count = 0
print 'STRESS TEST for Webware.WebKit.AppServer'
print
- print 'time =', asctime(localtime(time()))
+ print 'time =', asctime(localtime(startTime))
print 'requestFilenames =', requestFilenames
print 'maxRequests =', maxRequests
print 'minParallelRequests =', minParallelRequests
print 'maxParallelRequests =', maxParallelRequests
- print 'delay = %0.02f' % delay
+ print 'delay = %g' % delay
print 'sequential =', sequential
print 'Running...'
-
-
threads = []
for i in range(maxParallelRequests):
num = randint(minParallelRequests, maxParallelRequests)
num = maxRequests/num
- thread = Thread(target=request, args=(requestFilenames, requestDicts, host, port, num, delay, slowconn))
+ thread = Thread(target=request, args=(
+ requestFilenames, requestDicts, host, port, num, delay, slowconn))
thread.start()
threads.append(thread)
- count = count + num
- # Wait till all threads are finished
+ count += num
+ # wait till all threads are finished
for thread in threads:
thread.join()
threads = None
- duration = time()-startTime
+ duration = time() - startTime
print 'count = %d' % count
- print 'duration = %0.2f' % duration
- print 'secs/page = %0.2f' % (duration/count)
- print 'pages/sec = %0.2f' % (count/duration)
+ print 'duration = %g' % duration
+ print 'secs/page = %g' % (duration/count)
+ if duration:
+ print 'pages/sec = %g' % (count/duration)
print 'Done.'
print
if __name__=='__main__':
- if len(sys.argv)==1:
+ if len(sys.argv) == 1:
usage()
else:
- args = map(lambda arg: eval(arg), sys.argv[1:])
- apply(stress, args)
+ args = map(eval, sys.argv[1:])
+ stress(*args)
|