run_experiments.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #!/usr/bin/python3
  2. '''
  3. NOTE: This script is tailored for a machine with 2 40-core processors.
  4. Currently assumes 8 threads (C36-39,76-79) are set aside for client
  5. simulator; change this by setting "prefix" in Client/clientlaunch and
  6. the -t option to clientlaunch below.
  7. Similarly, the use of cores C0-35,40-75 for the TEEMS servers can be
  8. changed in the gen_manifest.py program.
  9. If you have a different number of cores available for servers, also
  10. change M_MAX below.
  11. '''
  12. import subprocess
  13. import os
  14. import sys
  15. import math
  16. import time
  17. from gen_manifest import generate_manifest
  18. from gen_enclave_config import generate_config
  19. from logs_to_csv import parse_output_logs
  20. ###############################################################################
  21. # CONFIGS TO SET:
  22. # NUM_DIAGNOSTIC_EPOCHS = 4
  23. ###############################################################################
  24. def epoch_time_estimate(n, m, t, b):
  25. # Base epoch time is 5 sec
  26. etime_base = 5
  27. clients_per_server = math.ceil(n/m)
  28. # Using 8 sec for 2^20 clients in route_compute time as the base for calculations below
  29. etime_route_compute = 0.8 * math.ceil(clients_per_server/100000)
  30. etime_precompute = 1 * math.ceil(clients_per_server/100000)
  31. # Costs for Waksman network precompute
  32. # Public routing needs 7 WN, private routing needs 3 WNs
  33. etime_precompute *=5
  34. # Client time:
  35. # Takes about 30 sec for handling 2^20 clients
  36. etime_client = 3 * math.ceil(clients_per_server/50000)
  37. if(m==2 or m==3):
  38. etime_client += 60
  39. etime = etime_base + etime_precompute + etime_route_compute + etime_client
  40. return int(etime)
  41. def run_exp(LOG_FOLDER, PRIVATE_ROUTE, NUM_EPOCHS, N, M, T, B, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN):
  42. if not os.path.exists(LOG_FOLDER):
  43. os.mkdir(LOG_FOLDER)
  44. if(PRIVATE_ROUTE):
  45. LOG_FOLDER = LOG_FOLDER + "Private/"
  46. else:
  47. LOG_FOLDER = LOG_FOLDER + "Public/"
  48. if not os.path.exists(LOG_FOLDER):
  49. os.mkdir(LOG_FOLDER)
  50. #DIAGNOSTIC_FOLDER = LOG_FOLDER + "diagnostic/"
  51. #if not os.path.exists(DIAGNOSTIC_FOLDER):
  52. # os.mkdir(DIAGNOSTIC_FOLDER)
  53. for t in T:
  54. b = B
  55. for m in M:
  56. for n in N:
  57. #for run in ["diagnostic", "experiment"]:
  58. for run in ["experiment"]:
  59. num_WN_to_precompute = 0
  60. if(PRIVATE_ROUTE):
  61. num_WN_to_precompute = 2 * 3
  62. else:
  63. num_WN_to_precompute = 2 * 8
  64. # Make the correct output folder for diagnostic/experiment
  65. experiment_name = str(n) + "_" + str(m) + "_" + str(t) + "_" + str(b) + "/"
  66. if(run == "diagnostic"):
  67. log_subfolder = DIAGNOSTIC_FOLDER
  68. elif(run == "experiment"):
  69. log_subfolder = LOG_FOLDER
  70. log_subfolder = log_subfolder + experiment_name
  71. if not os.path.exists(log_subfolder):
  72. os.mkdir(log_subfolder)
  73. if(run == "diagnostic"):
  74. print("\n\n Running %s DIAGNOSTIC t = %d, m = %d, n = %d \n\n" %
  75. ("private routing" if PRIVATE_ROUTE else "public routing", t, m, n))
  76. # Manifest generated by diagnostic can be reused by the actual experiment
  77. generate_manifest(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
  78. generate_config(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN, num_WN_to_precompute)
  79. epoch_param = epoch_time_estimate(n, m, t, b)
  80. elif(run == "experiment"):
  81. #print("Waiting for 2 mins to reset sockets")
  82. #time.sleep(120)
  83. #num_sizes, pwn_max, epoch_max, scm_max = parse_output_logs(DIAGNOSTIC_FOLDER, experiment_name)
  84. #print("From logs_to_csv: num_sizes = %d, pwn_max = %f, epoch_max = %f, scm_max = %f"
  85. #% (num_sizes, pwn_max, epoch_max, scm_max))
  86. print("\n\n Running %s EXPERIMENT t = %d, m = %d, n = %d \n\n" %
  87. ("private routing" if PRIVATE_ROUTE else "public routing", t, m, n))
  88. #num_WN_to_precompute = math.ceil((num_sizes * pwn_max)/epoch_max)
  89. #print("num_WN_to_precompute = %d" %(num_WN_to_precompute))
  90. #if(num_WN_to_precompute < 2 * num_sizes):
  91. # num_WN_to_precompute = 2 * num_sizes
  92. #print("num_WN_to_precompute (pushed up to min 2 sets) = %d" %(num_WN_to_precompute))
  93. #epoch_param = math.ceil(epoch_max + 10 * m * scm_max)
  94. generate_manifest(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
  95. epoch_param = epoch_time_estimate(n, m, t, b)
  96. generate_config(n, m, t, b, PRIVATE_ROUTE, PRIV_IN, PUB_OUT, PUB_IN, num_WN_to_precompute)
  97. # Either estimate from epoch_time_estimate for diagnostic
  98. # or the one we got from diagnostic run
  99. epoch_duration = math.ceil(epoch_param)
  100. print("Epoch_duration = %d" % epoch_duration)
  101. # Since launch is invoked from App/ ; we add a ../ to subfolder before
  102. # passing it to slaunch
  103. log_subfolder = "../" + log_subfolder
  104. slaunch = []
  105. slaunch.append("./launch")
  106. slaunch.append("route_clients")
  107. slaunch.append("-l")
  108. slaunch.append(log_subfolder)
  109. slaunch.append("-n")
  110. nodes_to_include = ["-n"]
  111. for i in range(1, m+1):
  112. nodes_to_include.append("s"+str(i))
  113. slaunch.append("s"+str(i))
  114. slaunch.append("-d")
  115. slaunch.append(str(epoch_duration))
  116. slaunch.append("-e")
  117. if(run == "experiment"):
  118. slaunch.append(str(NUM_EPOCHS))
  119. else:
  120. slaunch.append(str(NUM_DIAGNOSTIC_EPOCHS))
  121. if(run == "experiment"):
  122. slaunch.append("-w")
  123. slaunch.append(str(num_WN_to_precompute))
  124. os.chdir("./App")
  125. # Server outputs are captured by log files provided to each of the server
  126. # launch calls made by App/launch
  127. make = subprocess.call(["make", "-C", "..", "-j"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
  128. try:
  129. os.mkdir("keys")
  130. except:
  131. # It's OK if it already exists
  132. pass
  133. pubkeys = subprocess.call(["./getpubkeys"])
  134. server_process = subprocess.run(slaunch)
  135. claunch = []
  136. claunch.append("./clientlaunch")
  137. claunch.append("-t")
  138. claunch.append("8")
  139. claunch.append("-l")
  140. claunch.append(log_subfolder+"clients.log")
  141. os.chdir("./../Client/")
  142. client_process = subprocess.call(claunch)
  143. os.chdir("./../")