-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtest_droptail.py
170 lines (124 loc) · 5.39 KB
/
test_droptail.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
import datetime
import os
import random
import time
import ray
from ray.rllib.agents import ppo
from gym_lr.rl_src.configurations import SINGLE_SWITCH_EVAL_TOPO_PARAMS, NUM_OF_EPISODES_TO_TEST, \
SINGLE_SWITCH_TEST_CONFIG
from gym_lr.envs.realnet_networks import RealPfifoNet, EGRESS_IF, INGRESS_IF
from utils import create_log_dir, write_params_log
os.nice(-20)
def build_setup(label, topo_params, seed=None):
log_dir = f"logs/{label}"
create_log_dir(log_dir)
print(label)
config = SINGLE_SWITCH_TEST_CONFIG
config['env_config']['label'] = label
config['env_config'].update(topo_params)
config['env_config'].update({'egress_if': EGRESS_IF,
'ingress_if': INGRESS_IF})
seed = int(random.uniform(0, 2 ** 32 - 1)) if (seed is None) else seed
config['seed'] = seed
random.seed(seed)
real_net = RealPfifoNet(qdisc_params=topo_params)
config['env_config'].update({'real_net': real_net})
config["env_config"]["create_bpf"] = False
agent = ppo.PPOTrainer(config=config, env="single_tail_drop_switch_env")
config["env_config"]["create_bpf"] = True
env = agent.env_creator(config["env_config"])
write_params_log(log_dir=log_dir, algorithm="Droptail",
first_topo_param=topo_params,
label=label)
return real_net, agent, env
def change_setup_params(label, real_net, agent, env, new_topo_params):
real_net.change_topo_params(new_topo_params)
agent.workers.foreach_worker(
lambda ev: ev.foreach_env(
lambda env: env.change_topo(new_topo_params)))
env.change_topo(new_topo_params)
create_log_dir(f"logs/{label}")
env.change_log_dir(label)
def test_single_env(topo_params, real_net, agent, env, start_flows_func):
real_net.kill_connections()
real_net.set_next_router_qdisc(max_buf=10000)
real_net.start_qdiscs(delay=topo_params["delay"])
real_net.start_server_iperfs(no_senders=topo_params["no_senders"])
for ii in range(NUM_OF_EPISODES_TO_TEST):
episode_reward = 0
done = False
reward = 0
obs = env.reset()
start_flows_func(no_senders=topo_params["no_senders"])
while not done:
obs, reward, done, info = env.step()
episode_reward += reward
real_net.kill_senders()
real_net.kill_tshark()
env.reset()
def test_single_fct_env(topo_params, real_net, agent, env, msg_size, label):
real_net.kill_connections()
real_net.set_next_router_qdisc(max_buf=10000)
real_net.start_qdiscs(delay=topo_params["delay"])
real_net.start_server_iperfs(no_senders=topo_params["no_senders"])
for ii in range(NUM_OF_EPISODES_TO_TEST):
episode_reward = 0
done = False
reward = 0
obs = env.reset()
real_net.start_fct_senders_iperfs(no_senders=topo_params["no_senders"],
tshark_log=label, ep=ii, msg_size=f"{msg_size}")
while not done:
obs, reward, done, info = env.step()
episode_reward += reward
real_net.kill_senders()
real_net.kill_tshark()
env.reset()
def close_all(env, real_net, agent):
env.reset()
real_net.kill_connections()
real_net.kill_tshark()
agent.stop()
env.close()
def run():
label = "test_droptail_"
initial_topo_params = SINGLE_SWITCH_EVAL_TOPO_PARAMS
start = time.time()
print(f'Starting droptail test at {datetime.datetime.now().isoformat(sep=" ", timespec="seconds")}')
ray.init()
real_net, agent, env = build_setup(label=label, topo_params=initial_topo_params)
test_single_env(initial_topo_params, real_net, agent, env, real_net.start_senders_iperfs)
close_all(env, real_net, agent)
ray.shutdown()
print(f'Completed at {datetime.datetime.now().isoformat(sep=" ", timespec="seconds")} ; '
f'{str(datetime.timedelta(seconds=time.time() - start))}')
def run_auto_tune():
label = "test_droptail_automatic_tuning_"
initial_topo_params = SINGLE_SWITCH_EVAL_TOPO_PARAMS
start = time.time()
print(f'Starting droptail test at {datetime.datetime.now().isoformat(sep=" ", timespec="seconds")}')
ray.init()
real_net, agent, env = build_setup(label=label, topo_params=initial_topo_params)
test_single_env(initial_topo_params, real_net, agent, env, real_net.start_changing_load_senders_iperfs)
close_all(env, real_net, agent)
ray.shutdown()
print(f'Completed at {datetime.datetime.now().isoformat(sep=" ", timespec="seconds")} ; '
f'{str(datetime.timedelta(seconds=time.time() - start))}')
def run_fct():
base_label = "test_droptail_FCT_"
initial_topo_params = SINGLE_SWITCH_EVAL_TOPO_PARAMS
start = time.time()
print(f'Starting droptail FCT test at {datetime.datetime.now().isoformat(sep=" ", timespec="seconds")}')
ray.init()
for msg_size in ["1k", "10k", "100k", "1m", "10m"]:
label = f"{base_label}_{msg_size}"
real_net, agent, env = build_setup(label=label, topo_params=initial_topo_params)
test_single_fct_env(initial_topo_params, real_net, agent, env, msg_size=msg_size, label=label)
close_all(env, real_net, agent)
ray.shutdown()
print(f'Completed at {datetime.datetime.now().isoformat(sep=" ", timespec="seconds")} ; '
f'{str(datetime.timedelta(seconds=time.time() - start))}')
if __name__ == '__main__':
run()
# run_auto_tune()
# run_fct()