Benchmarking on OSX: HTTP timeouts!
I’ve been doing some HTTP benchmarking on OSX lately, using ab (ApacheBench). After a large volume of requests, I always ended up with connection timeouts. I used to blame my application and mentally filed it as “must investigate”.
I was wrong.
The problem here was OSX, which seems to only have roughly 16000 ports available for connections. A port that was used by a closed connection is only released after 15 seconds. Quick calculation shows that you can only do a sustained rate of 1000 connections per second. Try to do more and you’ll end up with timeouts.
That’s not acceptable for testing pretty much anything that scales.
Here’s the workaround: you can control the 15 seconds release delay with sysctl:
sudo sysctl -w net.inet.tcp.msl=100
There’s probably a good reason why it’s in there, so you might want to revert this value once you are done testing:
sudo sysctl -w net.inet.tcp.msl=15000
Alternatively, you could just use Linux if you want to get some real work done.