mirror of
https://github.com/puma/puma.git
synced 2022-11-09 13:48:40 -05:00
7af9807778
Ruby MRI when used can at most process a single thread concurrently due to GVL. This results in a over-utilisation if unfavourable distribution of connections is happening. This tries to prefer less-busy workers (ie. faster to accept the connection) to improve workers utilisation.
102 lines
2.2 KiB
Bash
Executable file
102 lines
2.2 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
set -eo pipefail
|
|
|
|
ITERATIONS=400000
|
|
HOST=127.0.0.1:9292
|
|
URL="http://$HOST/cpu/$ITERATIONS"
|
|
|
|
MIN_WORKERS=1
|
|
MAX_WORKERS=4
|
|
|
|
MIN_THREADS=4
|
|
MAX_THREADS=4
|
|
|
|
DURATION=2
|
|
MIN_CONCURRENT=1
|
|
MAX_CONCURRENT=8
|
|
|
|
retry() {
|
|
local tries="$1"
|
|
local sleep="$2"
|
|
shift 2
|
|
|
|
for i in $(seq 1 $tries); do
|
|
if eval "$@"; then
|
|
return 0
|
|
fi
|
|
|
|
sleep "$sleep"
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
ms() {
|
|
VALUE=$(cat)
|
|
FRAC=${VALUE%%[ums]*}
|
|
case "$VALUE" in
|
|
*us)
|
|
echo "scale=1; ${FRAC}/1000" | bc
|
|
;;
|
|
|
|
*ms)
|
|
echo "scale=1; ${FRAC}/1" | bc
|
|
;;
|
|
|
|
*s)
|
|
echo "scale=1; ${FRAC}*1000/1" | bc
|
|
;;
|
|
esac
|
|
}
|
|
|
|
run_wrk() {
|
|
result=$(wrk -H "Connection: Close" -c "$wrk_c" -t "$wrk_t" -d "$DURATION" --latency "$@" | tee -a wrk.txt)
|
|
req_sec=$(echo "$result" | grep "^Requests/sec:" | awk '{print $2}')
|
|
latency_avg=$(echo "$result" | grep "^\s*Latency.*%" | awk '{print $2}' | ms)
|
|
latency_stddev=$(echo "$result" | grep "^\s*Latency.*%" | awk '{print $3}' | ms)
|
|
latency_50=$(echo "$result" | grep "^\s*50%" | awk '{print $2}' | ms)
|
|
latency_75=$(echo "$result" | grep "^\s*75%" | awk '{print $2}' | ms)
|
|
latency_90=$(echo "$result" | grep "^\s*90%" | awk '{print $2}' | ms)
|
|
latency_99=$(echo "$result" | grep "^\s*99%" | awk '{print $2}' | ms)
|
|
|
|
echo -e "$workers\t$threads\t$wrk_c\t$wrk_t\t$req_sec\t$latency_avg\t$latency_stddev\t$latency_50\t$latency_75\t$latency_90\t$latency_99"
|
|
}
|
|
|
|
run_concurrency_tests() {
|
|
echo
|
|
echo -e "PUMA_W\tPUMA_T\tWRK_C\tWRK_T\tREQ_SEC\tL_AVG\tL_DEV\tL_50%\tL_75%\tL_90%\tL_99%"
|
|
for wrk_c in $(seq $MIN_CONCURRENT $MAX_CONCURRENT); do
|
|
wrk_t="$wrk_c"
|
|
eval "$@"
|
|
sleep 1
|
|
done
|
|
echo
|
|
}
|
|
|
|
with_puma() {
|
|
# start puma and wait for 10s for it to start
|
|
bundle exec bin/puma -w "$workers" -t "$threads" -b "tcp://$HOST" -C test/config/cpu_spin.rb &
|
|
local puma_pid=$!
|
|
trap "kill $puma_pid" EXIT
|
|
|
|
# wait for Puma to be up
|
|
if ! retry 10 1s curl --fail "$URL" &>/dev/null; then
|
|
echo "Failed to connect to $URL."
|
|
return 1
|
|
fi
|
|
|
|
# execute testing command
|
|
eval "$@"
|
|
kill "$puma_pid" || true
|
|
trap - EXIT
|
|
wait
|
|
}
|
|
|
|
for workers in $(seq $MIN_WORKERS $MAX_WORKERS); do
|
|
for threads in $(seq $MIN_THREADS $MAX_THREADS); do
|
|
with_puma \
|
|
run_concurrency_tests \
|
|
run_wrk "$URL"
|
|
done
|
|
done
|