|
1 | 1 | #!/bin/bash |
| 2 | + |
2 | 3 | set -e |
3 | | -cd "$(dirname "$0")" |
| 4 | +set -o pipefail |
4 | 5 |
|
5 | | -TIME=${2:-30} |
| 6 | +cd "$(dirname "$0")" |
6 | 7 |
|
7 | 8 | server_address() { |
8 | | - limactl shell server ip -j -4 addr show dev lima0 | jq -r '.[0].addr_info[0].local' |
| 9 | + limactl shell perf1 ip -j -4 addr show dev lima0 | jq -r '.[0].addr_info[0].local' |
9 | 10 | } |
10 | 11 |
|
11 | 12 | create() { |
12 | | - limactl create --name server --tty=false lima.yaml & |
13 | | - limactl create --name client --tty=false lima.yaml & |
| 13 | + echo "[perf] Creating $count vms" |
| 14 | + for i in $(seq $count); do |
| 15 | + limactl create --name perf$i --tty=false lima.yaml & |
| 16 | + done |
14 | 17 | wait |
15 | 18 | } |
16 | 19 |
|
17 | | -host-to-vm() { |
18 | | - limactl start server |
19 | | - limactl shell server sudo systemctl start iperf3.service |
20 | | - iperf3-darwin --client $(server_address) --time $TIME |
21 | | - limactl stop server |
| 20 | +delete() { |
| 21 | + echo "[perf] Delete $count vms" |
| 22 | + for i in $(seq $count); do |
| 23 | + limactl delete -f perf$i |
| 24 | + done |
22 | 25 | } |
23 | 26 |
|
24 | | -host-to-vm-2() { |
25 | | - limactl start server & |
26 | | - limactl start client & |
27 | | - wait |
28 | | - limactl shell server sudo systemctl start iperf3.service |
29 | | - iperf3-darwin --client $(server_address) --time $TIME |
30 | | - limactl stop server |
31 | | - limactl stop client |
| 27 | +run() { |
| 28 | + echo "[perf] Updating vms" |
| 29 | + update_vms |
| 30 | + |
| 31 | + echo "[perf] Starting vms" |
| 32 | + start_vms |
| 33 | + |
| 34 | + echo "[perf] Starting iperf3 service" |
| 35 | + limactl shell perf1 sudo systemctl start iperf3.service >>perf.log |
| 36 | + |
| 37 | + config="$out_dir/$mode-$vm_type-$count" |
| 38 | + mkdir -p "$config" |
| 39 | + addr=$(server_address) |
| 40 | + |
| 41 | + echo "[perf] Running $config/host-to-vm" |
| 42 | + iperf3-darwin --client $addr --time $time --json > "$config/host-to-vm.json" |
| 43 | + |
| 44 | + echo "[perf] Running $config/vm-to-host" |
| 45 | + iperf3-darwin --client $addr --time $time --reverse --json > "$config/vm-to-host.json" |
| 46 | + |
| 47 | + if [ $count -gt 1 ]; then |
| 48 | + echo "[perf] Running $config/vm-to-vm" |
| 49 | + limactl shell perf2 iperf3 --client $addr --time $time --json > "$config/vm-to-vm.json" |
| 50 | + fi |
| 51 | + |
| 52 | + echo "[perf] Stopping vms" |
| 53 | + stop_vms |
| 54 | +} |
| 55 | + |
| 56 | +update_vms() { |
| 57 | + socket="/var/run/socket_vmnet" |
| 58 | + if [ "$mode" = "bridged" ]; then |
| 59 | + socket+=".bridged.$iface" |
| 60 | + fi |
| 61 | + for i in $(seq $count); do |
| 62 | + limactl edit perf$i --tty=false \ |
| 63 | + --set ".vmType = \"$vm_type\" | .networks[0].socket = \"$socket\"" |
| 64 | + done |
32 | 65 | } |
33 | 66 |
|
34 | | -vm-to-vm() { |
35 | | - limactl start server & |
36 | | - limactl start client & |
| 67 | +start_vms() { |
| 68 | + for i in $(seq $count); do |
| 69 | + limactl start perf$i & |
| 70 | + done |
37 | 71 | wait |
38 | | - limactl shell server sudo systemctl start iperf3.service |
39 | | - addr=$(server_address) |
40 | | - limactl shell client iperf3 --client $addr --time $TIME |
41 | | - limactl stop server |
42 | | - limactl stop client |
43 | 72 | } |
44 | 73 |
|
45 | | -delete() { |
46 | | - limactl delete -f server |
47 | | - limactl delete -f client |
| 74 | +stop_vms() { |
| 75 | + for i in $(seq $count); do |
| 76 | + limactl stop perf$i |
| 77 | + done |
| 78 | +} |
| 79 | + |
| 80 | +usage() { |
| 81 | + echo "Usage $0 command [options]" |
| 82 | + echo |
| 83 | + echo "Commands:" |
| 84 | + echo " create create test vms" |
| 85 | + echo " delete delete test vms" |
| 86 | + echo " run run benchmarks" |
| 87 | + echo |
| 88 | + echo "Options:" |
| 89 | + echo " -c COUNT number of vms" |
| 90 | + echo " -t SECONDS time in seconds to transmit for (default 30)" |
| 91 | + echo " -v VM_TYPE lima vmType [vz, qemu] (default vz)" |
| 92 | + echo " -b IFACE if set, use lima bridged network with IFACE" |
| 93 | + echo " -o OUT_DIR output directory (default perf.out)" |
48 | 94 | } |
49 | 95 |
|
| 96 | +# Defaults |
| 97 | +count=2 |
| 98 | +time=30 |
| 99 | +vm_type=vz |
| 100 | +mode=shared |
| 101 | +iface= |
| 102 | +out_dir=perf.out |
| 103 | + |
50 | 104 | case $1 in |
51 | | -create) |
52 | | - create |
53 | | - ;; |
54 | | -host-to-vm) |
55 | | - host-to-vm |
56 | | - ;; |
57 | | -host-to-vm-2) |
58 | | - host-to-vm-2 |
59 | | - ;; |
60 | | -vm-to-vm) |
61 | | - vm-to-vm |
62 | | - ;; |
63 | | -delete) |
64 | | - delete |
| 105 | +create|delete|run) |
| 106 | + command=$1 |
| 107 | + shift |
65 | 108 | ;; |
66 | 109 | *) |
67 | | - echo "Usage $0 command" |
68 | | - echo |
69 | | - echo "Available commands:" |
70 | | - echo " create create test vms" |
71 | | - echo " delete delete test vms" |
72 | | - echo " host-to-vm [TIME] test host to vm performance" |
73 | | - echo " host-to-vm-2 [TIME] test host to vm performance with 1 extra vm" |
74 | | - echo " vm-to-vm [TIME] test vm to vm performance" |
| 110 | + usage |
| 111 | + exit 1 |
75 | 112 | ;; |
76 | 113 | esac |
| 114 | + |
| 115 | +args=$(getopt c:t:v:b:o: $*) |
| 116 | +if [ $? -ne 0 ]; then |
| 117 | + usage |
| 118 | + exit 1 |
| 119 | +fi |
| 120 | + |
| 121 | +set -- $args |
| 122 | + |
| 123 | +while :; do |
| 124 | + case $1 in |
| 125 | + -c) |
| 126 | + count=$2 |
| 127 | + shift; shift |
| 128 | + ;; |
| 129 | + -t) |
| 130 | + time=$2 |
| 131 | + shift; shift |
| 132 | + ;; |
| 133 | + -v) |
| 134 | + vm_type="$2" |
| 135 | + shift; shift |
| 136 | + ;; |
| 137 | + -b) |
| 138 | + mode=bridged |
| 139 | + iface="$2" |
| 140 | + shift; shift |
| 141 | + ;; |
| 142 | + -o) |
| 143 | + out_dir="$2" |
| 144 | + shift; shift |
| 145 | + ;; |
| 146 | + --) |
| 147 | + shift; break; |
| 148 | + ;; |
| 149 | + esac |
| 150 | +done |
| 151 | + |
| 152 | +$command |
0 commit comments