jmeterの代わりにpythonで同じような事やってみた

apachejmeterというWEBサーバの負荷テストツールがあるんですが

結構クライアントのメモリを食べちゃいます。

なので変わりになるような簡易試験ツールをpythonで書いてみました。

[urltest.py]


#!/usr/bin/env python
#vim fileencoding:utf-8
import sys
import urllib2
import random
import hashlib
import yaml
from threading import Thread
from time import sleep, ctime

thread_count = 10

# context
class Context(object):
def setAttr(self, key, value): pass
def getAttr(self, key): pass
def delAttr(self, key): pass
# extend context
class AppContext(Context):
urls = []
limit = 0
def __init__(self):
settings = self.load()
self.urls = settings['hosts']
self.limit = settings['loop_count']
def load(self):
string = open("urltest.yaml").read()
string = string.decode("utf8")
return yaml.load(string)
def getLimit(self):
return self.limit

# controller
class AdChecker(Thread):
context = None
#
def __init__(self):
# load settings
self.context = AppContext()
# thread start
Thread.__init__(self)
self.start()
sys.stdout.write("[ " + self.getName() + " ] START.\n")
sys.stdout.flush()
# thread start
def run(self):
for i in xrange(self.context.getLimit()):
cd = hashlib.md5(str(random.randint(1,100)) + ctime()).hexdigest()
for url in self.context.urls:
http = urllib2.urlopen(url + cd)
if i % 30 == 0:
sleep(0.1)
sys.stdout.write("[ " + self.getName() + " ] END.\n")
sys.stdout.flush()

#
def main(*args):
try:
app = AdChecker()
return None
app.join()
except Exception, e:
print e
sys.exit(-1)

if __name__ == "__main__":
for i in xrange(thread_count):
main()

[urltest.yaml]


# リクエストを投げたいURLをここに指定して下さい
hosts:
- "http://xxx.xxx/test.php?cb="
- "http://xxx.xxx/test2.php?cd="
# ループ数
loop_count: 10

現状GETのみですがそのうちPOSTにも対応しないとですね。

後、thread_countはあんまり増やさない方がいいかもです。