nodeconfig.py 21.3 KB
Newer Older
Antoine Kaufmann's avatar
Antoine Kaufmann committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 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.

23
24
from __future__ import annotations

25
import io
Jonas Kaufmann's avatar
Jonas Kaufmann committed
26
import tarfile
27
import typing as tp
28
29
30
31
32


class AppConfig(object):
    """Manages the application to be run on a simulated host."""

33
34
    # pylint: disable=unused-argument
    def run_cmds(self, node: NodeConfig):
35
36
37
38
39
40
41
42
43
44
45
46
47
48
        return []

    def prepare_pre_cp(self):
        return []

    def prepare_post_cp(self):
        return []

    def config_files(self):
        return {}

    def strfile(self, s):
        return io.BytesIO(bytes(s, encoding='UTF-8'))

49
50

class NodeConfig(object):
51
52
53

    def __init__(self):
        """Manages the configuration for a node."""
54
        super().__init__()
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
        self.sim = 'qemu'
        """Name of simulator to run."""
        self.ip = '10.0.0.1'
        """IP address."""
        self.prefix = 24
        """IP prefix."""
        self.cores = 1
        """Number of cores to be simulated."""
        self.memory = 8 * 1024
        """Amount of system memory in MB."""
        self.disk_image = 'base'
        """Disk image to use."""
        self.mtu = 1500
        """Networking MTU."""
        self.nockp = 0
        """Do not make checkpoint in Gem5."""
        self.app: tp.Optional[AppConfig] = None
        """App to be run on simulated host."""
73
74
75
76
77
78

    def config_str(self):
        if self.sim == 'qemu':
            cp_es = []
            exit_es = ['poweroff -f']
        else:
79
            if self.nockp:
80
81
82
                cp_es = []
            else:
                cp_es = ['m5 checkpoint']
83
84
            exit_es = ['m5 exit']

85
86
        es = self.prepare_pre_cp() + self.app.prepare_pre_cp() + cp_es + \
            self.prepare_post_cp() + self.app.prepare_post_cp() + \
87
88
89
90
            self.run_cmds() + self.cleanup_cmds() + exit_es
        return '\n'.join(es)

    def make_tar(self, path):
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
        with tarfile.open(path, 'w:') as tar:
            # add main run script
            cfg_i = tarfile.TarInfo('guest/run.sh')
            cfg_i.mode = 0o777
            cfg_f = self.strfile(self.config_str())
            cfg_f.seek(0, io.SEEK_END)
            cfg_i.size = cfg_f.tell()
            cfg_f.seek(0, io.SEEK_SET)
            tar.addfile(tarinfo=cfg_i, fileobj=cfg_f)
            cfg_f.close()

            # add additional config files
            for (n, f) in self.config_files().items():
                f_i = tarfile.TarInfo('guest/' + n)
                f_i.mode = 0o777
                f.seek(0, io.SEEK_END)
                f_i.size = f.tell()
                f.seek(0, io.SEEK_SET)
                tar.addfile(tarinfo=f_i, fileobj=f)
                f.close()
111
112
113

    def prepare_pre_cp(self):
        return [
114
            'set -x',
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
            'export HOME=/root',
            'export LANG=en_US',
            'export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:' + \
                '/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"'
        ]

    def prepare_post_cp(self):
        return []

    def run_cmds(self):
        return self.app.run_cmds(self)

    def cleanup_cmds(self):
        return []

    def config_files(self):
131
        return self.app.config_files()
132
133
134

    def strfile(self, s):
        return io.BytesIO(bytes(s, encoding='UTF-8'))
135

136
137
138
139

class LinuxNode(NodeConfig):

    def __init__(self):
140
141
        super().__init__()
        self.ifname = 'eth0'
142
        self.drivers = []
143
        self.force_mac_addr = None
144
145
146
147
148
149
150
151

    def prepare_post_cp(self):
        l = []
        for d in self.drivers:
            if d[0] == '/':
                l.append('insmod ' + d)
            else:
                l.append('modprobe ' + d)
152
        if self.force_mac_addr:
Jonas Kaufmann's avatar
Jonas Kaufmann committed
153
154
155
156
            l.append(
                'ip link set dev ' + self.ifname + ' address ' +
                self.force_mac_addr
            )
157
        l.append('ip link set dev ' + self.ifname + ' up')
158
        l.append(f'ip addr add {self.ip}/{self.prefix} dev {self.ifname}')
