69 lines
1.6 KiB
Bash
Executable File
69 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# Stress test for the HTTP server's arena memory management.
|
|
# Sends requests in rounds and reports memory stats per round.
|
|
|
|
set -e
|
|
|
|
PORT=9876
|
|
|
|
# Build
|
|
echo "building..."
|
|
zig build
|
|
SRC=examples/32-http-server.sx
|
|
cp "$SRC" "$SRC.bak"
|
|
sed "s/PORT :: 8080/PORT :: $PORT/" "$SRC.bak" > "$SRC"
|
|
./zig-out/bin/sx build examples/32-http-server.sx -o /tmp/sx-http-stress
|
|
mv "$SRC.bak" "$SRC"
|
|
|
|
# Start server
|
|
/tmp/sx-http-stress &
|
|
SERVER_PID=$!
|
|
sleep 0.3
|
|
|
|
if ! kill -0 $SERVER_PID 2>/dev/null; then
|
|
echo "FAIL: server did not start"
|
|
exit 1
|
|
fi
|
|
|
|
cleanup() {
|
|
kill $SERVER_PID 2>/dev/null || true
|
|
wait $SERVER_PID 2>/dev/null || true
|
|
rm -f /tmp/sx-http-stress
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
initial_rss=$(ps -o rss= -p $SERVER_PID | tr -d ' ')
|
|
|
|
run_round() {
|
|
local count=$1
|
|
local failures=0
|
|
|
|
for i in $(seq 1 $count); do
|
|
resp=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:$PORT 2>/dev/null) || true
|
|
if [ "$resp" != "200" ]; then
|
|
failures=$((failures + 1))
|
|
fi
|
|
done
|
|
|
|
local rss=$(ps -o rss= -p $SERVER_PID | tr -d ' ')
|
|
local delta=$((rss - initial_rss))
|
|
printf " %-8s requests → RSS: %s KB (delta: %+d KB, %d failed)\n" "$count" "$rss" "$delta" "$failures"
|
|
}
|
|
|
|
echo ""
|
|
echo "initial RSS: ${initial_rss} KB"
|
|
echo ""
|
|
|
|
run_round 2000
|
|
run_round 3000
|
|
run_round 10000
|
|
|
|
final_rss=$(ps -o rss= -p $SERVER_PID | tr -d ' ')
|
|
total=$((2000 + 3000 + 10000))
|
|
echo ""
|
|
echo "--- summary ---"
|
|
echo "total requests: $total"
|
|
echo "initial RSS: ${initial_rss} KB"
|
|
echo "final RSS: ${final_rss} KB"
|
|
echo "total delta: $((final_rss - initial_rss)) KB"
|