dist_multinet.py 4.28 KB
Newer Older
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
# Copyright 2021 Max Planck Institute for Software Systems, and
# National University of Singapore
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import simbricks.experiments as exp
import simbricks.simulators as sim
import simbricks.proxy as proxy
import simbricks.nodeconfig as node
27
from simbricks.simulator_utils import create_basic_hosts
28
29
30

host_types = ['qemu', 'gem5', 'qt']
n_nets = [1, 2, 3, 4]
31
n_clients = [1, 10, 20, 30, 40, 50]
32
experiments = []
33
separate_net = False
34
35
36
separate_server = True

for host_type in host_types:
37
38
  for n in n_nets:
    for n_client in n_clients:
39
        nh = n if not separate_net else n + 1
40
        e = exp.DistributedExperiment(f'dist_multinet-{host_type}-{n}-{n_client}', nh)
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

        # host
        if host_type == 'qemu':
            host_class = sim.QemuHost
        elif host_type == 'qt':
            def qemu_timing():
                h = sim.QemuHost()
                h.sync = True
                return h
            host_class = qemu_timing
        elif host_type == 'gem5':
            host_class = sim.Gem5Host
            e.checkpoint = True
        else:
            raise NameError(host_type)

        switch_top = sim.SwitchNet()
        switch_top.name = 'switch_top'
        if host_type == 'qemu':
            switch_top.sync = False
        e.add_network(switch_top)
        e.assign_sim_host(switch_top, 0)

        for i in range(0, n):
            h_i = i if not separate_net else i + 1
            switch = sim.SwitchNet()
            switch.name = 'switch_%d' % (i,)
            if host_type == 'qemu':
                switch.sync = False
            e.add_network(switch)
            e.assign_sim_host(switch, h_i)

            switch_top.connect_network(switch)

            # create servers and clients
76
            m = n_client
77
            if i == 0 or separate_server:
78
                servers = create_basic_hosts(e, 1, 'server_%d' % (i,),
79
                        switch, sim.I40eNIC, host_class, node.I40eLinuxNode,
80
                        node.NetperfServer, ip_start = i * (n_client + 1) + 1)
81
82
83
84
                if not separate_server:
                    m = m - 1

                e.assign_sim_host(servers[0], h_i)
85
                e.assign_sim_host(servers[0].pcidevs[0], h_i)
86

87
            clients = create_basic_hosts(e, m, 'client_%d' % (i,),
88
                    switch, sim.I40eNIC, host_class, node.I40eLinuxNode,
89
                    node.NetperfClient, ip_start = i * (n_client + 1) + 2)
90
91
92
93
94
95
96
97

            for c in clients:
                c.wait = True
                c.node_config.app.server_ip = servers[0].node_config.ip
                if host_type == 'qemu':
                    c.extra_deps.append(servers[0])

                e.assign_sim_host(c, h_i)
98
                e.assign_sim_host(c.pcidevs[0], h_i)
99
100
101
102
103
104
105
106
107
108
109
110
111
112

            if h_i != 0:
                lp = proxy.SocketsNetProxyListener()
                lp.name = 'listener-%d' % (i,)
                e.add_proxy(lp)
                e.assign_sim_host(lp, h_i)

                cp = proxy.SocketsNetProxyConnecter(lp)
                cp.name = 'connecter-%d' % (i,)
                e.add_proxy(cp)
                e.assign_sim_host(cp, 0)

                lp.add_n2n(switch_top, switch)

113
            for c in clients + servers:
114
                c.pcidevs[0].start_tick = 580000000000
115

116
117
        # add to experiments
        experiments.append(e)