159
160
        return super().prepare_post_cp() + l

Jonas Kaufmann's avatar
Jonas Kaufmann committed
161

162
class I40eLinuxNode(LinuxNode):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
163

164
165
166
167
    def __init__(self):
        super().__init__()
        self.drivers.append('i40e')

Jonas Kaufmann's avatar
Jonas Kaufmann committed
168

169
class CorundumLinuxNode(LinuxNode):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
170

171
172
173
174
    def __init__(self):
        super().__init__()
        self.drivers.append('/tmp/guest/mqnic.ko')

175
    # pylint: disable=consider-using-with
176
    def config_files(self):
177
        m = {'mqnic.ko': open('../images/mqnic/mqnic.ko', 'rb')}
178
179
        return {**m, **super().config_files()}

Jonas Kaufmann's avatar
Jonas Kaufmann committed
180

181
class E1000LinuxNode(LinuxNode):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
182

183
184
185
    def __init__(self):
        super().__init__()
        self.drivers.append('e1000')
186
187
188


class MtcpNode(NodeConfig):
189
190
191
192
193
194
195

    def __init__(self):
        super().__init__()
        self.disk_image = 'mtcp'
        self.pci_dev = '0000:00:02.0'
        self.memory = 16 * 1024
        self.num_hugepages = 4096
196
197
198
199
200
201
202
203

    def prepare_pre_cp(self):
        return super().prepare_pre_cp() + [
            'mount -t proc proc /proc',
            'mount -t sysfs sysfs /sys',
            'mkdir -p /dev/hugepages',
            'mount -t hugetlbfs nodev /dev/hugepages',
            'mkdir -p /dev/shm',
204
            'mount -t tmpfs tmpfs /dev/shm',
205
206
207
208
209
210
211
212
            'echo ' + str(self.num_hugepages) + ' > /sys/devices/system/' + \
                    'node/node0/hugepages/hugepages-2048kB/nr_hugepages',
        ]

    def prepare_post_cp(self):
        return super().prepare_post_cp() + [
            'insmod /root/mtcp/dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko',
            '/root/mtcp/dpdk/usertools/dpdk-devbind.py -b igb_uio ' +
Jonas Kaufmann's avatar
Jonas Kaufmann committed
213
            self.pci_dev,
214
215
216
            'insmod /root/mtcp/dpdk-iface-kmod/dpdk_iface.ko',
            '/root/mtcp/dpdk-iface-kmod/dpdk_iface_main',
            'ip link set dev dpdk0 up',
217
            f'ip addr add {self.ip}/{self.prefix} dev dpdk0'
218
219
220
        ]

    def config_files(self):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
        m = {
            'mtcp.conf':
                self.strfile(
                    'io = dpdk\n'
                    'num_cores = ' + str(self.cores) + '\n'
                    'num_mem_ch = 4\n'
                    'port = dpdk0\n'
                    'max_concurrency = 4096\n'
                    'max_num_buffers = 4096\n'
                    'rcvbuf = 8192\n'
                    'sndbuf = 8192\n'
                    'tcp_timeout = 10\n'
                    'tcp_timewait = 0\n'
                    '#stat_print = dpdk0\n'
                )
        }
237
238
239

        return {**m, **super().config_files()}

Jonas Kaufmann's avatar
Jonas Kaufmann committed
240

241
class TASNode(NodeConfig):
242
243
244
245
246
247
248
249
250

    def __init__(self):
        super().__init__()
        self.disk_image = 'tas'
        self.pci_dev = '0000:00:02.0'
        self.memory = 16 * 1024
        self.num_hugepages = 4096
        self.fp_cores = 1
        self.preload = True
251
252
253
254
255
256
257
258

    def prepare_pre_cp(self):
        return super().prepare_pre_cp() + [
            'mount -t proc proc /proc',
            'mount -t sysfs sysfs /sys',
            'mkdir -p /dev/hugepages',
            'mount -t hugetlbfs nodev /dev/hugepages',
            'mkdir -p /dev/shm',
259
            'mount -t tmpfs tmpfs /dev/shm',
260
261
262
263
264
            'echo ' + str(self.num_hugepages) + ' > /sys/devices/system/' + \
                    'node/node0/hugepages/hugepages-2048kB/nr_hugepages',
        ]

    def prepare_post_cp(self):
