I've been testing AWS EC2 with EBS optimized instances using EBS provisioned IOPS volumes in the hopes of finding out just how much better they perform in reality. I'm confused by the results and was hoping for some advice from the folks here.

I've been testing on an m1.large (7.5GB RAM, EBS optimized, 8G non-PIO EBS root, 4 ECUs across 2 vcores), doing my EBS piops volume tests in a second volume I've attached to the machine. The machine runs Debian 6.0.6 (official image) with PostgreSQL 9.2.2.

Everything I've tested has had significantly worse performance when I use a single provisioned IOPS volume than when I use a regular EC2 volume.

For example, comparing a normal EBS volume to a 600 iops PIOPS volume:

  • pg_test_fsync gets over 1000 fdatasyncs/second and over 450 fsyncs/second on normal ebs, while it gets almost exactly 600 fdatasyncs and 151 fsyncs on a piops volume.

  • pgbench with the same settings gets 900 tps on the normal EBS volume vs 200 tps on the piops volume.

  • Database creation takes about 4x as long on the piops volume vs the normal volume

  • Bonnie++ results on the piops volume are dramatically worse than the ordinary EBS volume.

The way that the PIOPS volume never seems to exceed its piops setting suggests that the iops value for piops volumes is a maximum after which performance is throttled, not just a guaranteed minimum. In other words, piops volumes can be slower than regular EBS volumes.

I haven't found anything in the documentation about this yet, but it's pretty consistent and the way I get exactly 600 fdatasyncs/second or 150 fsyncs/second on a 600 iops volume strongly suggests throttling.

Are EBS PIOPS volumes throttled to a maximum iops, not just guaranteed a minimum?

Update: Also asked on AWS forums.

  • It may result from a random selection of instances in your test. Your EBS PIOPS instances where put with other EBS PIOPS, therefore you got the exact promised performance (as your neighbours did). On the other hand, the "standard" instances were lucky to be around "quiet" neighbours, therefore you got better chunk of the bandwidth. – Guy Dec 10 '12 at 21:36
  • @Guy I used the same instance for all tests, attaching either a piops or non-piops secondary volume for testing. Also, even if the piops volume was on a heavily utilized volume I still find it hard to imagine that I'd always get exactly the provisioned iops and no more, unless there was throttling going on. – Craig Ringer Dec 10 '12 at 23:16

The amount of IOPS that you reserve is the max, not the min. It is also effectively the min, but their docs say it could get as low as 95% of what was reserved (so in this case could get as low as 570.

Unprovisioned are much more variable.

It's also important to note that to get the best performance you need to connect your PIOPS volume to an EBS optimized instance, otherwise you will get worse performance (as you have seen).

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.