Skip to content

Commit 4945415

Browse files
committed
Add results and collection scripts for Helix evaluation (presented in paper)
1 parent e236f3b commit 4945415

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+48276
-0
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ deploying TE on WANs. The emulation framework allows evaluating the control
99
plane failure resilience, data-plane failure resilience and TE optimisation
1010
performance of SDN systems.
1111

12+
The raw results collected to evaluate Helix (presented in the paper) can be
13+
found in the `SOSR2021_RESULTS/` folder of this repo. Please refer to the
14+
folder readme file for info on how results were collected.
15+
1216

1317

1418
## Repo Overview ##

SOSR2021_RESULTS/README.md

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# SOSR2021 Raw Results & Process Scripts #
2+
3+
This folder contains all raw results and process scripts used to evaluate
4+
Helix. This directory is divided into three sub-directories that evaluate
5+
different aspects.
6+
7+
_Note: The paper only presented part of the control-plane evaluation results
8+
(scenario 1) and part of the TE algorithm evaluation results (AT&T-MPLS
9+
Topology)._
10+
11+
12+
13+
## Data Plane Failure Evaluation #
14+
15+
**Folder:** `SOSR21_ReactVsProact/`
16+
17+
Data plane failure recovery performance evaluation of Helix and comparison
18+
between reactive versus proactive (Helix) recovery collected using two control
19+
channel latencies:
20+
* 4ms
21+
* 20ms - our calculated average WAN latency (see paper for details).
22+
23+
24+
To generate graph using GNU Plot (of processed results data found in
25+
`reactive_vs_proactive.dat` file) use `gnuplot reactive_vs_proactive.p`.
26+
Running this script will generate an SVG image `reactive_vs_proactive.svg`.
27+
28+
Raw results were collected using the collection script
29+
`SOSR2021_collect_react_vs_proact.sh` from the root folder of the repository.
30+
31+
32+
### RAW RESULTS ###
33+
34+
`RAW_RESULTS/` - Contains collected raw and processed
35+
results. Folder also contains process scripts and collection script.
36+
37+
`RAW_RESULTS/ResLinkFail_20ms` - Contains data plane recovery results collected
38+
using a control channel latency of 20ms. Reactive controller results extended
39+
Helix to use a restoration based recovery approach while the proactive and
40+
proactive_alt controllers use Helix's standard protection based recovery method.
41+
The proactive_alt controller slightly modifies how Helix computes path splices.
42+
43+
`RAW_RESULTS/ResLinkFail_4ms` - Contains data plane recovery results collected
44+
using a control channel latency of 4ms. This folder only contains results for
45+
the reactive controller (proactive controller results were consistent with the
46+
20ms latency results - omitted to save space).
47+
48+
To process the raw results use the `RAW_RESULTS/ResLinkFail_20ms/proc_all.sh`
49+
and `RAW_RESULTS/ResLinkFail_4ms/proc_all.sh` to process the 20ms and 4ms
50+
raw results and output the average recovery time and CI intervals.
51+
52+
53+
54+
## TE Algorithm Evaluation #
55+
56+
**Folder:** `SOSR21_TE/`
57+
58+
Helix TE algorithm evaluation results collected using YATES and presented in
59+
the paper. The paper contained the results for the AT&T MPLS topology (using
60+
the three traffic multipliers). This folder also contains results collected
61+
when evaluating Helix against the other algorithms using the Abilene topology
62+
across three traffic multipliers.
63+
64+
`ConLoss` - Folder that contains congestion loss results. Files used by the
65+
GNU plot scripts which generate graphs for the results (presented in the
66+
paper).
67+
68+
`PathChurn` - Same as `ConLoss` folder but contains path change results.
69+
70+
To generate the graphs presented in the paper for the (AT&T topology) use the
71+
commands:
72+
* `gnuplot attmpls_500.p` - Generate graph for AT\&T MPLS topology (500x
73+
multiplier)
74+
* `gnuplot attmpls_550.p` - Generate graph for AT\&T MPLS topology (550x
75+
multiplier)
76+
* `gnuplot attmpls_560.p` - Generate graph for AT\&T MPLS topology (600x
77+
multiplier)
78+
* `gnuplot abi_2_2.p` - Generate graph for Abilene topology (2.2x multiplier)
79+
* `gnuplot abi_2_8.p` - Generate graph for Abilene topology (2.8x multiplier)
80+
* `gnuplot abi_3_0.p` - Generate graph for Abilene topology (3.0x multiplier)
81+
82+
83+
84+
## Control-Plane Resilience Evaluation ##
85+
86+
**Folder:** `SOSR21_CtrlPlaneFail/`
87+
88+
Helix control plane failure resilience evaluation results collect using the
89+
emulation framework with the first scenario (presented in paper) and second
90+
scenario. The folder contains a script to check if the output data contains
91+
a validation error (`process_find_validation_error.py`) and several scripts
92+
to calculate the metrics based on the emulation framework event output. The
93+
process scripts use the file name format: `process_scen<scen>_<stage>.py` where
94+
`<scen>` represents the scenario number (i.e. 1 and 2) and `<stage>` the
95+
stage number of the experiment we are extracting relevant metrics for.
96+
97+
The `scen1_out.nostat100.txt` and `scen2_out.nostat100.txt` files contain the
98+
raw emulation framework output for our experiments (100 iterations) using the
99+
first and second scenario. `scen1_processed.txt` and `scen2_processed.txt`
100+
files contain the processed metric results from the raw results file (output
101+
of the process scripts collected in a single file).
102+
103+
The raw results were collected using the collection script
104+
`SOSR2021_SOSR2021_collect_ctrlfail.sh` from the root folder of the repository.
105+
The evaluation experiments were collected using two Helix switch-to-controller
106+
mapping files. `mdc_v2.sw_ctrl_map.json` was used to collect results for the
107+
first scenario while `mdc_v2.sw_ctrl_map.v2.json` for the second (contains
108+
extra controller instances).
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#!/usr/bin/python3
2+
3+
4+
# -----------------------------------------------------------------------------
5+
# Process scenario 1 stage 1, compute CI info for all submetrics
6+
# Iterate through a control-plane failure result experiment file to find any
7+
# validation errors in the output. The script will search for the keywords
8+
# "VALIDATION ERROR". If found, the script specifies the iteration number and
9+
# stage the validation was encountered.
10+
#
11+
# NOTE: The run and stage numbers start at 0, i.e. the first stage of the first
12+
# run is stage 0 of run 0 and the second stage of the second run is stage 1 of
13+
# run 1.
14+
# -----------------------------------------------------------------------------
15+
16+
17+
import sys
18+
19+
20+
if __name__ == "__main__":
21+
# Current run and scen being processed
22+
run = -1
23+
scen = 99999999
24+
25+
# Did we find and pass the first list of actions of the framework output?
26+
found_first = False
27+
28+
# Did we find a validation error that needs to be processed. If yes
29+
# wait for the actuall data before consuming the error (write the stage and
30+
# iteration to the console).
31+
found_error = False
32+
33+
with open(sys.argv[1]) as fin:
34+
for line in fin:
35+
line = line.strip()
36+
37+
# Check for the validation error line
38+
if "validation error" in line.lower():
39+
found_error = True
40+
continue
41+
42+
tok = line.split(",")
43+
if len(tok) == 1 and tok[0] == "-----":
44+
if found_first == False:
45+
found_first = True
46+
continue
47+
48+
# Get the scenario and compare
49+
try:
50+
tmp_scen = int(tok[0])
51+
except ValueError as e:
52+
# Skip lines with invalid scenarios (i.e. first token is not a
53+
# number)
54+
continue
55+
56+
if tmp_scen != scen:
57+
# Scenario wrapped, this is data for the next run
58+
if tmp_scen < scen:
59+
run += 1
60+
scen = tmp_scen
61+
found_first = False
62+
63+
if found_first and scen == 0:
64+
if found_error:
65+
# Consume the validation error
66+
print("Found validation error during run %s stage %s" %
67+
(run, scen))
68+
found_error = False
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#!/usr/bin/python3
2+
3+
4+
5+
import sys
6+
from argparse import ArgumentParser
7+
8+
9+
def in_range(ranges, value):
10+
""" Check if `value` is betweny a range defined by `ranges`.
11+
12+
Returns:
13+
bool: True if `value` in a range of `ranges`, false otherwise.
14+
"""
15+
for r in ranges:
16+
if value >= r["start"] and value <= r["end"]:
17+
return True
18+
return False
19+
20+
21+
if __name__ == "__main__":
22+
parser = ArgumentParser("Emulate Ctrl Fail Result Processor")
23+
parser.add_argument("--file", required=True, type=str,
24+
help="File to filter through")
25+
parser.add_argument("--run", required=False, type=int,
26+
help="Print results for iteration r")
27+
parser.add_argument("--multi", metavar="r1:r2", type=str, nargs="+",
28+
help="Prin results for iteratuin range r1 to r2 (inclusive)")
29+
parser.add_argument("--stage", required=False, type=int,
30+
help="Only print results for stage i (applies to both filter types)")
31+
args = parser.parse_args()
32+
33+
# Make sure run number is specified (otherwise print error and exit)
34+
if args.run is None and args.multi is None:
35+
print("Please provide either a run or stage number")
36+
exit(0)
37+
38+
# Process the single or multi run argument into a list of ranges
39+
run_range = []
40+
if args.run is not None:
41+
run_range.append({"start": args.run, "end": args.run})
42+
43+
if args.multi is not None:
44+
for tmp in args.multi:
45+
if ":" not in tmp:
46+
print("Invalid multi line argument format: %s" % tmp)
47+
continue
48+
tok = tmp.split(":")
49+
start = int(tok[0])
50+
end = int(tok[1])
51+
run_range.append({"start": start, "end": end})
52+
53+
# Current run and scen being processed
54+
run = -1
55+
scen = 99999999
56+
skip_valid_err = 0
57+
58+
with open(args.file) as fin:
59+
for line in fin:
60+
line = line.strip()
61+
62+
# Ignore empty lines
63+
if line == "":
64+
continue
65+
66+
# Ingore the validation error output
67+
if "!!" in line:
68+
skip_valid_err = 3
69+
continue
70+
if skip_valid_err > 0:
71+
skip_valid_err -= 1
72+
continue
73+
74+
# Tokenize the line
75+
tok = line.split(",")
76+
77+
# Get the scenario and compare
78+
try:
79+
tmp_scen = int(tok[0])
80+
except ValueError as e:
81+
# If line has no scenario process as the current scenario
82+
tmp_scen = scen
83+
84+
if tmp_scen != scen:
85+
# Scenario wrapped, this is data for the next run
86+
if tmp_scen < scen:
87+
run += 1
88+
scen = tmp_scen
89+
90+
if in_range(run_range, run):
91+
if args.stage is None or args.stage == scen:
92+
print(line)

0 commit comments

Comments
 (0)