Handle multiple nodes in cluster
This commit is contained in:
parent
35840b9eb7
commit
e6719ab571
5 changed files with 295 additions and 237 deletions
441
plots.py
441
plots.py
|
|
@ -71,14 +71,23 @@ PRETTY_TABLE = {
|
|||
"wp2": "WP",
|
||||
"yt2-ads": "YT",
|
||||
"yt2-ublock": "YT+µ",
|
||||
"paradoxe": "X",
|
||||
"core2": "C2",
|
||||
}
|
||||
PRETTY_TABLE_GNUPLOT = {
|
||||
"pi3": "Pi",
|
||||
"wp2": "WP",
|
||||
"yt2-ads": "YT",
|
||||
"yt2-ublock": "YT+µ",
|
||||
"paradoxe": "X",
|
||||
"core2": "C2",
|
||||
"i5": "i5",
|
||||
}
|
||||
|
||||
# "cluster-number" to "cluster"
|
||||
def cluster_name(target):
|
||||
return target[:target.find("-")] if "-" in target else target
|
||||
|
||||
def impl_title(impl):
|
||||
# Gnuplot does not escape underscores when generating tex
|
||||
return impl.replace("_", "-")
|
||||
|
|
@ -231,7 +240,7 @@ def make_log_plot(logs, exp, criterion, side, obj, record, machine=None, version
|
|||
ciphers = {}
|
||||
impls = []
|
||||
plain_line = None
|
||||
idle_val = None
|
||||
idle_val = {}
|
||||
conv_factor = 1.0
|
||||
if obj == "energy":
|
||||
# Convert Wh to Ws
|
||||
|
|
@ -239,12 +248,12 @@ def make_log_plot(logs, exp, criterion, side, obj, record, machine=None, version
|
|||
|
||||
for log in logs:
|
||||
if log["exp"] == "idle":
|
||||
idle_val = float(log[COL[obj]]) / float(log["time"]) * conv_factor
|
||||
idle_val[log["target"]] = float(log[COL[obj]]) / float(log["time"]) * conv_factor
|
||||
if log["exp"] != exp or log["record"] != record:
|
||||
continue
|
||||
if log["side"] == side and log["tls"] == "0":
|
||||
n = float(log.get("n", "1000"))
|
||||
plain_line = "plain {}".format((float(log[COL[obj]]) * conv_factor - idle_val * float(log["time"])) / n)
|
||||
plain_line = "plain {}".format((float(log[COL[obj]]) * conv_factor[log["target"]] - idle_val[log["target"]] * float(log["time"])) / n)
|
||||
|
||||
if plain_line == None:
|
||||
return
|
||||
|
|
@ -258,11 +267,11 @@ def make_log_plot(logs, exp, criterion, side, obj, record, machine=None, version
|
|||
ver = VER_LABEL[log["cipher"]]
|
||||
if log[COL[criterion]]+"/"+ver not in ciphers:
|
||||
ciphers[log[COL[criterion]]+"/"+ver] = {}
|
||||
ciphers[log[COL[criterion]]+"/"+ver][log["impl"]] = (float(log[COL[obj]]) * conv_factor - idle_val * float(log["time"])) / n
|
||||
ciphers[log[COL[criterion]]+"/"+ver][log["impl"]] = (float(log[COL[obj]]) * conv_factor - idle_val[log["target"]] * float(log["time"])) / n
|
||||
else:
|
||||
if log[COL[criterion]] not in ciphers:
|
||||
ciphers[log[COL[criterion]]] = {}
|
||||
ciphers[log[COL[criterion]]][log["impl"]] = (float(log[COL[obj]]) * conv_factor - idle_val * float(log["time"])) / n
|
||||
ciphers[log[COL[criterion]]][log["impl"]] = (float(log[COL[obj]]) * conv_factor - idle_val[log["target"]] * float(log["time"])) / n
|
||||
if log["impl"] not in impls:
|
||||
impls.append(log["impl"])
|
||||
impls.sort()
|
||||
|
|
@ -304,50 +313,50 @@ def make_log_plot(logs, exp, criterion, side, obj, record, machine=None, version
|
|||
maketitle=maketitle
|
||||
)
|
||||
|
||||
def make_log_plot_points(logs_by_target, exp, criterion, side, obj, record, version=None):
|
||||
def make_log_plot_points(logs, exp, criterion, side, obj, record, version=None):
|
||||
f = open(f"/dev/shm/plots/{obj}_by_{criterion}_{side}_{record}.dat", "w")
|
||||
ciphers = {target: {} for target in logs_by_target}
|
||||
ciphers = {}
|
||||
impls = []
|
||||
plain = {target: None for target in logs_by_target}
|
||||
idle_val = {target: None for target in logs_by_target}
|
||||
plain = {}
|
||||
idle_val = {}
|
||||
conv_factor = 1.0
|
||||
if obj == "energy":
|
||||
# Convert Wh to Ws
|
||||
conv_factor = 3600.0
|
||||
|
||||
for target in logs_by_target:
|
||||
logs = logs_by_target[target]
|
||||
for log in logs:
|
||||
if log["exp"] == "idle":
|
||||
idle_val[target] = float(log[COL[obj]]) / float(log["time"]) * conv_factor
|
||||
if log["exp"] != exp or log["record"] != record:
|
||||
continue
|
||||
if log["side"] == side and log["tls"] == "0":
|
||||
n = float(log.get("n", "1000"))
|
||||
plain[target] = (float(log[COL[obj]]) * conv_factor - idle_val[target] * float(log["time"])) / n
|
||||
for log in logs:
|
||||
if log["target"] not in ciphers:
|
||||
ciphers[log["target"]] = {}
|
||||
plain[log["target"]] = None
|
||||
idle_val[log["target"]] = None
|
||||
if log["exp"] == "idle":
|
||||
idle_val[log["target"]] = float(log[COL[obj]]) / float(log["time"]) * conv_factor
|
||||
if log["exp"] != exp or log["record"] != record:
|
||||
continue
|
||||
if log["side"] == side and log["tls"] == "0":
|
||||
n = float(log.get("n", "1000"))
|
||||
plain[log["target"]] = (float(log[COL[obj]]) * conv_factor - idle_val[log["target"]] * float(log["time"])) / n
|
||||
|
||||
#for target in plain:
|
||||
# if plain[target] == None:
|
||||
# return
|
||||
|
||||
for target in logs_by_target:
|
||||
logs = logs_by_target[target]
|
||||
for log in logs:
|
||||
if log["exp"] == exp and log["record"] == record and log["side"] == side:
|
||||
if version != None and VER_LABEL[log["cipher"]] != version:
|
||||
continue
|
||||
n = float(log.get("n", "1000"))
|
||||
if version == None:
|
||||
ver = VER_LABEL[log["cipher"]]
|
||||
if log[COL[criterion]]+"/"+ver not in ciphers[target]:
|
||||
ciphers[target][log[COL[criterion]]+"/"+ver] = {}
|
||||
ciphers[target][log[COL[criterion]]+"/"+ver][log["impl"]] = (float(log[COL[obj]]) * conv_factor - idle_val[target] * float(log["time"])) / n
|
||||
else:
|
||||
if log[COL[criterion]] not in ciphers[target]:
|
||||
ciphers[target][log[COL[criterion]]] = {}
|
||||
ciphers[target][log[COL[criterion]]][log["impl"]] = (float(log[COL[obj]]) * conv_factor - idle_val[target] * float(log["time"])) / n
|
||||
if log["impl"] not in impls:
|
||||
impls.append(log["impl"])
|
||||
for log in logs:
|
||||
if log["exp"] == exp and log["record"] == record and log["side"] == side:
|
||||
if version != None and VER_LABEL[log["cipher"]] != version:
|
||||
continue
|
||||
n = float(log.get("n", "1000"))
|
||||
if version == None:
|
||||
ver = VER_LABEL[log["cipher"]]
|
||||
if log[COL[criterion]]+"/"+ver not in ciphers[log["target"]]:
|
||||
ciphers[log["target"]][log[COL[criterion]]+"/"+ver] = {}
|
||||
ciphers[log["target"]][log[COL[criterion]]+"/"+ver][log["impl"]] = (float(log[COL[obj]]) * conv_factor - idle_val[log["target"]] * float(log["time"])) / n
|
||||
else:
|
||||
if log[COL[criterion]] not in ciphers[log["target"]]:
|
||||
ciphers[log["target"]][log[COL[criterion]]] = {}
|
||||
ciphers[log["target"]][log[COL[criterion]]][log["impl"]] = (float(log[COL[obj]]) * conv_factor - idle_val[log["target"]] * float(log["time"])) / n
|
||||
if log["impl"] not in impls:
|
||||
impls.append(log["impl"])
|
||||
impls.sort()
|
||||
f.write("target fulltarget {} none {}\n".format(criterion, " ".join([impl_title(impl) for impl in impls])))
|
||||
for target in plain:
|
||||
|
|
@ -359,7 +368,7 @@ def make_log_plot_points(logs_by_target, exp, criterion, side, obj, record, vers
|
|||
cipher_parts = cipher.split("/")
|
||||
f.write("{} {} {}({}) {} {}\n".format(
|
||||
target,
|
||||
ALG_LABEL[cipher_parts[0]]+"/"+target,
|
||||
ALG_LABEL[cipher_parts[0]]+"/"+PRETTY_TABLE_GNUPLOT[target],
|
||||
ALG_LABEL[cipher_parts[0]],
|
||||
cipher_parts[1],
|
||||
plain[target],
|
||||
|
|
@ -371,7 +380,7 @@ def make_log_plot_points(logs_by_target, exp, criterion, side, obj, record, vers
|
|||
else:
|
||||
f.write("{} {} {} {} {}\n".format(
|
||||
target,
|
||||
ALG_LABEL[cipher]+"/"+target,
|
||||
ALG_LABEL[cipher]+"/"+PRETTY_TABLE_GNUPLOT[target],
|
||||
ALG_LABEL[cipher],
|
||||
plain[target],
|
||||
" ".join([
|
||||
|
|
@ -541,30 +550,25 @@ def make_linear_regression(logs, cat="impl"):
|
|||
# Measure relative difference between TLS versions
|
||||
def cmp_versions_multitarget(logs, exps, criteria, objs):
|
||||
ciphers = {}
|
||||
idle_val = {target: None for target in logs_by_target}
|
||||
idle_val = {}
|
||||
|
||||
for target in logs_by_target:
|
||||
logs = logs_by_target[target]
|
||||
for log in logs:
|
||||
log["target"] = target
|
||||
log["io"] = int(log["bytes_in"]) + int(log["bytes_out"])
|
||||
if log["exp"] == "idle":
|
||||
idle_val[target] = {obj:float(log[COL[obj]]) / float(log["time"]) for obj in objs}
|
||||
for log in logs:
|
||||
log["io"] = int(log["bytes_in"]) + int(log["bytes_out"])
|
||||
if log["exp"] == "idle":
|
||||
idle_val[log["target"]] = {obj:float(log[COL[obj]]) / float(log["time"]) for obj in objs}
|
||||
|
||||
for target in logs_by_target:
|
||||
logs = logs_by_target[target]
|
||||
for log in logs:
|
||||
if log["exp"] not in exps or log["tls"] == "0":
|
||||
continue
|
||||
ver = VER_LABEL[log["cipher"]]
|
||||
if ver not in ciphers:
|
||||
ciphers[ver] = {}
|
||||
key = [target]
|
||||
for criterion in criteria:
|
||||
key.append(ALG_LABEL.get(log[COL[criterion]], log[COL[criterion]]))
|
||||
key = "/".join(key)
|
||||
if key not in ciphers[ver]:
|
||||
ciphers[ver][key] = log
|
||||
for log in logs:
|
||||
if log["exp"] not in exps or log["tls"] == "0":
|
||||
continue
|
||||
ver = VER_LABEL[log["cipher"]]
|
||||
if ver not in ciphers:
|
||||
ciphers[ver] = {}
|
||||
key = [log["target"]]
|
||||
for criterion in criteria:
|
||||
key.append(ALG_LABEL.get(log[COL[criterion]], log[COL[criterion]]))
|
||||
key = "/".join(key)
|
||||
if key not in ciphers[ver]:
|
||||
ciphers[ver][key] = log
|
||||
|
||||
diff_rel_max = {obj:0.0 for obj in objs}
|
||||
diff_rel_sum = {obj:0.0 for obj in objs}
|
||||
|
|
@ -670,16 +674,16 @@ def tabulate(lines, separator=" ", endline="", ruler=True):
|
|||
return table
|
||||
|
||||
def make_summary(logs):
|
||||
plain_result_key = lambda log: (log["exp"], log["side"], log["record"])
|
||||
result_key = lambda log: (log["exp"], log["side"], log["record"], log["impl"], log["alg"], log["kex"], log["cipher"], log["ed"])
|
||||
plain_result_key = lambda log: (cluster_name(log["target"]), log["exp"], log["side"], log["record"])
|
||||
result_key = lambda log: (cluster_name(log["target"]), log["exp"], log["side"], log["record"], log["impl"], log["alg"], log["kex"], log["cipher"], log["ed"])
|
||||
|
||||
plain_results = {}
|
||||
results = {}
|
||||
idle_val = None
|
||||
idle_val = {}
|
||||
|
||||
for log in logs:
|
||||
if log["exp"] == "idle":
|
||||
idle_val = {
|
||||
idle_val[log["target"]] = {
|
||||
"cpu": float(log["cpu"]) / float(log["time"]),
|
||||
"energy": float(log["Wh"]) / float(log["time"]) * 3600,
|
||||
"in": float(log["bytes_in"]) / float(log["time"]),
|
||||
|
|
@ -688,20 +692,21 @@ def make_summary(logs):
|
|||
if log["tls"] == "0":
|
||||
n = float(log.get("n", "1000"))
|
||||
plain_results[plain_result_key(log)] = {
|
||||
"cpu": (float(log["cpu"]) - idle_val["cpu"] * float(log["time"])) / n,
|
||||
"cpu": (float(log["cpu"]) - idle_val[log["target"]]["cpu"] * float(log["time"])) / n,
|
||||
"total_energy": float(log["Wh"]) * 3600 / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val["out"] * float(log["time"])) / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val[log["target"]]["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val[log["target"]]["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val[log["target"]]["out"] * float(log["time"])) / n,
|
||||
}
|
||||
if log["exp"] != "idle" and log["tls"] == "1":
|
||||
n = float(log.get("n", "1000"))
|
||||
results[result_key(log)] = {
|
||||
"cpu": (float(log["cpu"]) - idle_val["cpu"] * float(log["time"])) / n,
|
||||
"target": log["target"],
|
||||
"cpu": (float(log["cpu"]) - idle_val[log["target"]]["cpu"] * float(log["time"])) / n,
|
||||
"total_energy": float(log["Wh"]) * 3600 / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val["out"] * float(log["time"])) / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val[log["target"]]["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val[log["target"]]["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val[log["target"]]["out"] * float(log["time"])) / n,
|
||||
}
|
||||
|
||||
lines = [[
|
||||
|
|
@ -718,10 +723,10 @@ def make_summary(logs):
|
|||
]]
|
||||
for k in results:
|
||||
r = results[k]
|
||||
p = plain_results[k[:3]]
|
||||
p = plain_results[k[:4]]
|
||||
lines.append([
|
||||
"/".join([str(i) for i in k]),
|
||||
str(round(idle_val["energy"], 1)),
|
||||
str(round(idle_val[r["target"]]["energy"], 1)),
|
||||
str(round(p["energy"], 1)),
|
||||
str(round(r["energy"], 1)),
|
||||
str(round(r["energy"] - p["energy"], 1)) + " (" + str(round((r["energy"] - p["energy"])/r["energy"]*100, 1)) + "%)",
|
||||
|
|
@ -734,16 +739,16 @@ def make_summary(logs):
|
|||
print(tabulate(lines))
|
||||
|
||||
def analyze_logs(logs):
|
||||
plain_result_key = lambda log: (log["exp"], log["side"], log["record"])
|
||||
result_key = lambda log: (log["exp"], log["side"], log["record"], log["impl"], log["alg"], log["kex"], log["cipher"], log["ed"])
|
||||
plain_result_key = lambda log: (log["target"], log["exp"], log["side"], log["record"])
|
||||
result_key = lambda log: (log["target"], log["exp"], log["side"], log["record"], log["impl"], log["alg"], log["kex"], log["cipher"], log["ed"])
|
||||
|
||||
plain_results = {}
|
||||
results = {}
|
||||
idle_val = None
|
||||
idle_val = {}
|
||||
|
||||
for log in logs:
|
||||
if log["exp"] == "idle":
|
||||
idle_val = {
|
||||
idle_val[log["target"]] = {
|
||||
"cpu": float(log["cpu"]) / float(log["time"]),
|
||||
"energy": float(log["Wh"]) / float(log["time"]) * 3600,
|
||||
"in": float(log["bytes_in"]) / float(log["time"]),
|
||||
|
|
@ -752,15 +757,17 @@ def analyze_logs(logs):
|
|||
if log["tls"] == "0":
|
||||
n = float(log.get("n", "1000"))
|
||||
plain_results[plain_result_key(log)] = {
|
||||
"cpu": (float(log["cpu"]) - idle_val["cpu"] * float(log["time"])) / n,
|
||||
"target": log["target"],
|
||||
"cpu": (float(log["cpu"]) - idle_val[log["target"]]["cpu"] * float(log["time"])) / n,
|
||||
"total_energy": float(log["Wh"]) * 3600 / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val["out"] * float(log["time"])) / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val[log["target"]]["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val[log["target"]]["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val[log["target"]]["out"] * float(log["time"])) / n,
|
||||
}
|
||||
if log["exp"] != "idle" and log["tls"] == "1":
|
||||
n = float(log.get("n", "1000"))
|
||||
results[result_key(log)] = {
|
||||
"target": log["target"],
|
||||
"exp": log["exp"],
|
||||
"side": log["side"],
|
||||
"record": log["record"],
|
||||
|
|
@ -769,18 +776,19 @@ def analyze_logs(logs):
|
|||
"kex": log["kex"],
|
||||
"cipher": log["cipher"],
|
||||
"ed": log["ed"],
|
||||
"cpu": (float(log["cpu"]) - idle_val["cpu"] * float(log["time"])) / n,
|
||||
"cpu": (float(log["cpu"]) - idle_val[log["target"]]["cpu"] * float(log["time"])) / n,
|
||||
"total_energy": float(log["Wh"]) * 3600 / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val["out"] * float(log["time"])) / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val[log["target"]]["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val[log["target"]]["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val[log["target"]]["out"] * float(log["time"])) / n,
|
||||
}
|
||||
|
||||
lines = []
|
||||
for k in results:
|
||||
r = results[k]
|
||||
p = plain_results[k[:3]]
|
||||
p = plain_results[k[:4]]
|
||||
lines.append({
|
||||
"target": r["target"],
|
||||
"exp": r["exp"],
|
||||
"side": r["side"],
|
||||
"record": r["record"],
|
||||
|
|
@ -848,16 +856,16 @@ def average_items(items, to_average, target=None):
|
|||
return avg
|
||||
|
||||
def analyze_average_logs(logs, target=None):
|
||||
plain_result_key = lambda log: (log["exp"], log["side"], log["record"])
|
||||
result_key = lambda log: (log["exp"], log["side"], log["record"], log["impl"], log["alg"], log["kex"], log["cipher"], log["ed"])
|
||||
plain_result_key = lambda log: (cluster_name(log["target"]), log["exp"], log["side"], log["record"])
|
||||
result_key = lambda log: (cluster_name(log["target"]), log["exp"], log["side"], log["record"], log["impl"], log["alg"], log["kex"], log["cipher"], log["ed"])
|
||||
|
||||
plain_results = {}
|
||||
results = {}
|
||||
idle_val = None
|
||||
idle_val = {}
|
||||
|
||||
for log in logs:
|
||||
if log["exp"] == "idle":
|
||||
idle_val = {
|
||||
idle_val[log["target"]] = {
|
||||
"cpu": float(log["cpu"]) / float(log["time"]),
|
||||
"energy": float(log["Wh"]) / float(log["time"]) * 3600,
|
||||
"in": float(log["bytes_in"]) / float(log["time"]),
|
||||
|
|
@ -868,17 +876,20 @@ def analyze_average_logs(logs, target=None):
|
|||
if plain_result_key(log) not in plain_results:
|
||||
plain_results[plain_result_key(log)] = []
|
||||
plain_results[plain_result_key(log)].append({
|
||||
"cpu": (float(log["cpu"]) - idle_val["cpu"] * float(log["time"])) / n,
|
||||
"target": log["target"],
|
||||
"cpu": (float(log["cpu"]) - idle_val[log["target"]]["cpu"] * float(log["time"])) / n,
|
||||
"total_energy": float(log["Wh"]) * 3600 / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val["out"] * float(log["time"])) / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val[log["target"]]["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val[log["target"]]["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val[log["target"]]["out"] * float(log["time"])) / n,
|
||||
"cpu": float(log["cpu"]) / n,
|
||||
})
|
||||
if log["exp"] != "idle" and log["tls"] == "1":
|
||||
n = float(log.get("n", "1000"))
|
||||
if result_key(log) not in results:
|
||||
results[result_key(log)] = []
|
||||
results[result_key(log)].append({
|
||||
"target": log["target"],
|
||||
"exp": log["exp"],
|
||||
"side": log["side"],
|
||||
"record": log["record"],
|
||||
|
|
@ -887,12 +898,12 @@ def analyze_average_logs(logs, target=None):
|
|||
"kex": log["kex"],
|
||||
"cipher": log["cipher"],
|
||||
"ed": log["ed"],
|
||||
"idle": idle_val["energy"],
|
||||
"cpu": (float(log["cpu"]) - idle_val["cpu"] * float(log["time"])) / n,
|
||||
"idle": idle_val[log["target"]]["energy"],
|
||||
"cpu": float(log["cpu"]) / n,
|
||||
"total_energy": float(log["Wh"]) * 3600 / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val["out"] * float(log["time"])) / n,
|
||||
"energy": (float(log["Wh"]) * 3600 - idle_val[log["target"]]["energy"] * float(log["time"])) / n,
|
||||
"in": (float(log["bytes_in"]) - idle_val[log["target"]]["in"] * float(log["time"])) / n,
|
||||
"out": (float(log["bytes_out"]) - idle_val[log["target"]]["out"] * float(log["time"])) / n,
|
||||
})
|
||||
|
||||
for key in plain_results:
|
||||
|
|
@ -903,8 +914,9 @@ def analyze_average_logs(logs, target=None):
|
|||
lines = []
|
||||
for k in results:
|
||||
r = results[k]
|
||||
p = plain_results[k[:3]]
|
||||
p = plain_results[k[:4]]
|
||||
lines.append({
|
||||
"target": r["target"],
|
||||
"exp": r["exp"],
|
||||
"side": r["side"],
|
||||
"record": r["record"],
|
||||
|
|
@ -1121,65 +1133,84 @@ def make_tx_plot(logs_by_target, server_target):
|
|||
])
|
||||
print(tabulate(latex, separator=" & ", endline="\\\\ \\cline{3-9}", ruler=False))
|
||||
|
||||
def make_summary_plot(logs_by_target):
|
||||
lines = [["exp", "record", "alg", "kex", "cipher", "ed", "side", "target", "impl", "plain E (J/S)", "TLS E (J/S)", "TLS only E (J/S)", "plain io (o/S)", "TLS io (o/S)", "TLS only io (o/S)", "TLS E rel", "TLS io rel"]]
|
||||
def make_summary_plot(logs):
|
||||
lines = [["exp", "record", "alg", "kex", "cipher", "ed", "side", "target", "impl", "plain E (J/S)", "TLS E (J/S)", "TLS only E (J/S)", "plain io (o/S)", "TLS io (o/S)", "TLS only io (o/S)", "TLS E rel", "TLS io rel", "CPU rel"]]
|
||||
results = []
|
||||
for target in logs_by_target:
|
||||
logs = logs_by_target[target]
|
||||
target_results = analyze_average_logs(logs, target=target)
|
||||
for log in target_results:
|
||||
plain_energy = log["plain"]["energy"]
|
||||
tls_energy = log["tls"]["energy"]
|
||||
tls_only_energy = tls_energy - plain_energy
|
||||
tls_rel_energy = tls_only_energy / plain_energy
|
||||
plain_io = log["plain"]["in"] + log["plain"]["out"]
|
||||
tls_io = log["tls"]["in"] + log["tls"]["out"]
|
||||
tls_only_io = tls_io - plain_io
|
||||
tls_rel_io = tls_only_io / plain_io
|
||||
results.append({
|
||||
"target": target,
|
||||
"exp": log["exp"],
|
||||
"record": log["record"],
|
||||
"alg": log["alg"],
|
||||
"kex": log["kex"],
|
||||
"cipher": log["cipher"],
|
||||
"ed": log["ed"],
|
||||
"version": VER_LABEL[log["cipher"]],
|
||||
"impl": log["impl"],
|
||||
"side": log["side"],
|
||||
"tls": log["tls"],
|
||||
"idle_energy": log["idle"],
|
||||
"plain_energy": plain_energy,
|
||||
"tls_energy": tls_energy,
|
||||
"tls_only_energy": tls_only_energy,
|
||||
"plain_io": plain_io,
|
||||
"tls_io": tls_io,
|
||||
"tls_only_io": tls_only_io,
|
||||
"tls_rel_energy": tls_rel_energy,
|
||||
"tls_rel_io": tls_rel_io,
|
||||
})
|
||||
lines.append([
|
||||
log["exp"],
|
||||
log["record"],
|
||||
log["alg"],
|
||||
log["kex"],
|
||||
log["cipher"],
|
||||
log["ed"],
|
||||
log["side"],
|
||||
target,
|
||||
log["impl"],
|
||||
str(round(plain_energy, 2)),
|
||||
str(round(tls_energy, 2)),
|
||||
str(round(tls_only_energy, 2)),
|
||||
str(round(plain_io, 2)),
|
||||
str(round(tls_io, 2)),
|
||||
str(round(tls_only_io, 2)),
|
||||
str(round(tls_rel_energy*100, 2))+"%",
|
||||
str(round(tls_rel_io*100, 2))+"%",
|
||||
])
|
||||
target_results = analyze_average_logs(logs)
|
||||
for log in target_results:
|
||||
plain_energy = log["plain"]["energy"]
|
||||
tls_energy = log["tls"]["energy"]
|
||||
tls_only_energy = tls_energy - plain_energy
|
||||
tls_rel_energy = tls_only_energy / plain_energy
|
||||
plain_io = log["plain"]["in"] + log["plain"]["out"]
|
||||
tls_io = log["tls"]["in"] + log["tls"]["out"]
|
||||
tls_only_io = tls_io - plain_io
|
||||
tls_rel_io = tls_only_io / plain_io
|
||||
plain_cpu = log["plain"]["cpu"]
|
||||
tls_cpu = log["tls"]["cpu"]
|
||||
tls_only_cpu = tls_cpu - plain_cpu
|
||||
results.append({
|
||||
"target": log["target"],
|
||||
"exp": log["exp"],
|
||||
"record": log["record"],
|
||||
"alg": log["alg"],
|
||||
"kex": log["kex"],
|
||||
"cipher": log["cipher"],
|
||||
"ed": log["ed"],
|
||||
"version": VER_LABEL[log["cipher"]],
|
||||
"impl": log["impl"],
|
||||
"side": log["side"],
|
||||
"tls": log["tls"],
|
||||
"idle_energy": log["idle"],
|
||||
"plain_energy": plain_energy,
|
||||
"tls_energy": tls_energy,
|
||||
"tls_only_energy": tls_only_energy,
|
||||
"plain_io": plain_io,
|
||||
"tls_io": tls_io,
|
||||
"tls_only_io": tls_only_io,
|
||||
"tls_rel_energy": tls_rel_energy,
|
||||
"tls_rel_io": tls_rel_io,
|
||||
"plain_cpu": plain_cpu,
|
||||
"tls_cpu": tls_cpu,
|
||||
"tls_only_cpu": tls_only_cpu,
|
||||
})
|
||||
lines.append([
|
||||
log["exp"],
|
||||
log["record"],
|
||||
log["alg"],
|
||||
log["kex"],
|
||||
log["cipher"],
|
||||
log["ed"],
|
||||
log["side"],
|
||||
log["target"],
|
||||
log["impl"],
|
||||
str(round(plain_energy, 2)),
|
||||
str(round(tls_energy, 2)),
|
||||
str(round(tls_only_energy, 2)),
|
||||
str(round(plain_io, 2)),
|
||||
str(round(tls_io, 2)),
|
||||
str(round(tls_only_io, 2)),
|
||||
str(round(tls_rel_energy*100, 2))+"%",
|
||||
str(round(tls_rel_io*100, 2))+"%",
|
||||
(str(round(tls_only_cpu / plain_cpu * 100, 2))+"%") if plain_cpu != 0 else "-",
|
||||
])
|
||||
print(tabulate(lines))
|
||||
print()
|
||||
|
||||
avg_cluster_idle = {}
|
||||
for log in results:
|
||||
target = cluster_name(log["target"])
|
||||
if target not in avg_cluster_idle:
|
||||
avg_cluster_idle[target] = {}
|
||||
avg_cluster_idle[target][log["idle_energy"]] = 1
|
||||
for target in avg_cluster_idle:
|
||||
avg = 0
|
||||
nb = 0
|
||||
for val in avg_cluster_idle[target]:
|
||||
avg += val
|
||||
nb += 1
|
||||
avg_cluster_idle[target]["avg"] = avg / nb
|
||||
|
||||
print("\
|
||||
\\multicolumn{1}{|c|}{\\multirow{2}*{\\textbf{Target}}}&\
|
||||
\\multicolumn{1}{|c|}{\\multirow{2}*{\\textbf{Idle (W)}}}&\
|
||||
|
|
@ -1192,13 +1223,13 @@ def make_summary_plot(logs_by_target):
|
|||
latex_lines = {}
|
||||
latex_keys = []
|
||||
for log in results:
|
||||
key = (log["target"], log["record"], log["side"])
|
||||
key = (cluster_name(log["target"]), log["record"], log["side"])
|
||||
if key in latex_lines:
|
||||
continue
|
||||
latex_keys.append(key)
|
||||
latex_lines[key] = [
|
||||
PRETTY_TABLE.get(log["target"], log["target"]),
|
||||
"${}$".format(roundz(log["idle_energy"], 2)),
|
||||
PRETTY_TABLE.get(cluster_name(log["target"]), cluster_name(log["target"])),
|
||||
"${}$".format(roundz(avg_cluster_idle[cluster_name(log["target"])]["avg"], 2)),
|
||||
PRETTY_TABLE[log["record"]],
|
||||
log["side"],
|
||||
"${}$".format(roundz(log["plain_energy"], 2)),
|
||||
|
|
@ -1297,6 +1328,8 @@ def make_summary_plot(logs_by_target):
|
|||
samples_energy_server = []
|
||||
samples_io = []
|
||||
for log_new in results:
|
||||
if "paradoxe" in log_new["target"]:
|
||||
continue
|
||||
ok = True
|
||||
for filter in cmp["new"]:
|
||||
if log_new[filter] != cmp["new"][filter]:
|
||||
|
|
@ -1304,7 +1337,7 @@ def make_summary_plot(logs_by_target):
|
|||
break
|
||||
if not ok:
|
||||
continue
|
||||
key_new = (log_new["exp"], log_new["target"], log_new["impl"], log_new["record"], log_new["side"])
|
||||
key_new = (log_new["exp"], cluster_name(log_new["target"]), log_new["impl"], log_new["record"], log_new["side"])
|
||||
for log_old in results:
|
||||
ok = True
|
||||
for filter in cmp["old"]:
|
||||
|
|
@ -1313,7 +1346,7 @@ def make_summary_plot(logs_by_target):
|
|||
break
|
||||
if not ok:
|
||||
continue
|
||||
key_old = (log_old["exp"], log_old["target"], log_old["impl"], log_old["record"], log_old["side"])
|
||||
key_old = (log_old["exp"], cluster_name(log_old["target"]), log_old["impl"], log_old["record"], log_old["side"])
|
||||
if key_new == key_old:
|
||||
if log_new["side"] == "server":
|
||||
samples_energy_server.append((log_new["tls_energy"] / log_old["tls_energy"] - 1.0) * 100.0)
|
||||
|
|
@ -1339,10 +1372,8 @@ def make_summary_plot(logs_by_target):
|
|||
f_energy = open("/dev/shm/plots/energy-global.dat", "w")
|
||||
f_io = open("/dev/shm/plots/io-global.dat", "w")
|
||||
for log in results:
|
||||
if log["target"] == "pi3" and "yt" in log["record"]:
|
||||
continue
|
||||
f_energy.write("{}-{} {}\n".format(PRETTY_TABLE_GNUPLOT.get(log["target"], log["target"]), log["side"], log["tls_rel_energy"] * 100.0))
|
||||
f_io.write("{}-{} {}\n".format(PRETTY_TABLE_GNUPLOT.get(log["target"], log["target"]), log["side"], log["tls_rel_io"] * 100.0))
|
||||
f_energy.write("{}-{} {}\n".format(PRETTY_TABLE_GNUPLOT.get(cluster_name(log["target"]), log["target"]), log["side"], log["tls_rel_energy"] * 100.0))
|
||||
f_io.write("{}-{} {}\n".format(PRETTY_TABLE_GNUPLOT.get(cluster_name(log["target"]), log["target"]), log["side"], log["tls_rel_io"] * 100.0))
|
||||
f_energy.close()
|
||||
f_io.close()
|
||||
|
||||
|
|
@ -1357,31 +1388,27 @@ def compute_box_plot(a):
|
|||
|
||||
def make_stability_plot(logs_by_target):
|
||||
f = open(f"/dev/shm/plots/stability.dat", "w")
|
||||
idle_val = {target: None for target in logs_by_target}
|
||||
idle_val = {}
|
||||
|
||||
for target in logs_by_target:
|
||||
logs = logs_by_target[target]
|
||||
for log in logs:
|
||||
if log["exp"] == "idle":
|
||||
idle_val[target] = {
|
||||
"energy": float(log[COL["energy"]]) / float(log["time"]) * 3600.0,
|
||||
"io": float(log["bytes_in"])+float(log["bytes_out"]) / float(log["time"]),
|
||||
}
|
||||
for log in logs:
|
||||
if log["exp"] == "idle":
|
||||
idle_val[log["target"]] = {
|
||||
"energy": float(log[COL["energy"]]) / float(log["time"]) * 3600.0,
|
||||
"io": float(log["bytes_in"])+float(log["bytes_out"]) / float(log["time"]),
|
||||
}
|
||||
|
||||
all_results = {}
|
||||
for target in logs_by_target:
|
||||
logs = logs_by_target[target]
|
||||
for log in logs:
|
||||
if log["exp"] == "idle":
|
||||
continue
|
||||
n = float(log.get("n", "1000"))
|
||||
key = "{}-{}".format(target, log["side"])
|
||||
if key not in all_results:
|
||||
all_results[key] = []
|
||||
all_results[key].append({
|
||||
"energy": (float(log[COL["energy"]]) * 3600.0 - idle_val[target]["energy"] * float(log["time"])) / n,
|
||||
"io": (float(log["bytes_in"])+float(log["bytes_out"]) - idle_val[target]["io"] * float(log["time"])) / n / 1024**2
|
||||
})
|
||||
for log in logs:
|
||||
if log["exp"] == "idle":
|
||||
continue
|
||||
n = float(log.get("n", "1000"))
|
||||
key = "{}-{}".format(PRETTY_TABLE_GNUPLOT[cluster_name(log["target"])], log["side"])
|
||||
if key not in all_results:
|
||||
all_results[key] = []
|
||||
all_results[key].append({
|
||||
"energy": (float(log[COL["energy"]]) * 3600.0 - idle_val[log["target"]]["energy"] * float(log["time"])) / n,
|
||||
"io": (float(log["bytes_in"])+float(log["bytes_out"]) - idle_val[log["target"]]["io"] * float(log["time"])) / n / 1024**2
|
||||
})
|
||||
|
||||
means = {key: {
|
||||
"energy": sum([i["energy"] for i in all_results[key]])/len(all_results[key]),
|
||||
|
|
@ -1429,6 +1456,8 @@ def parse_logs(logfile_name):
|
|||
logs = []
|
||||
records = {}
|
||||
for line in lines[1:]:
|
||||
if line[0] in "#\n":
|
||||
continue
|
||||
cols = line.removesuffix("\n").split(" ")
|
||||
log = {}
|
||||
for col in range(len(cols)):
|
||||
|
|
@ -1465,24 +1494,22 @@ if __name__ == "__main__":
|
|||
make_log_plot(logs, "zrtt", "ed", side, "energy", record, machine=machine, maketitle=maketitle, version="1.3")
|
||||
cmp_versions(logs, ["impl-cipher-ver", "impl-cert-ver", "impl-kex-ver"], ["side", "cipher", "cert", "kex", "record"], ["cpu", "energy"])
|
||||
elif cmd == "log2":
|
||||
# Args: log2 <file1> <target1> [<file2> <target2>] [...]
|
||||
# Args: log2 <file1> [<file2>] [...]
|
||||
# Only use the intersection of the records
|
||||
logs_by_target = {sys.argv[3]: logs}
|
||||
records_to_remove = {}
|
||||
for i in range(4, len(sys.argv), 2):
|
||||
for i in range(3, len(sys.argv)):
|
||||
logs_i, records_i = parse_logs(sys.argv[i])
|
||||
for record in records:
|
||||
if record not in records_i:
|
||||
records_to_remove[record] = ()
|
||||
target_i = sys.argv[i+1]
|
||||
logs_by_target[target_i] = logs_i
|
||||
logs += logs_i
|
||||
for record in records_to_remove:
|
||||
records.pop(record)
|
||||
for side in ["client", "server"]:
|
||||
for record in records:
|
||||
make_log_plot_points(logs_by_target, "impl-cipher-ver", "cipher", side, "energy", record, version="1.3")
|
||||
make_log_plot_points(logs_by_target, "impl-cert-ver", "cert", side, "energy", record, version="1.3")
|
||||
make_log_plot_points(logs_by_target, "impl-kex-ver", "kex", side, "energy", record, version="1.3")
|
||||
make_log_plot_points(logs, "impl-cipher-ver", "cipher", side, "energy", record, version="1.3")
|
||||
make_log_plot_points(logs, "impl-cert-ver", "cert", side, "energy", record, version="1.3")
|
||||
make_log_plot_points(logs, "impl-kex-ver", "kex", side, "energy", record, version="1.3")
|
||||
cmp_versions_multitarget(logs, ["impl-cipher-ver", "impl-cert-ver", "impl-kex-ver"], ["side", "cipher", "cert", "kex", "record", "ed", "impl"], ["energy", "io"])
|
||||
elif cmd == "prof":
|
||||
for side in ["client", "server"]:
|
||||
|
|
@ -1494,15 +1521,11 @@ if __name__ == "__main__":
|
|||
make_profile_plot_grouped(logs, "impl-cert-ver", "cert", side, record, "impl", no_flamegraph=no_flamegraph, machine=machine, maketitle=maketitle, version="1.3")
|
||||
make_profile_plot_grouped(logs, "impl-kex-ver", "kex", side, record, "impl", no_flamegraph=no_flamegraph, machine=machine, maketitle=maketitle, version="1.3")
|
||||
elif cmd == "summary":
|
||||
# Args: stab <file1> <target1> [<file2> <target2>] [...]
|
||||
# First target is the server
|
||||
server = sys.argv[3]
|
||||
logs_by_target = {server: logs}
|
||||
for i in range(4, len(sys.argv), 2):
|
||||
# Args: stab <file1> [<file2>] [...]
|
||||
for i in range(3, len(sys.argv)):
|
||||
logs_i, records_i = parse_logs(sys.argv[i])
|
||||
target_i = sys.argv[i+1]
|
||||
logs_by_target[target_i] = logs_i
|
||||
make_summary_plot(logs_by_target)
|
||||
logs += logs_i
|
||||
make_summary_plot(logs)
|
||||
elif cmd == "tx":
|
||||
# Args: stab <file1> <target1> [<file2> <target2>] [...]
|
||||
# First target is the server
|
||||
|
|
@ -1519,10 +1542,8 @@ if __name__ == "__main__":
|
|||
import numpy as np
|
||||
make_linear_regression(logs, "alg")
|
||||
elif cmd == "stab":
|
||||
# Args: stab <file1> <target1> [<file2> <target2>] [...]
|
||||
logs_by_target = {sys.argv[3]: logs}
|
||||
for i in range(4, len(sys.argv), 2):
|
||||
# Args: stab <file1> [<file2>] [...]
|
||||
for i in range(3, len(sys.argv)):
|
||||
logs_i, records_i = parse_logs(sys.argv[i])
|
||||
target_i = sys.argv[i+1]
|
||||
logs_by_target[target_i] = logs_i
|
||||
make_stability_plot(logs_by_target)
|
||||
logs += logs_i
|
||||
make_stability_plot(logs)
|
||||
|
|
|
|||
Loading…
Reference in a new issue