265
        cmds = super().prepare_post_cp() + [
266
            'insmod /root/dpdk/lib/modules/5.4.46/extra/dpdk/igb_uio.ko',
267
268
            '/root/dpdk/sbin/dpdk-devbind -b igb_uio ' + self.pci_dev,
            'cd /root/tas',
269
270
271
272
            (
                f'tas/tas --ip-addr={self.ip}/{self.prefix}'
                f' --fp-cores-max={self.fp_cores} --fp-no-ints &'
            ),
273
            'sleep 1'
274
275
        ]

276
        if self.preload:
Jonas Kaufmann's avatar
Jonas Kaufmann committed
277
            cmds += ['export LD_PRELOAD=/root/tas/lib/libtas_interpose.so']
278
279
        return cmds

280

Hejing Li's avatar
Hejing Li committed
281
class I40eDCTCPNode(NodeConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
282

Hejing Li's avatar
Hejing Li committed
283
284
285
286
287
288
289
    def prepare_pre_cp(self):
        return super().prepare_pre_cp() + [
            'mount -t proc proc /proc',
            'mount -t sysfs sysfs /sys',
            'sysctl -w net.core.rmem_default=31457280',
            'sysctl -w net.core.rmem_max=31457280',
            'sysctl -w net.core.wmem_default=31457280',
Hejing Li's avatar
Hejing Li committed
290
291
292
293
294
295
            'sysctl -w net.core.wmem_max=31457280',
            'sysctl -w net.core.optmem_max=25165824',
            'sysctl -w net.ipv4.tcp_mem="786432 1048576 26777216"',
            'sysctl -w net.ipv4.tcp_rmem="8192 87380 33554432"',
            'sysctl -w net.ipv4.tcp_wmem="8192 87380 33554432"',
            'sysctl -w net.ipv4.tcp_congestion_control=dctcp',
Hejing Li's avatar
Hejing Li committed
296
297
298
299
300
301
302
            'sysctl -w net.ipv4.tcp_ecn=1'
        ]

    def prepare_post_cp(self):
        return super().prepare_post_cp() + [
            'modprobe i40e',
            'ethtool -G eth0 rx 4096 tx 4096',
303
            'ethtool -K eth0 tso off',
Hejing Li's avatar
Hejing Li committed
304
305
            'ip link set eth0 txqueuelen 13888',
            f'ip link set dev eth0 mtu {self.mtu} up',
306
            f'ip addr add {self.ip}/{self.prefix} dev eth0',
Hejing Li's avatar
Hejing Li committed
307
308
        ]

Jonas Kaufmann's avatar
Jonas Kaufmann committed
309

Hejing Li's avatar
Hejing Li committed
310
class CorundumDCTCPNode(NodeConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
311

Hejing Li's avatar
Hejing Li committed
312
313
314
315
316
317
318
    def prepare_pre_cp(self):
        return super().prepare_pre_cp() + [
            'mount -t proc proc /proc',
            'mount -t sysfs sysfs /sys',
            'sysctl -w net.core.rmem_default=31457280',
            'sysctl -w net.core.rmem_max=31457280',
            'sysctl -w net.core.wmem_default=31457280',
Hejing Li's avatar
Hejing Li committed
319
320
321
322
323
324
            'sysctl -w net.core.wmem_max=31457280',
            'sysctl -w net.core.optmem_max=25165824',
            'sysctl -w net.ipv4.tcp_mem="786432 1048576 26777216"',
            'sysctl -w net.ipv4.tcp_rmem="8192 87380 33554432"',
            'sysctl -w net.ipv4.tcp_wmem="8192 87380 33554432"',
            'sysctl -w net.ipv4.tcp_congestion_control=dctcp',
Hejing Li's avatar
Hejing Li committed
325
326
327
328
329
330
331
            'sysctl -w net.ipv4.tcp_ecn=1'
        ]

    def prepare_post_cp(self):
        return super().prepare_post_cp() + [
            'insmod mqnic.ko',
            'ip link set dev eth0 up',
332
            f'ip addr add {self.ip}/{self.prefix} dev eth0',
Hejing Li's avatar
Hejing Li committed
333
334
        ]

335
336

class LinuxFEMUNode(NodeConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
337

338
    def __init__(self):
339
        super().__init__()
340
341
342
343
344
345
346
347
348
349
350
        self.drivers = ['nvme']

    def prepare_post_cp(self):
        l = ['lspci -vvvv']
        for d in self.drivers:
            if d[0] == '/':
                l.append('insmod ' + d)
            else:
                l.append('modprobe ' + d)
        return super().prepare_post_cp() + l

Jonas Kaufmann's avatar
Jonas Kaufmann committed
351

352
class NVMEFsTest(AppConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
353

354
    def run_cmds(self, node):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
355
356
357
358
359
360
361
        return [
            'mount -t proc proc /proc',
            'mkfs.ext3 /dev/nvme0n1',
            'mount /dev/nvme0n1 /mnt',
            'dd if=/dev/urandom of=/mnt/foo bs=1024 count=1024'
        ]

362

Hejing Li's avatar
Hejing Li committed
363
class DctcpServer(AppConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
364

Hejing Li's avatar
Hejing Li committed
365
366
367
    def run_cmds(self, node):
        return ['iperf -s -w 1M -Z dctcp']

Jonas Kaufmann's avatar
Jonas Kaufmann committed
368

Hejing Li's avatar
Hejing Li committed
369
class DctcpClient(AppConfig):
370
371
372
373
374

    def __init__(self):
        super().__init__()
        self.server_ip = '192.168.64.1'
        self.is_last = False
Jonas Kaufmann's avatar
Jonas Kaufmann committed
375

Hejing Li's avatar
Hejing Li committed
376
    def run_cmds(self, node):
377
        if self.is_last:
Jonas Kaufmann's avatar
Jonas Kaufmann committed
378
379
380
381
382
            return [
                'sleep 1',
                f'iperf -w 1M -c {self.server_ip} -Z dctcp -i 1',
                'sleep 2'
            ]
Hejing Li's avatar
Hejing Li committed
383
        else:
Jonas Kaufmann's avatar
Jonas Kaufmann committed
384
385
386
387
388
389
            return [
                'sleep 1',
                f'iperf -w 1M -c {self.server_ip} -Z dctcp -i 1',
                'sleep 20'
            ]

Hejing Li's avatar
Hejing Li committed
390

Hejing Li's avatar
Hejing Li committed
391
class PingClient(AppConfig):
392
393
394
395

    def __init__(self):
        super().__init__()
        self.server_ip = '192.168.64.1'
Hejing Li's avatar
Hejing Li committed
396
397
398
399

    def run_cmds(self, node):
        return [f'ping {self.server_ip} -c 100']

Jonas Kaufmann's avatar
Jonas Kaufmann committed
400

401
class IperfTCPServer(AppConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
402

403
404
405
    def run_cmds(self, node):
        return ['iperf -s -l 32M -w 32M']

Jonas Kaufmann's avatar
Jonas Kaufmann committed
406

407
class IperfUDPServer(AppConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
408

409
410
411
    def run_cmds(self, node):
        return ['iperf -s -u']

Jonas Kaufmann's avatar
Jonas Kaufmann committed
412

413
class IperfTCPClient(AppConfig):
414
415
416
417
418
419

    def __init__(self):
        super().__init__()
        self.server_ip = '10.0.0.1'
        self.procs = 1
        self.is_last = False
420
421

    def run_cmds(self, node):
Jialin Li's avatar
Jialin Li committed
422

Jonas Kaufmann's avatar
Jonas Kaufmann committed
423
424
425
426
427
        cmds = [
            'sleep 1',
            'iperf -l 32M -w 32M  -c ' + self.server_ip + ' -i 1 -P ' +
            str(self.procs)
        ]
Hejing Li's avatar
Hejing Li committed
428
429
430
431
432
        if self.is_last:
            cmds.append('sleep 0.5')
        else:
            cmds.append('sleep 10')
        return cmds
433

Jonas Kaufmann's avatar
Jonas Kaufmann committed
434

435
class IperfUDPClient(AppConfig):
436
437
438
439
440
441

    def __init__(self):
        super().__init__()
        self.server_ip = '10.0.0.1'
        self.rate = '150m'
        self.is_last = False
442
443

    def run_cmds(self, node):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
444
445
446
447
        cmds = [
            'sleep 1',
            'iperf -c ' + self.server_ip + ' -i 1 -u -b ' + self.rate
        ]
Jialin Li's avatar
Jialin Li committed
448

Hejing Li's avatar
Hejing Li committed
449
450
451
        if self.is_last:
            cmds.append('sleep 0.5')
        else:
Hejing Li's avatar
Hejing Li committed
452
            cmds.append('sleep 10')
Jialin Li's avatar
Jialin Li committed
453

Hejing Li's avatar
Hejing Li committed
454
455
        return cmds

Jonas Kaufmann's avatar
Jonas Kaufmann committed
456

457
class IperfUDPShortClient(AppConfig):
458
459
460
461
462
463

    def __init__(self):
        super().__init__()
        self.server_ip = '10.0.0.1'
        self.rate = '150m'
        self.is_last = False
464
465

    def run_cmds(self, node):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
466
        cmds = ['sleep 1', 'iperf -c ' + self.server_ip + ' -u -n 1 ']
467
468
469

        return cmds

Jialin Li's avatar
Jialin Li committed
470

471
class IperfUDPClientSleep(AppConfig):
472
473
474
475
476

    def __init__(self):
        super().__init__()
        self.server_ip = '10.0.0.1'
        self.rate = '150m'
Jonas Kaufmann's avatar
Jonas Kaufmann committed
477

478
    def run_cmds(self, node):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
479
        return ['sleep 1', 'sleep 10']
480

Hejing Li's avatar
Hejing Li committed
481
482

class NoTraffic(AppConfig):
483
484
485
486
487

    def __init__(self):
        super().__init__()
        self.is_sleep = 1
        self.is_server = 0
Jonas Kaufmann's avatar
Jonas Kaufmann committed
488

Hejing Li's avatar
Hejing Li committed
489
490
    def run_cmds(self, node):
        cmds = []
491
        if self.is_server:
Hejing Li's avatar
Hejing Li committed
492
493
            cmds.append('sleep infinity')
        else:
494
            if self.is_sleep:
Hejing Li's avatar
Hejing Li committed
495
                cmds.append('sleep 10')
Jialin Li's avatar
Jialin Li committed
496

Hejing Li's avatar
Hejing Li committed
497
            else:
Jialin Li's avatar
Jialin Li committed
498
                cmds.append('dd if=/dev/urandom of=/dev/null count=500000')
Hejing Li's avatar
Hejing Li committed
499
500
501

        return cmds

Jonas Kaufmann's avatar
Jonas Kaufmann committed
502

503
class NetperfServer(AppConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
504

505
    def run_cmds(self, node):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
506
507
        return ['netserver', 'sleep infinity']

508
509

class NetperfClient(AppConfig):
510
511
512
513
514
515

    def __init__(self):
        super().__init__()
        self.server_ip = '10.0.0.1'
        self.duration_tp = 10
        self.duration_lat = 10
Jonas Kaufmann's avatar
Jonas Kaufmann committed
516

517
    def run_cmds(self, node):
518
519
520
521
522
523
524
525
526
        return [
            'netserver',
            'sleep 0.5',
            f'netperf -H {self.server_ip} -l {self.duration_tp}',
            (
                f'netperf -H {self.server_ip} -l {self.duration_lat} -t TCP_RR'
                ' -- -o mean_latency,p50_latency,p90_latency,p99_latency'
            )
        ]
527

Jonas Kaufmann's avatar
Jonas Kaufmann committed
528

Jialin Li's avatar
Jialin Li committed
529
class VRReplica(AppConfig):
530
531
532
533

    def __init__(self):
        super().__init__()
        self.index = 0
Jonas Kaufmann's avatar
Jonas Kaufmann committed
534

535
    def run_cmds(self, node):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
536
537
538
539
540
        return [
            '/root/nopaxos/bench/replica -c /root/nopaxos.config -i ' +
            str(self.index) + ' -m vr'
        ]

541

Jialin Li's avatar
Jialin Li committed
542
class VRClient(AppConfig):
543
544
545
546

    def __init__(self):
        super().__init__()
        self.server_ips = []
Jonas Kaufmann's avatar
Jonas Kaufmann committed
547

548
    def run_cmds(self, node):
549
550
        cmds = []
        for ip in self.server_ips:
551
            cmds.append('ping -c 2 ' + ip)
Jonas Kaufmann's avatar
Jonas Kaufmann committed
552
553
554
555
        cmds.append(
            '/root/nopaxos/bench/client -c /root/nopaxos.config ' +
            '-m vr -u 2 -h ' + node.ip
        )
556
557
        return cmds

Jonas Kaufmann's avatar
Jonas Kaufmann committed
558

Jialin Li's avatar
Jialin Li committed
559
class NOPaxosReplica(AppConfig):
560
561
562
563

    def __init__(self):
        super().__init__()
        self.index = 0
Jonas Kaufmann's avatar
Jonas Kaufmann committed
564

Jialin Li's avatar
Jialin Li committed
565
    def run_cmds(self, node):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
566
567
568
569
570
        return [
            '/root/nopaxos/bench/replica -c /root/nopaxos.config -i ' +
            str(self.index) + ' -m nopaxos'
        ]

Jialin Li's avatar
Jialin Li committed
571
572

class NOPaxosClient(AppConfig):
573
574
575
576
577
578

    def __init__(self):
        super().__init__()
        self.server_ips = []
        self.is_last = False
        self.use_ehseq = False
579

580
581
582
    def run_cmds(self, node):
        cmds = []
        for ip in self.server_ips:
583
            cmds.append('ping -c 2 ' + ip)
Jialin Li's avatar
Jialin Li committed
584
585
586
587
588
        cmd = '/root/nopaxos/bench/client -c /root/nopaxos.config ' + \
                '-m nopaxos -u 2 -h ' + node.ip
        if self.use_ehseq:
            cmd += ' -e'
        cmds.append(cmd)
589
590
591
592
        if self.is_last:
            cmds.append('sleep 1')
        else:
            cmds.append('sleep infinity')
593
        return cmds
594

Jonas Kaufmann's avatar
Jonas Kaufmann committed
595

596
class NOPaxosSequencer(AppConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
597

598
    def run_cmds(self, node):
599
600
601
602
        return [(
            '/root/nopaxos/sequencer/sequencer -c /root/nopaxos.config'
            ' -m nopaxos'
        )]
603
604
605


class RPCServer(AppConfig):
606
607
608
609
610
611
612

    def __init__(self):
        super().__init__()
        self.port = 1234
        self.threads = 1
        self.max_flows = 1234
        self.max_bytes = 1024
613
614
615
616

    def run_cmds(self, node):
        exe = 'echoserver_linux' if not isinstance(node, MtcpNode) else \
            'echoserver_mtcp'
Jonas Kaufmann's avatar
Jonas Kaufmann committed
617
618
        return [
            'cd /root/tasbench/micro_rpc',
619
620
621
622
            (
                f'./{exe} {self.port} {self.threads} /tmp/guest/mtcp.conf'
                f' {self.max_flows} {self.max_bytes}'
            )
Jonas Kaufmann's avatar
Jonas Kaufmann committed
623
624
        ]

625
626

class RPCClient(AppConfig):
627
628
629
630
631
632
633
634
635
636
637
638
639

    def __init__(self):
        super().__init__()
        self.server_ip = '10.0.0.1'
        self.port = 1234
        self.threads = 1
        self.max_flows = 128
        self.max_bytes = 1024
        self.max_pending = 1
        self.openall_delay = 2
        self.max_msgs_conn = 0
        self.max_pend_conns = 8
        self.time = 25
640
641
642
643

    def run_cmds(self, node):
        exe = 'testclient_linux' if not isinstance(node, MtcpNode) else \
            'testclient_mtcp'
Jonas Kaufmann's avatar
Jonas Kaufmann committed
644
645
        return [
            'cd /root/tasbench/micro_rpc',
646
647
648
649
650
            (
                f'./{exe} {self.server_ip} {self.port} {self.threads}'
                f' /tmp/guest/mtcp.conf {self.max_bytes} {self.max_pending}'
                f' {self.max_flows} {self.openall_delay} {self.max_msgs_conn}'
                f' {self.max_pend_conns} &'
Jonas Kaufmann's avatar
Jonas Kaufmann committed
651
            ),
652
            f'sleep {self.time}'
Jonas Kaufmann's avatar
Jonas Kaufmann committed
653
        ]
654
655
656
657


################################################################################

Jonas Kaufmann's avatar
Jonas Kaufmann committed
658

659
class HTTPD(AppConfig):
660
661
662
663
664
665
666

    def __init__(self):
        super().__init__()
        self.threads = 1
        self.file_size = 64
        self.mtcp_config = 'lighttpd.conf'
        self.httpd_dir = ''  # TODO added because doesn't originally exist
667
668

    def prepare_pre_cp(self):
669
670
671
672
673
674
675
        return [
            'mkdir -p /srv/www/htdocs/ /tmp/lighttpd/',
            (
                f'dd if=/dev/zero of=/srv/www/htdocs/file bs={self.file_size}'
                ' count=1'
            )
        ]
676
677

    def run_cmds(self, node):
678
679
680
681
682
683
684
        return [
            f'cd {self.httpd_dir}/src/',
            (
                f'./lighttpd -D -f ../doc/config/{self.mtcp_config}'
                f' -n {self.threads} -m ./.libs/'
            )
        ]
685

Jonas Kaufmann's avatar
Jonas Kaufmann committed
686

687
class HTTPDLinux(HTTPD):
688
689
690
691

    def __init__(self):
        super().__init__()
        self.httpd_dir = '/root/mtcp/apps/lighttpd-mtlinux'
692

Jonas Kaufmann's avatar
Jonas Kaufmann committed
693

694
class HTTPDLinuxRPO(HTTPD):
695
696
697
698

    def __init__(self):
        super().__init__()
        self.httpd_dir = '/root/mtcp/apps/lighttpd-mtlinux-rop'
699

Jonas Kaufmann's avatar
Jonas Kaufmann committed
700

701
class HTTPDMtcp(HTTPD):
702
703
704
705
706

    def __init__(self):
        super().__init__()
        self.httpd_dir = '/root/mtcp/apps/lighttpd-mtcp'
        self.mtcp_config = 'm-lighttpd.conf'
707
708
709

    def prepare_pre_cp(self):
        return super().prepare_pre_cp() + [
710
711
712
713
714
715
            f'cp /tmp/guest/mtcp.conf {self.httpd_dir}/src/mtcp.conf',
            (
                'sed -i "s:^server.document-root =.*:server.document-root = '
                'server_root + \\"/htdocs\\":" '
                f'{self.httpd_dir}/doc/config/{self.mtcp_config}'
            )
716
717
718
719
        ]


class HTTPC(AppConfig):
720
721
722
723
724
725
726
727
728
729

    def __init__(self):
        super().__init__()
        self.server_ip = '10.0.0.1'
        self.conns = 1000
        #self.requests = 10000000
        self.requests = 10000
        self.threads = 1
        self.url = '/file'
        self.ab_dir = ''  # TODO added because doesn't originally exist
730
731

    def run_cmds(self, node):
732
733
734
735
736
737
738
        return [
            f'cd {self.ab_dir}/support/',
            (
                f'./ab -N {self.threads} -c {self.conns} -n {self.requests}'
                f' {self.server_ip}{self.url}'
            )
        ]
739

Jonas Kaufmann's avatar
Jonas Kaufmann committed
740

741
class HTTPCLinux(HTTPC):
742
743
744
745

    def __init__(self):
        super().__init__()
        self.ab_dir = '/root/mtcp/apps/ab-linux'
746

Jonas Kaufmann's avatar
Jonas Kaufmann committed
747

748
class HTTPCMtcp(HTTPC):
749
750
751
752

    def __init__(self):
        super().__init__()
        self.ab_dir = '/root/mtcp/apps/ab-mtcp'
753
754
755

    def prepare_pre_cp(self):
        return super().prepare_pre_cp() + [
756
757
            f'cp /tmp/guest/mtcp.conf {self.ab_dir}/support/config/mtcp.conf',
            f'rm -f {self.ab_dir}/support/config/arp.conf'
758
759
760
        ]


761
class MemcachedServer(AppConfig):
Jonas Kaufmann's avatar
Jonas Kaufmann committed
762

763
764
765
    def run_cmds(self, node):
        return ['memcached -u root -t 1 -c 4096']

Jonas Kaufmann's avatar
Jonas Kaufmann committed
766

767
class MemcachedClient(AppConfig):
768
769
770
771
772
773
774

    def __init__(self):
        super().__init__()
        self.server_ips = ['10.0.0.1']
        self.threads = 1
        self.concurrency = 1
        self.throughput = '1k'
Jonas Kaufmann's avatar
Jonas Kaufmann committed
775

776
777
778
    def run_cmds(self, node):
        servers = [ip + ':11211' for ip in self.server_ips]
        servers = ','.join(servers)
779
780
781
782
783
        return [(
            f'memaslap --binary --time 10s --server={servers}'
            f' --thread={self.threads} --concurrency={self.concurrency}'
            f' --tps={self.throughput} --verbose'
        )]