-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathbenchmarks.sh
executable file
·212 lines (176 loc) · 7.91 KB
/
benchmarks.sh
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#!/bin/bash
OUTPUT_DIR=${OUTPUT_DIR:-benchmarks}
FILE_100KB=${FILE_100KB:-file_100kB.bin}
FILE_1MB=${FILE_1MB:-file_1MB.bin}
FILE_100MB=${FILE_100MB:-file_100MB.bin}
FILE_100MB=${FILE_100MB:-file_100MB.bin}
FILE_500MB=${FILE_500MB:-file_500MB.bin}
SERVER_PORT=${SERVER_PORT:-5557}
SERVER_BIN=${SERVER_BIN:-./server}
CLIENT_BIN=${CLIENT_BIN:-./client}
BENCH_COUNT=${BENCH_COUNT:-5000}
BENCH_TIME=${BENCH_TIME:-2}
TLS_OVERHEAD=$((5 + 8 + 16))
DTLS_OVERHEAD=$((13 + 8 + 16))
CLIENT_EXEC="${CLIENT_BIN} --server-port ${SERVER_PORT} --server-host localhost --json --drop-caches"
function xecho {
echo ">>> $@"
}
function run_server {
${SERVER_BIN} --port ${SERVER_PORT} "$@" &
}
function stop_server {
kill -9 %%
}
function run_client {
sleep 2 # give server some time to spawn
eval ${CLIENT_EXEC} $@
}
[ `id -u` -eq 0 ] || {
echo "This script has to be run under root due to cache drops" >&2
exit 1
}
[ -d "${OUTPUT_DIR}" ] && {
xecho "Removing old output file '${OUTPUT_DIR}'"
rm -rf "${OUTPUT_DIR}"
}
mkdir -p "${OUTPUT_DIR}"
xecho "Preparing files"
[ -f "${FILE_100KB}" ] || dd if=/dev/urandom of="${FILE_100KB}" bs=1000 count=100
[ -f "${FILE_1MB}" ] || dd if=/dev/urandom of="${FILE_1MB}" bs=1000 count=1000
[ -f "${FILE_100MB}" ] || dd if=/dev/urandom of="${FILE_100MB}" bs=1000 count=100000
[ -f "${FILE_500MB}" ] || dd if=/dev/urandom of="${FILE_500MB}" bs=1000 count=500000
# we need to do comparison tests separately for Gnu TLS and AF_KTLS now because
# Gnu TLS does not handle getting recv sequence number in DTLS, see xlibgnutls.c
#
# for details of how tests are implemented, see action.c
#
# TLS note: if running test where client does not collect data from server,
# server has to be run with --no-echo, to avoid kernel recv stack to be
# fulfilled
for protocol in "--tls" "--dtls"; do
for i in `seq 1 3`; do
for payload in 1000 1280 1400 4000 6000 9000 13000 16000; do
# AF_KTLS is using MTU for raw data, without TLS/DTLS packetization
# overhead
if [ "${protocol}" == "--tls" ]; then
SENDFILE_MTU=$(( ${payload} + ${TLS_OVERHEAD} ))
else
SENDFILE_MTU=$(( ${payload} + ${DTLS_OVERHEAD} ))
fi
########## sendfile(2) vs userspace buffered copy
for file in "${FILE_100KB}" "${FILE_1MB}" "${FILE_100MB}" "${FILE_500MB}"; do
TEST_OUTPUT_DIR="${OUTPUT_DIR}/sendfile-${file}-${payload}${protocol}"
xecho "Performing benchmark, output: ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${protocol}" --no-echo
run_client "${protocol}" --sendfile "${file}" --sendfile-mtu ${SENDFILE_MTU} \
--sendfile-user ${file} --payload ${payload} \
--sendfile-mmap ${file} \
--output "${TEST_OUTPUT_DIR}/output.${i}.json"
stop_server
# now we will test without encryption
if [ ${protocol} == "--dtls" ]; then
plain_protocol="--udp"
else
plain_protocol="--tcp"
fi
TEST_OUTPUT_DIR="${OUTPUT_DIR}/plain-sendfile-${file}-${payload}${plain_protocol}"
xecho "Performing benchmark, output: ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${plain_protocol}" --no-echo
run_client "${plain_protocol}" --sendfile-mtu ${payload} \
--plain-sendfile-user ${file} \
--plain-sendfile-mmap ${file} \
--plain-sendfile ${file} \
--plain-splice-emu ${file} \
--output "${TEST_OUTPUT_DIR}/output.${i}.json"
stop_server
done
########## sendmsg(2) and recvmsg(2) - COUNT
TEST_OUTPUT_DIR="${OUTPUT_DIR}/transmission-count-${BENCH_COUNT}-${payload}${protocol}"
xecho "Performing benchmark, output ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${protocol}"
run_client "${protocol}" --send-ktls-count "${BENCH_COUNT}" --payload ${payload} \
--output "${TEST_OUTPUT_DIR}/ktls-output.${i}.json"
stop_server
run_server "${protocol}"
run_client "${protocol}" --send-gnutls-count "${BENCH_COUNT}" --payload ${payload} \
--output "${TEST_OUTPUT_DIR}/gnutls-output.${i}.json"
stop_server
########## splice(2) - COUNT
TEST_OUTPUT_DIR="${OUTPUT_DIR}/splice-count-dev-zero-${payload}${protocol}"
xecho "Performing benchmark, output: ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${protocol}" --no-echo
run_client "${protocol}" --splice-count "${BENCH_COUNT}" --payload ${payload} \
--splice-file /dev/zero --output "${TEST_OUTPUT_DIR}/output.${i}.json"
stop_server
########### splice(2) echo -- "ping-pong" - COUNT
TEST_OUTPUT_DIR="${OUTPUT_DIR}/splice-echo-count-${payload}${protocol}"
xecho "Performing benchmark, output: ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${protocol}" --mtu ${payload}
run_client "${protocol}" --splice-echo-count "${BENCH_COUNT}" --payload ${payload} \
--sendfile-mtu ${SENDFILE_MTU} --output "${TEST_OUTPUT_DIR}/output.${i}.json"
stop_server
########## sendmsg(2) and recvmsg(2) - TIME
TEST_OUTPUT_DIR="${OUTPUT_DIR}/transmission-time-${BENCH_TIME}-${payload}${protocol}"
xecho "Performing benchmark, output ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${protocol}"
run_client "${protocol}" --send-ktls-time "${BENCH_TIME}" --payload ${payload} \
--output "${TEST_OUTPUT_DIR}/ktls-output.${i}.json"
stop_server
run_server "${protocol}"
run_client "${protocol}" --send-gnutls-time "${BENCH_TIME}" --payload ${payload} \
--output "${TEST_OUTPUT_DIR}/gnutls-output.${i}.json"
stop_server
########## splice(2) - TIME
TEST_OUTPUT_DIR="${OUTPUT_DIR}/splice-time-${BENCH_TIME}-dev-zero-${payload}${protocol}"
xecho "Performing benchmark, output: ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${protocol}" --no-echo
run_client "${protocol}" --splice-time "${BENCH_TIME}" --payload ${payload} \
--splice-file /dev/zero --output "${TEST_OUTPUT_DIR}/output.${i}.json"
stop_server
########## raw send & encrypt recv - openconnect and haproxy emulation
TEST_OUTPUT_DIR="${OUTPUT_DIR}/raw-send-time-${BENCH_TIME}-${payload}${protocol}"
xecho "Performing benchmark, output: ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${protocol}" --raw-recv
run_client "${protocol}" --raw-send-time "${BENCH_TIME}" --payload ${payload} \
--output "${TEST_OUTPUT_DIR}/output.${i}.json"
stop_server
########## raw send & encrypt recv - openconnect and haproxy optimized emulation
TEST_OUTPUT_DIR="${OUTPUT_DIR}/splice-send-raw-time-${BENCH_TIME}-${payload}${protocol}"
xecho "Performing benchmark, output: ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${protocol}" --raw-recv
run_client "${protocol}" --splice-send-raw-time "${BENCH_TIME}" --payload ${payload} \
--sendfile-mtu ${SENDFILE_MTU} --output "${TEST_OUTPUT_DIR}/output.${i}.json"
stop_server
########### splice(2) echo -- "ping-pong" - TIME
TEST_OUTPUT_DIR="${OUTPUT_DIR}/splice-echo-time-${BENCH_TIME}-${payload}${protocol}"
xecho "Performing benchmark, output: ${TEST_OUTPUT_DIR}"
[ -d "${TEST_OUTPUT_DIR}" ] || mkdir "${TEST_OUTPUT_DIR}"
run_server "${protocol}" --mtu ${payload}
run_client "${protocol}" --splice-echo-time "${BENCH_TIME}" --payload ${payload} \
--sendfile-mtu ${SENDFILE_MTU} --output "${TEST_OUTPUT_DIR}/output.${i}.json"
stop_server
done
done
done
for dir in "${OUTPUT_DIR}"/*; do
find "${dir}" -iname '*.json' -exec python merge_output.py "${dir}/output.json" {} \+
done
xecho "Adding cpuinfo"
cat /proc/cpuinfo > "${OUTPUT_DIR}/cpuinfo"
for json in `find "${OUTPUT_DIR}" -iname 'output.json'`; do
xecho "Generating HTML statistics for ${json}"
outdir=`dirname "${json}"`
./af_ktls-visualize/visualize.py --html-stats --input "${json}" --output-dir "${outdir}"
done
xecho "Generating Index"
python generate_index.py "${OUTPUT_DIR}"