PTS Results on Provisioned IOPS on AWS EBS

Initial results running the Phoronix Test Suite with Provision IOPS…

Continuing my evaluation of cloud hosted file-systems, I started looking at Provisioned IOPS as offered by AWS. This post is light on instructions and is basically just graphs of performance results.

test configurations

  • small-attached-ebs: m1.small EC2 instance, standard EBS volume (ext4)
  • small-attached-ebs-piops200: m1.small EC2 instance, EBS volume (ext4) provisioned for 200 IOPS
  • small-attached-ebs-piops400: m1.small EC2 instance, EBS volume (ext4) provisioned for 400 IOPS

Note: there’s a 10:1 minimum ratio between the size of an AWS EBS volume and the IOPS you provision for it. As such, the smallest EBS volume that can be provisioned for 200 IOPS is 20GB, and the smallest volume with support for 400 IOPS is 40GB.

results

OpenBenchmarking.org

I ran these tests with the same test name, however PTS didn’t join the results together when it submitted them. There must be a trick to getting PTS to collect results from multiple machines.

Anyway, here are the separate result pages:

comparison

Note: each test is actually run several times, with the below scores representing the average. The “error” column is the maximum deviation from the average by one or more test runs.

AIO-STRESS
AIO-Stress v0.21: random write
configuration score error
→ MB/s, more is better
small-attached-ebs 15.87 ± 0.51
small-attached-ebs-piops200 8.43 ± 0.1
small-attached-ebs-piops400 15.75 ± 0.06
FLEXIBLE IO TESTER
Flexible IO Tester v1.57: Intel IOMeter File Server Access Pattern
configuration score error
← seconds, less is better
small-attached-ebs 1234.69 ± 286.56
small-attached-ebs-piops200 7123.3 ± 10.69
small-attached-ebs-piops400 3567.55 ± 5.0
SQLITE
SQLite v3.7.3: 12,500 INSERTs
configuration score error
← seconds, less is better
small-attached-ebs 156.35 ± 3.04
small-attached-ebs-piops200 377.2 ± 0.1
small-attached-ebs-piops400 188.27 ± 0.03
FS-MARK
FS-Mark v3.3: 1000 Files, 1MB Size
configuration score error
→ files/s, more is better
small-attached-ebs 27.1 ± 1.12
small-attached-ebs-piops200 12.6 ± 0.0
small-attached-ebs-piops400 22.73 ± 0.03
DBENCH
Dbench v4.0: 1 Client
configuration score error
→ MB/s, more is better
small-attached-ebs 43.72 ± 0.46
small-attached-ebs-piops200 29.76 ± 0.01
small-attached-ebs-piops400 61.42 ± 0.11
Dbench v4.0: 12 Clients
configuration score error
→ MB/s, more is better
small-attached-ebs 128.37 ± 1.16
small-attached-ebs-piops200 60.67 ± 0.07
small-attached-ebs-piops400 107.33 ± 0.03
Dbench v4.0: 48 Clients
configuration score error
→ MB/s, more is better
small-attached-ebs 129.76 ± 1.18
small-attached-ebs-piops200 52.21 ± 0.22
small-attached-ebs-piops400 109.36 ± 1.53

With 48 clients, we see one of those rare moments when performance variance with Provisioned IOPS is higher than without. Strange.

Dbench v4.0: 128 Clients
configuration score error
→ MB/s, more is better
small-attached-ebs 115.54 ± 0.67
small-attached-ebs-piops200 21.06 ± 0.37
small-attached-ebs-piops400 55.91 ± 0.14
IOZONE
IOzone v3.405: 8GB Read Performance
configuration score error
→ MB/s, more is better
small-attached-ebs 34.89 ± 0.02
small-attached-ebs-piops200 12.77 ± 0.0
small-attached-ebs-piops400 25.57 ± 0.0
IOzone v3.405: 8GB Write Performance
configuration score error
→ MB/s, more is better
small-attached-ebs 33.73 ± 0.29
small-attached-ebs-piops200 11.57 ± 0.15
small-attached-ebs-piops400 22.85 ± 0.1
THREADED I/O TESTER

This benchmark highlights a specific case where provisioning 200-400 IOPS performs abysmally compared to no-PIOPS.

