misc/simulate_load.py: use a more realistic distribution of file sizes, and automate the formatting of the ascii art so that it fits in 70 columns and the number of files uploaded is properly marked

This commit is contained in:
Zooko O'Whielacronx 2008-07-12 15:37:27 -07:00
parent b483c4710d
commit f969c5f80e

View File

@ -20,8 +20,6 @@ SERVERS = 40
K = 3 K = 3
N = 10 N = 10
MAXSHARESIZE = 2**34 / K
def go(permutedpeerlist): def go(permutedpeerlist):
servers = [ Server() for x in range(SERVERS) ] servers = [ Server() for x in range(SERVERS) ]
servers.sort(cmp=lambda x,y: cmp(x.si, y.si)) servers.sort(cmp=lambda x,y: cmp(x.si, y.si))
@ -29,7 +27,7 @@ def go(permutedpeerlist):
tick = 0 tick = 0
fullservers = 0 fullservers = 0
while True: while True:
nextsharesize = random.randrange(40, MAXSHARESIZE) nextsharesize = (2 ** random.randrange(8, 31)) / K
if permutedpeerlist: if permutedpeerlist:
random.shuffle(servers) random.shuffle(servers)
else: else:
@ -56,20 +54,43 @@ def go(permutedpeerlist):
tick += 1 tick += 1
def div_ceil(n, d):
"""
The smallest integer k such that k*d >= n.
"""
return (n/d) + (n%d != 0)
DESIRED_COLUMNS = 70
def test(permutedpeerlist, iters): def test(permutedpeerlist, iters):
# the i'th element of the filledat list is how many servers got full on the tick numbered 4500 + i * 9 # The i'th element of the filledat list is how many servers got full when the i'th file was uploaded.
filledat = [0] * 77 filledat = []
for test in range(iters): for test in range(iters):
servers = go(permutedpeerlist) servers = go(permutedpeerlist)
for server in servers: for server in servers:
fidx = (server.full_at_tick - 4500) / 9 fidx = server.full_at_tick
if fidx >= len(filledat):
filledat.extend([0]*(fidx-len(filledat)+1)) filledat.extend([0]*(fidx-len(filledat)+1))
filledat[fidx] += 1 filledat[fidx] += 1
# the i'th element of the fullat list is how many servers were full by the tick numbered 4500 + i * 9 (on average) startfiles = 0
fullat = [0] * 77 while filledat[startfiles] == 0:
for idx, num in enumerate(filledat): startfiles += 1
filespercolumn = div_ceil(len(filledat) - startfiles, (DESIRED_COLUMNS - 3))
# The i'th element of the compressedfilledat list is how many servers got full when the filespercolumn files starting at startfiles + i were uploaded.
compressedfilledat = []
idx = startfiles
while idx < len(filledat):
compressedfilledat.append(0)
for i in range(filespercolumn):
compressedfilledat[-1] += filledat[idx]
idx += 1
if idx >= len(filledat):
break
# The i'th element of the fullat list is how many servers were full by the tick numbered startfiles + i * filespercolumn (on average).
fullat = [0] * len(compressedfilledat)
for idx, num in enumerate(compressedfilledat):
for fidx in range(idx, len(fullat)): for fidx in range(idx, len(fullat)):
fullat[fidx] += num fullat[fidx] += num
@ -90,8 +111,9 @@ def test(permutedpeerlist, iters):
sys.stdout.write(" ^-- servers full\n") sys.stdout.write(" ^-- servers full\n")
idx = 0 idx = 0
while idx < len(fullat): while idx < len(fullat):
sys.stdout.write("%d--^ " % (4500 + idx * 9)) nextmark = "%d--^ " % (startfiles + idx * filespercolumn)
idx += 8 sys.stdout.write(nextmark)
idx += len(nextmark)
sys.stdout.write("\nfiles uploaded --> \n") sys.stdout.write("\nfiles uploaded --> \n")