This repo/gist is a tiny, self-contained repro to demonstrate the tradeoff discussed in puma/puma#3867.
- Spins up Puma in Docker.
- Provides two endpoints:
/ok(fast)/slow(CPU burn forSLOW_BURN_MS, default 50ms)
- Runs an “abort storm” client that sends a request to
/slowthen immediately RSTs the socket (SO_LINGER=0). - Measures
/okthroughput with wrk while the abort storm is running.
Dockerfile– builds a Ruby image with Puma.config.ru– app with/okand/slow.puma.rb– allows disablingclosed_socket?viaDISABLE_CLOSED_SOCKET_CHECK=1.
cd /tmp/puma-closed-socket-bench
docker build -t puma-closed-socket-bench:latest .docker run -d --rm -p 9292:9292 --name puma-bench -e SLOW_BURN_MS=50 puma-closed-socket-bench:latestdocker run -d --rm --name abort-storm ruby:3.3-slim bash -lc 'ruby -rsocket -e "req=\"GET /slow HTTP/1.1\\r\\nHost: x\\r\\n\\r\\n\"; loop { begin; s=TCPSocket.new(\"host.docker.internal\",9292); s.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, [1,0].pack(\"ii\")); s.write(req); s.close; sleep 0.005; rescue; end }"'wrk -t4 -c64 -d15s http://127.0.0.1:9292/okdocker stop puma-bench
docker run -d --rm -p 9292:9292 --name puma-bench -e SLOW_BURN_MS=50 -e DISABLE_CLOSED_SOCKET_CHECK=1 puma-closed-socket-bench:latestdocker stop abort-storm puma-bench