Threaded I/O Tester v0.3.3: 64MB Random Read - 32 Threads
configuration score error
→ MB/s, more is better
small-attached-ebs 122.08 ± 3.14
small-attached-ebs-piops200 2.23 ± 0.01
small-attached-ebs-piops400 4.53 ± 0.02
Threaded I/O Tester v0.3.3: 64MB Random Write - 32 Threads
configuration score error
→ MB/s, more is better
small-attached-ebs 13.03 ± 0.41
small-attached-ebs-piops200 0.87 ± 0.0
small-attached-ebs-piops400 1.75 ± 0.0
COMPILE BENCH
Compile Bench v0.6: Test: Compile
configuration score error
→ MB/s, more is better
small-attached-ebs 27.87 ± 0.96
small-attached-ebs-piops200 9.1 ± 0.03
small-attached-ebs-piops400 18.27 ± 0.05
Compile Bench v0.6: Test: Initial Create
configuration score error
→ MB/s, more is better
small-attached-ebs 24.17 ± 1.13
small-attached-ebs-piops200 8.41 ± 0.37
small-attached-ebs-piops400 14.38 ± 0.17
Compile Bench v0.6: Test: Read Compiled Tree
configuration score error
→ MB/s, more is better
small-attached-ebs 46.82 ± 5.14
small-attached-ebs-piops200 100.15 ± 0.63
small-attached-ebs-piops400 102.61 ± 1.25

Here’s one of the few cases where provisioning only 200 IOPS still managed to perform significantly better than without.

UNPACKING THE LINUX KERNEL
Unpacking The Linux Kernel: linux-2.6.32.tar.bz2
configuration score error
← seconds, less is better
small-attached-ebs 48.8 ± 1.11
small-attached-ebs-piops200 56.25 ± 2.95
small-attached-ebs-piops400 54.11 ± 1.02
POSTMARK
PostMark v1.51: Disk Transaction Performance
configuration score error
→ TPS, more is better
small-attached-ebs 614 ± 5.36
small-attached-ebs-piops200 210 ± 1.96
small-attached-ebs-piops400 403 ± 2.6
GZIP COMPRESSION
Gzip Compression: 2GB File Compression
configuration score error
← seconds, less is better
small-attached-ebs 55.39 ± 1.36
small-attached-ebs-piops200 279.83 ± 4.93
small-attached-ebs-piops400 138.04 ± 2.55

Here’s another use case where Provisioned IOPS (at least at the 200 and 400 level) actually has greater performance variance than without.

POSTGRESQL PGBENCH
PostgreSQL pgbench v8.4.11: TPC-B Transactions Per Second
configuration score error
→ TPS, more is better
small-attached-ebs 250.39 ± 3.3

Not sure why this benchmark didn’t run for the Provisioned IOPS cases. It may simply have been disabled in the version of PTS I used.

APACHE BENCHMARK
Apache Benchmark v2.4.3: Static Web Page Serving
configuration score error
→ Requests/s, more is better
small-attached-ebs 1233.63 ± 2.23
small-attached-ebs-piops200 1112.21 ± 5.52
small-attached-ebs-piops400 1118.26 ± 3.25

Here’s the last case where Provisioned IOPS (at least at the 200 and 400 level) actually has greater performance variance than without.

observations

For almost every benchmark, EBS with Provisioned IOPS had a lower variance between test runs, often drastically lower. This is the stated value proposition for this feature: you pay more, but you get a guaranteed level of performance. Without Provisioned IOPS, EBS performance varies quite a bit with spikes and valleys. If your application depends on consistent storage performance, then you really ought to turn Provisioned IOPS on.

That said, provisioning only 200 IOPS tended to worsen performance in almost every benchmark. While it’s the cheapest option, the compromise here may not be suitable for all applications: trading spikey but decent performance for consistently poor performance.

Provisioning 400 IOPS tended to performance somewhere between no-PIOPS and 200 PIOPS.

conclusions

I chose to examine the Provisioned IOPS feature for 200 IOPS and 400 IOPS. While the results are interesting, I did not find the point where paying for PIOPS brings consistently better performance than not.

According to Amazon’s documentation on EC2 Instance Types, m1.small instances only have a “low” network performance rating. This is likely to affect my test results, as EC2 instances must communicate with EBS volumes over their network interface.

I will have to follow-up these results with a wider range of Provisioned IOPS levels, and perhaps a wider range of instances sizes.

series

  1. Phoronix Test Suite on AWS
  2. PTS Results on Provisioned IOPS on AWS EBS
  3. PTS Results on Provisioned IOPS on AWS EBS, Part 2
  4. PTS on AWS with m1.medium EC2 and EBS with Provisioned IOPS

Ron -