It’s very easy to merrily write a web application without realising that all those images and ajax calls you’re using make it rather sluggish when you’re not just connecting to localhost. Even when you’ve uploaded it to your production or test servers chances are you’ll have pretty good bandwidth and latency between you and those servers so it can be hard to see just what it will be like for an enduser who is less well endowed in the broadband department (or even still on dialup).
It’s not just about size
Very often it’s not just about how many bytes a second you could be transfering, the amount of latency is also a critical component of what the app feels like to the end user. Luckily we can simulate both.
The piece of kit we need is a traffic shaper, a piece of software that sits in between you and the end server and modulates the flow of packets. If you’re using linux or Mac OS X you’ve probably already got everything you need. I’m a mac nerd so I’ll concentrate on that.
Luckily it’s pretty damn easy on the mac as ipfw has all the necessary bits (from 10.4 upwards). The first thing we need to setup is a pipe. To quote the man page, “A pipe emulates a link with given bandwidth, propagation delay, queue size and packet loss rate”.
ipfw pipe 1 config bw 300Kbit/s
ipfw pipe 2 config bw 500Kbit/s delay 100
This creates 2 pipes: one with a bandwidth of 300Kbit/s, and the other with a bandwidth of 500Kbit/s and a propagation delay of 100ms (ie when a packet goes into that pipe it won’t come out the other end for 100ms)
Having setup the pipe, you then need to add firewall rules that send traffic through those routes. For example if you’ve got your mongrel running on port 3000 you can run
sudo ipfw add pipe 2 tcp from any to any src-port 3000
sudo ipfw add pipe 2 tcp from any to any dst-port 3000
to send traffic to/from port 3000 through pipe number 2. When you’re done with your testing or if you mess up, run
sudo ipfw show
to show all the firewall rules you’ve created. The output will look a little like
00300 72 18982 pipe 2 tcp from any 4500 to any
00400 24 1896 pipe 2 tcp from any to any dst-port 4500
65535 58931 55276029 allow ip from any to any
The first column is the rule number (so 300 and 400 in my case). To remove the rules just run
sudo ipfw delete rule-number
. This isn’t the sort of thing I’d even begin to worry about at the beginning of the project, but worth keeping at the back of your mind.