from multiprocessing import Process, Queue
|
|
import random
|
|
import time
|
|
|
|
import pymemcache.client
|
|
|
|
|
|
def get_next(num):
|
|
numbers = range(num)
|
|
while True:
|
|
yield random.choice(numbers)
|
|
|
|
|
|
def test(results, calls=1000, keys=100):
|
|
mc = pymemcache.client.Client(("127.0.0.1", 7000))
|
|
|
|
elapsed = 0
|
|
total = 0
|
|
numbers = get_next(keys)
|
|
hits = 0
|
|
miss = 0
|
|
for _ in range(calls):
|
|
num = numbers.next()
|
|
key = "%s" % num
|
|
start = time.time()
|
|
result = mc.get(key)
|
|
end = time.time()
|
|
if not result:
|
|
miss += 1
|
|
else:
|
|
hits += 1
|
|
elapsed += end - start
|
|
total += 1
|
|
|
|
results.put((total, hits, miss))
|
|
|
|
|
|
requests_per_process = 100000
|
|
possible_urls = 5000
|
|
workers = 10
|
|
procs = []
|
|
results = Queue()
|
|
start = time.time()
|
|
|
|
print "Starting %s Workers" % workers
|
|
for _ in range(workers):
|
|
p = Process(target=test, args=(results, requests_per_process, possible_urls))
|
|
p.start()
|
|
procs.append(p)
|
|
|
|
for p in procs:
|
|
p.join()
|
|
end = time.time()
|
|
|
|
elapsed = end - start
|
|
total = 0
|
|
hits = 0
|
|
miss = 0
|
|
while not results.empty():
|
|
one_total, one_hits, one_miss = results.get()
|
|
total += one_total
|
|
hits += one_hits
|
|
miss += one_miss
|
|
|
|
print "=" * 30
|
|
print "Num Workers:\t\t%s" % workers
|
|
print "Expected Requests:\t%s" % (requests_per_process * workers)
|
|
print "Actual Request:\t\t%s" % total
|
|
print "Elapsed Time (sec):\t%2.4f" % elapsed
|
|
print "Total Reqs/Sec:\t\t%.4f" % (total / elapsed)
|
|
print "Req/Sec Per Worker:\t%.4f" % ((total / elapsed) / workers)
|
|
print "Hits:\t\t\t%s" % hits
|
|
print "Misses:\t\t\t%s" % miss
|
|
print "Hit Ratio:\t\t%2.4f" % (float(hits) / float(total))
|
|
print "=" * 30
|