|
@@ -17,13 +17,21 @@ import sys
|
|
import math
|
|
import math
|
|
from gen_manifest import generate_manifest
|
|
from gen_manifest import generate_manifest
|
|
from gen_enclave_config import generate_config
|
|
from gen_enclave_config import generate_config
|
|
|
|
+from logs_to_csv import parse_output_logs
|
|
|
|
|
|
###############################################################################
|
|
###############################################################################
|
|
|
|
|
|
# CONFIGS TO SET:
|
|
# CONFIGS TO SET:
|
|
|
|
|
|
MANIFEST_FILE = "App/manifest.yaml"
|
|
MANIFEST_FILE = "App/manifest.yaml"
|
|
-LOG_FOLDER = "Experiments_test/"
|
|
|
|
|
|
+LOG_FOLDER = "Test_diagnostic1/"
|
|
|
|
+
|
|
|
|
+NUM_EPOCHS = 5
|
|
|
|
+PRIVATE_ROUTE = True
|
|
|
|
+PRIV_OUT = 1
|
|
|
|
+PRIV_IN = 1
|
|
|
|
+PUB_OUT = 1
|
|
|
|
+PUB_IN = 1
|
|
|
|
|
|
# N = number of clients
|
|
# N = number of clients
|
|
# M = number of servers
|
|
# M = number of servers
|
|
@@ -35,9 +43,9 @@ LOG_FOLDER = "Experiments_test/"
|
|
# T = [16, 8, 4, 2, 1]
|
|
# T = [16, 8, 4, 2, 1]
|
|
|
|
|
|
## Figure 7
|
|
## Figure 7
|
|
-N = [1<<15, 1<<16, 1<<17, 1<<18, 1<<19, 1<<20]
|
|
|
|
|
|
+N = [1<<17]
|
|
M = [4]
|
|
M = [4]
|
|
-T = [1]
|
|
|
|
|
|
+T = [4]
|
|
|
|
|
|
## Figure 8
|
|
## Figure 8
|
|
# N = [1<<20]
|
|
# N = [1<<20]
|
|
@@ -56,27 +64,25 @@ M_MAX = {
|
|
|
|
|
|
# B = message size (bytes)
|
|
# B = message size (bytes)
|
|
B = 256
|
|
B = 256
|
|
|
|
+NUM_DIAGNOSTIC_EPOCHS = 4
|
|
|
|
|
|
###############################################################################
|
|
###############################################################################
|
|
|
|
|
|
-def epoch_time(n, m, t, b):
|
|
|
|
- # Base epoch time is 15 sec
|
|
|
|
- etime_base = 15
|
|
|
|
|
|
+def epoch_time_estimate(n, m, t, b):
|
|
|
|
+ # Base epoch time is 5 sec
|
|
|
|
+ etime_base = 5
|
|
clients_per_server = math.ceil(n/m)
|
|
clients_per_server = math.ceil(n/m)
|
|
- # Using 1 sec for ~50K clients in compute time
|
|
|
|
# Using 8 sec for 2^20 clients in route_compute time as the base for calculations below
|
|
# Using 8 sec for 2^20 clients in route_compute time as the base for calculations below
|
|
- # (About 1 sec actual route, 6.5 sec for storage generate_tokens
|
|
|
|
- # and process_msgs)
|
|
|
|
etime_route_compute = 0.8 * math.ceil(clients_per_server/100000)
|
|
etime_route_compute = 0.8 * math.ceil(clients_per_server/100000)
|
|
- etime_precompute = 1.5 * math.ceil(clients_per_server/100000)
|
|
|
|
|
|
+ etime_precompute = 1 * math.ceil(clients_per_server/100000)
|
|
|
|
|
|
# Costs for Waksman network precompute
|
|
# Costs for Waksman network precompute
|
|
- # Public routing needs 5 WN, private routing needs 3 WNs
|
|
|
|
|
|
+ # Public routing needs 7 WN, private routing needs 3 WNs
|
|
etime_precompute *=5
|
|
etime_precompute *=5
|
|
|
|
|
|
# Client time:
|
|
# Client time:
|
|
# Takes about 30 sec for handling 2^20 clients
|
|
# Takes about 30 sec for handling 2^20 clients
|
|
- etime_client = math.ceil(clients_per_server/100000) * 5
|
|
|
|
|
|
+ etime_client = 3 * math.ceil(clients_per_server/100000)
|
|
|
|
|
|
etime = etime_base + etime_precompute + etime_route_compute + etime_client
|
|
etime = etime_base + etime_precompute + etime_route_compute + etime_client
|
|
return int(etime)
|
|
return int(etime)
|
|
@@ -87,6 +93,10 @@ if __name__ == "__main__":
|
|
if not os.path.exists(LOG_FOLDER):
|
|
if not os.path.exists(LOG_FOLDER):
|
|
os.mkdir(LOG_FOLDER)
|
|
os.mkdir(LOG_FOLDER)
|
|
|
|
|
|
|
|
+ DIAGNOSTIC_FOLDER = LOG_FOLDER + "diagnostic/"
|
|
|
|
+ if not os.path.exists(DIAGNOSTIC_FOLDER):
|
|
|
|
+ os.mkdir(DIAGNOSTIC_FOLDER)
|
|
|
|
+
|
|
for t in T:
|
|
for t in T:
|
|
b = B
|
|
b = B
|
|
m_start = 1
|
|
m_start = 1
|
|
@@ -95,52 +105,88 @@ if __name__ == "__main__":
|
|
for m in M:
|
|
for m in M:
|
|
if(m <= m_end):
|
|
if(m <= m_end):
|
|
for n in N:
|
|
for n in N:
|
|
- print("\n\n Running Experiment t = %d, m = %d, n = %d \n\n" % (t, m, n))
|
|
|
|
- generate_manifest(n, m, t, b)
|
|
|
|
- generate_config(n, m, t, b)
|
|
|
|
- epoch_interval = epoch_time(n, m, t, b)
|
|
|
|
- print("Epoch_interval = %d" % epoch_interval)
|
|
|
|
-
|
|
|
|
- log_subfolder = str(n) + "_" + str(m) + "_" + str(t) + "_" + str(b) + "/"
|
|
|
|
- log_subfolder = LOG_FOLDER + log_subfolder
|
|
|
|
- if not os.path.exists(log_subfolder):
|
|
|
|
- os.mkdir(log_subfolder)
|
|
|
|
- # Since launch is invoked from App/ ; we add a ../ to subfolder before
|
|
|
|
- # passing it to slaunch
|
|
|
|
- log_subfolder = "../" + log_subfolder
|
|
|
|
-
|
|
|
|
- slaunch = []
|
|
|
|
- slaunch.append("./launch")
|
|
|
|
- slaunch.append("route_clients")
|
|
|
|
- slaunch.append("-l")
|
|
|
|
- slaunch.append(log_subfolder)
|
|
|
|
- slaunch.append("-n")
|
|
|
|
- nodes_to_include = ["-n"]
|
|
|
|
- for i in range(1, m+1):
|
|
|
|
- nodes_to_include.append("s"+str(i))
|
|
|
|
- slaunch.append("s"+str(i))
|
|
|
|
- slaunch.append("-e")
|
|
|
|
- slaunch.append(str(epoch_interval))
|
|
|
|
-
|
|
|
|
- os.chdir("./App")
|
|
|
|
- # Server outputs are captured by log files provided to each of the server
|
|
|
|
- # launch calls made by App/launch
|
|
|
|
- make = subprocess.call(["make", "-C", "..", "-j"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
|
|
- try:
|
|
|
|
- os.mkdir("keys")
|
|
|
|
- except:
|
|
|
|
- # It's OK if it already exists
|
|
|
|
- pass
|
|
|
|
- pubkeys = subprocess.call(["./getpubkeys"])
|
|
|
|
- server_process = subprocess.run(slaunch)
|
|
|
|
-
|
|
|
|
- claunch = []
|
|
|
|
- claunch.append("./clientlaunch")
|
|
|
|
- claunch.append("-t")
|
|
|
|
- claunch.append("8")
|
|
|
|
- claunch.append("-l")
|
|
|
|
- claunch.append(log_subfolder+"clients.log")
|
|
|
|
- os.chdir("./../Client/")
|
|
|
|
- client_process = subprocess.call(claunch)
|
|
|
|
-
|
|
|
|
- os.chdir("./../")
|
|
|
|
|
|
+ for run in ["diagnostic", "experiment"]:
|
|
|
|
+ num_WN_to_precompute = 0
|
|
|
|
+
|
|
|
|
+ # Make the correct output folder for diagnostic/experiment
|
|
|
|
+ experiment_name = str(n) + "_" + str(m) + "_" + str(t) + "_" + str(b) + "/"
|
|
|
|
+ if(run == "diagnostic"):
|
|
|
|
+ log_subfolder = DIAGNOSTIC_FOLDER
|
|
|
|
+ elif(run == "experiment"):
|
|
|
|
+ log_subfolder = LOG_FOLDER
|
|
|
|
+ log_subfolder = log_subfolder + experiment_name
|
|
|
|
+ if not os.path.exists(log_subfolder):
|
|
|
|
+ os.mkdir(log_subfolder)
|
|
|
|
+
|
|
|
|
+ if(run == "diagnostic"):
|
|
|
|
+ print("\n\n Running DIAGNOSTIC t = %d, m = %d, n = %d \n\n" % (t, m, n))
|
|
|
|
+ # Manifest generated by diagnostic can be reused by the actual experiment
|
|
|
|
+ generate_manifest(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
|
|
|
|
+ generate_config(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
|
|
|
|
+ epoch_param = epoch_time_estimate(n, m, t, b)
|
|
|
|
+ elif(run == "experiment"):
|
|
|
|
+ num_sizes, pwn_max, epoch_max, scm_max = parse_output_logs(DIAGNOSTIC_FOLDER, experiment_name)
|
|
|
|
+ print("From logs_to_csv: num_sizes = %d, pwn_max = %f, epoch_max = %f, scm_max = %f"
|
|
|
|
+ % (num_sizes, pwn_max, epoch_max, scm_max))
|
|
|
|
+ print("\n\n Running EXPERIMENT t = %d, m = %d, n = %d \n\n" % (t, m, n))
|
|
|
|
+ num_WN_to_precompute = math.ceil((num_sizes * pwn_max)/epoch_max)
|
|
|
|
+ print("num_WN_to_precompute = %d" %(num_WN_to_precompute))
|
|
|
|
+ if(num_WN_to_precompute < 2 * num_sizes):
|
|
|
|
+ num_WN_to_precompute = 2 * num_sizes
|
|
|
|
+ print("num_WN_to_precompute (pushed up to min 2 sets) = %d" %(num_WN_to_precompute))
|
|
|
|
+ epoch_param = epoch_max + 2 * scm_max
|
|
|
|
+ generate_config(n, m, t, b, PRIVATE_ROUTE, PRIV_IN, PUB_OUT, PUB_IN, num_WN_to_precompute)
|
|
|
|
+
|
|
|
|
+ # Either estimate from epoch_time_estimate for diagnostic
|
|
|
|
+ # or the one we got from diagnostic run
|
|
|
|
+ epoch_duration = math.ceil(epoch_param)
|
|
|
|
+ print("Epoch_duration = %d" % epoch_duration)
|
|
|
|
+
|
|
|
|
+ # Since launch is invoked from App/ ; we add a ../ to subfolder before
|
|
|
|
+ # passing it to slaunch
|
|
|
|
+ log_subfolder = "../" + log_subfolder
|
|
|
|
+
|
|
|
|
+ slaunch = []
|
|
|
|
+ slaunch.append("./launch")
|
|
|
|
+ slaunch.append("route_clients")
|
|
|
|
+ slaunch.append("-l")
|
|
|
|
+ slaunch.append(log_subfolder)
|
|
|
|
+ slaunch.append("-n")
|
|
|
|
+ nodes_to_include = ["-n"]
|
|
|
|
+ for i in range(1, m+1):
|
|
|
|
+ nodes_to_include.append("s"+str(i))
|
|
|
|
+ slaunch.append("s"+str(i))
|
|
|
|
+ slaunch.append("-d")
|
|
|
|
+ slaunch.append(str(epoch_duration))
|
|
|
|
+ slaunch.append("-e")
|
|
|
|
+ if(run == "experiment"):
|
|
|
|
+ slaunch.append(str(NUM_EPOCHS))
|
|
|
|
+ else:
|
|
|
|
+ slaunch.append(str(NUM_DIAGNOSTIC_EPOCHS))
|
|
|
|
+ if(run == "experiment"):
|
|
|
|
+ slaunch.append("-w")
|
|
|
|
+ slaunch.append(str(num_WN_to_precompute))
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ os.chdir("./App")
|
|
|
|
+ # Server outputs are captured by log files provided to each of the server
|
|
|
|
+ # launch calls made by App/launch
|
|
|
|
+ make = subprocess.call(["make", "-C", "..", "-j"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
|
|
+ try:
|
|
|
|
+ os.mkdir("keys")
|
|
|
|
+ except:
|
|
|
|
+ # It's OK if it already exists
|
|
|
|
+ pass
|
|
|
|
+ pubkeys = subprocess.call(["./getpubkeys"])
|
|
|
|
+ server_process = subprocess.run(slaunch)
|
|
|
|
+
|
|
|
|
+ claunch = []
|
|
|
|
+ claunch.append("./clientlaunch")
|
|
|
|
+ claunch.append("-t")
|
|
|
|
+ claunch.append("8")
|
|
|
|
+ claunch.append("-l")
|
|
|
|
+ claunch.append(log_subfolder+"clients.log")
|
|
|
|
+ os.chdir("./../Client/")
|
|
|
|
+ client_process = subprocess.call(claunch)
|
|
|
|
+
|
|
|
|
+ os.chdir("./../")
|