From f969c5f80e46d7ec2bc4b7da3b88c96722ca1889 Mon Sep 17 00:00:00 2001 From: Zooko O'Whielacronx Date: Sat, 12 Jul 2008 15:37:27 -0700 Subject: [PATCH] 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 --- misc/simulate_load.py | 50 +++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/misc/simulate_load.py b/misc/simulate_load.py index 6c03b244..364e906d 100644 --- a/misc/simulate_load.py +++ b/misc/simulate_load.py @@ -20,8 +20,6 @@ SERVERS = 40 K = 3 N = 10 -MAXSHARESIZE = 2**34 / K - def go(permutedpeerlist): servers = [ Server() for x in range(SERVERS) ] servers.sort(cmp=lambda x,y: cmp(x.si, y.si)) @@ -29,7 +27,7 @@ def go(permutedpeerlist): tick = 0 fullservers = 0 while True: - nextsharesize = random.randrange(40, MAXSHARESIZE) + nextsharesize = (2 ** random.randrange(8, 31)) / K if permutedpeerlist: random.shuffle(servers) else: @@ -56,20 +54,43 @@ def go(permutedpeerlist): 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): - # the i'th element of the filledat list is how many servers got full on the tick numbered 4500 + i * 9 - filledat = [0] * 77 + # The i'th element of the filledat list is how many servers got full when the i'th file was uploaded. + filledat = [] for test in range(iters): servers = go(permutedpeerlist) for server in servers: - fidx = (server.full_at_tick - 4500) / 9 - if fidx >= len(filledat): - filledat.extend([0]*(fidx-len(filledat)+1)) + fidx = server.full_at_tick + filledat.extend([0]*(fidx-len(filledat)+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) - fullat = [0] * 77 - for idx, num in enumerate(filledat): + startfiles = 0 + while filledat[startfiles] == 0: + 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)): fullat[fidx] += num @@ -79,7 +100,7 @@ def test(permutedpeerlist, iters): # Now print it out as an ascii art graph. import sys for serversfull in range(40, 0, -1): - sys.stdout.write("%2d" % serversfull) + sys.stdout.write("%2d " % serversfull) for numfull in fullat: if int(numfull) == serversfull: sys.stdout.write("*") @@ -90,8 +111,9 @@ def test(permutedpeerlist, iters): sys.stdout.write(" ^-- servers full\n") idx = 0 while idx < len(fullat): - sys.stdout.write("%d--^ " % (4500 + idx * 9)) - idx += 8 + nextmark = "%d--^ " % (startfiles + idx * filespercolumn) + sys.stdout.write(nextmark) + idx += len(nextmark) sys.stdout.write("\nfiles uploaded --> \n") -- 2.45.2