Last month, Amazon
launched its EBS Provisioned IOPS (PIOPS) for running high
performance databases
in the cloud, and introduced EBS-Optimized instances to deliver
dedicated throughput
between EC2 and EBS. As the provider of the Redis Cloud service, we
wanted to know
whether the PIOPS EBS with EBS-Optimized instances would really perform
better than Standard
EBS with non-optimized instances for Redis.
Running Redis on AWS
has been a challenge for Redis users, mainly due to EBS’ slow and
unpredictable network
and I/O throughput. Though Redis is a pure in-memory datastore
system and serves
everything from RAM, it also has two persistent-storage mechanisms for
better durability:
AOF (Append Only File) and Snapshotting. These mechanisms are very
efficient when
interfacing with persistent storage, as they only use sequential writes with
no seek time. As a
result, Redis can run pretty well with data-persistence even on non-SSD
hardware.
That being said, we
decided to conduct some benchmarks for Amazon’s EBS PIOPS because
slow storage devices
can still be very painful for Redis. We see this when the AOF “fsync
every second” policy
blocks an entire Redis operation due to slow disk I/O. In addition,
background saving for
point-in-time snapshots or AOF rewrites takes longer, and therefore
more memory is used
for copy-on-write — leaving less memory available for your app.
You may have seen the
detailed post from Strattalux comparing the performance of PIOPS
EBS vs. Standard EBS
using EBS-Optimized and non-Optimized instances.
While their tests were
interesting, we thought we’d dig a little deeper and examine whether the performance
of a simple Redis application is influenced by different storage architecture.
Therefore, we were very specific and only tested the performance of sequential
writes, ignoring other scenarios like random read/write and sequential read.
For our benchmark, we also reviewed cost implications, and used what we believe
is a more noptimal performance configuration of Standard EBS (1 x 1TB EBS
volume vs. 10 x 100GB RAID0 EBS, per a very educational blog about Standard EBS
performance by Adrian Cockcroft from Netflix). So, without further ado, here
are the details of our tests...
Benchmark Setup
We used the following
setup: PIOPS EBS with Optimized-Instance (i.e. m2.4xlarge with
EBS-Optimized
attribute set to true) vs. Standard EBS with non-Optimized Instance
(m2.4xlarge with
EBS-Optimized attribute set to false).
We also tested
another setup in which we compared PIOPS EBS vs. Standard EBS on a non
Optimized-Instance
(m2.2xlarge). Our intention was to see whether AWS users who cannot
use the EBS
Optimized-Instance for various reasons (such as cost) can get benefit from the
new PIOPS EBS. Those
results were very similar to the setup described above.
For all tests, we
used 2 x m1.xlarge instances that run our memtier_benchmark load
generation tool
(memtier_benchmark is an advanced load generator tool we developed for
testing Redis and
Memcached datastores, which we will soon share in our github account).
We ran 8 tests on
each configuration to simulate a Redis application, then ran each of these
tests 3 times and
calculated the average results.
Our tests
combinations included:
- 100 and 500 connections on each load-generator machine (200 and 1000 connections total).
- 100B and 1KB object size
- 50%/50% read/write scenario, and 100% write scenario (for imposing load on EBS)
Benchmark Results
Note - we have chosen
to show the results from the 1KB object size tests, which impose
higher load on the
EBS.
The RPS and Latency
results aggregated from our two memteir_benchmark tools are shown
above. Our latency
tests take into account the network round-trip, the Redis processing
time, and the time it
takes for the memtier_benchmark tool to parse the result. As you
can see, RPS and
latency are approximately the same on all tests, though there are some
differences which
might be due to the fluctuations in the AWS infrastructure during the test
time. Needless to
say, Redis runs better with fewer disk accesses.
The results above are
taken from iostats commands executed while the tests were running
(here’s a useful AWS
forum post that explains how to interpret Linux iostats). We ran
iostats every 2.5
seconds and aggregated results from both EBS volumes. These charts
only present relevant
performance parameters for Redis — “read” parameters were not
presented as they
were constantly zero during these tests. As you can see, except from
few glitches here and
there, iostats show approximately the same results for both EBS
configurations.
Conclusion
After 32 intensive
tests with Redis on AWS (each run in 3 iterations for a total of 96 test
iterations), we found
that neither the non-optimized EBS instances nor the optimized-
EBS instances worked
better with Amazon’s PIOPS EBS for Redis. According to our results,
using the right
standard EBS configuration can provide equal if not better performance
than PIOPS EBS, and
should actually save you money. Keep in mind that these findings
represent a specific
storage usage pattern (sequential write only), so if you have different
storage access
patterns, you may want to review the Stratalux test results (while taking
into account the
different Standard EBS configuration we suggest).
Given these results,
we plan to continue running Garantia Data’s clusters on a Standard EBS
configuration. We
welcome comments from the Amazon EBS Team on our benchmark, and
will be sure to share
any new information we discover.
Thanks to that infrastructure, Amazon sites like the affiliate network runs smoothly. Being an amazon affiliate is a viable internet business entrepreneur.
ReplyDelete