Linode vs Digital Ocean: A Three-Round VPS Benchmark Showdown

A race to the bottom
January 18, 2018

A few days ago, Digital Ocean announced new pricing tiers for their VPSes (affectionately called Droplets). I’ve been a fan of Digital Ocean’s offerings for a long time. Compared to other popular VPS provider Linode, there seemed like there was only one choice as Digital Ocean’s pricing ran 2x for almost everything.

Now that they’re the same price, I think it’s about time they faceoff in a set of sysbench benchmark tests.

Both providers offer the standard set of plans, though each has unique offerings as well. Linode provides “high memory” options ranging from 16GB to 200GB of RAM, whereas Digital Ocean offers “high CPU” choices, advertising similar vCPU quantites but backed by compute-oriented hardware. We’ll leave those specific offerings off the table for now and just point a few standard VPSes from each provider at each other and see who comes out on top.

The results are broken down into each RAM category: 1GB, 4GB, and 8GB, comparing each provider’s offerings for each tier individually. The best scores for each cateogry and test are in bold.

Before I begin, I want to give special thanks to Josh Sherman. He came up with a great $5 comparison list back in February 2017 that served as inspiration for this post.

The Loadouts

We’ll be testing the following configurations from each provider:

Digital Ocean

RAMvCPUsStorageTransferPrice
1GB125GB1TB$5.00/month or $0.007/hour
4GB280GB4TB$20/month or $0.030/hour
8GB4160GB5TB$40/month or $0.060/hour

Linode

RAMvCPUsStorageTransferPrice
1GB120GB1TB$5.00/month or $0.007/hour
4GB248GB3TB$20/month or $0.030/hour
8GB496GB4TB$40/month or $0.060/hour

Deployment Notes

  • The latest Ubuntu 16.04.3 x64 provided by Linode and Digital Ocean will be installed.
  • Each VPS will be fresh out of the box and updated to the latest version of everything pre-packaged.
  • sysbench will be used to measure performance on all nodes using the same commands.
  • All VPSes were tested in their respective California regions (Digital Ocean: SFO 2, Linode: Fremont, CA)
  • Running the prep commands on Linode took much longer than Digital Ocean. It seems the Digital Ocean image of Ubuntu 16.04.3 is much more up to date.

Prepatory commands

apt-get update
apt-get upgrade -y
apt-get install apache2 apache2-utils mysql-server mysql-client speedtest-cli sysbench -y

During Linode provisioning, each VPS had trouble connecting to security.ubuntu.com via IPv6 so I had to edit etc/gai.conf to force IPV4 by uncommenting this line:

#precedence ::ffff:0:0/96 100

CPU Info

cat /proc/cpuinfo

Digital Ocean

RAMModelMHzCacheBogoMips
1GBIntel(R) Xeon(R) CPU E5-2650 v42.20Ghz30MB4400
4GBIntel(R) Xeon(R) CPU E5-2650 v42.20Ghz30MB4400
8GBIntel(R) Xeon(R) CPU E5-2650L v31.80Ghz30MB3600

Linode

RAMModelMHzCacheBogoMips
1GBIntel(R) Xeon(R) CPU E5-2680 v32.50Ghz16MB5001
4GBIntel(R) Xeon(R) CPU E5-2680 v22.80Ghz16MB5602
8GBIntel(R) Xeon(R) CPU E5-2680 v32.50Ghz16MB5001

The Results

1GB — $5.00/month

CPU

sysbench --test=cpu run
 LinodeDigital Ocean
Number of Events10,00010,000
Total Time12.6051s16.5311s
Event Execution12.6017s16.5197s
Minimum Request1.24ms1.16ms
Average Request1.26ms1.65ms
Maximum Request3.05ms29.83ms1
p951.29ms2.00ms

Memory

Read
sysbench --test=memory run
 LinodeDigital Ocean
Number of Events104,857,600104,857,600
Total Time49.9387s226.27s
Execution Time41.3406s176.5801s
Minimum Request0.00ms0.00ms
Average Request0.00ms0.00ms
Maximum Request14.56ms36.81ms
95th Percentile0.00ms0.00ms
Operations/Second2,099,725/sec463,417/sec
MB/Second2,050.02 MB/sec453.34 MB/sec

Write

sysbench --test=memory --memory-oper=write run
 LinodeDigital Ocean
Number of Events104,857,600104,857,600
Total Time50.0363s226.0851s
Execution Time41.4121s176.1462s
Minimum Request0.00ms0.00ms
Average Request0.00ms0.00ms
Maximum Request3.67ms41.21ms
95th Percentile0.00ms0.00ms
Operations/Second2,095,630/sec463,797/sec
MB/Second2,046 MB/sec453 MB/sec

File I/O

sysbench --test=fileio prepare
sysbench --test=fileio --file-test-mode=rndrw run
sysbench --test=fileio cleanup
 LinodeDigital Ocean
Number of Events10,00010,000
Total Time5.1085s2.1141s
Execution Time3.0602s0.6239s
Minimum Request0.00ms0.01ms
Average Request0.31ms0.06ms
Maximum Request52.63ms11.99ms
95th Percentile0.40ms0.13ms
Requests/Second1,957/sec4,730/sec
MB/Second30.586 MB/sec73.909 MB/sec

Apps: Apache

ab -kc 1000 -n 10000 http://127.0.0.1/
 LinodeDigital Ocean
Concurrency Level10001000
Time Taken (seconds)7.024s7.051s
Completed Requests10,00010,000
Failed Requests377108
Requests/sec (mean)1,423.651,418.22
Time per request (mean)702.418ms705.108ms
Transfer Rate15,560 KB/sec15,934 KB/sec

Apps: MySQL

mysql -uroot -e "CREATE DATABASE sbtest;"
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root prepare
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root run
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root cleanup
 LinodeDigital Ocean
Number of Queries210,000210,000
Total Time44.5271s64.2293s
Execution Time44.4597s64.0938s
Minimum Request2.02ms2.85ms
Average Request4.45ms6.41ms
Maximum Request545.68ms167.22ms
95th Percentile5.39ms13.86ms
Read/Write Requests/sec4,267.07/sec2,958.15/sec
Transactions/sec224.58/sec155.69/sec
Other Operations/sec449.17/sec311.38/sec

Apps: Speedtest

speedtest-cli --server=5479
 LinodeDigital Ocean
Distance30.81km3618.50km2
Ping49.611ms33.425ms
Download1040.06 Mbit/sec1,392.52 Mbit/sec
Upload387.06 Mbit/sec258.02 Mbit/sec

4GB — $20.00/month

CPU

sysbench --test=cpu run
 LinodeDigital Ocean
Number of Events10,00010,000
Total Time12.4283s13.22173s
Event Execution12.4257s13.2114s
Minimum Request1.16ms1.16ms
Average Request1.24ms1.32ms
Maximum Request4.47ms4.49ms
p951.51ms1.64ms

Memory

Read
sysbench --test=memory run
 LinodeDigital Ocean
Number of Events104,857,600104,857,600
Total Time46.0665s178.6187s
Execution Time38.1407s138.1447s
Minimum Request0.00ms0.00ms
Average Request0.00ms0.00ms
Maximum Request2.42ms5.29ms
95th Percentile0.00ms0.00ms
Operations/Second2,276,220/sec587,047/sec
MB/Second2,222.87 MB/sec573.29 MB/sec

Write

sysbench --test=memory --memory-oper=write run
 LinodeDigital Ocean
Number of Events104,857,600104,857,600
Total Time45.3632s191.1536s
Execution Time37.5572s148.0344s
Minimum Request0.00ms0.00ms
Average Request0.00ms0.00ms
Maximum Request5.98ms17.05ms
95th Percentile0.00ms0.00ms
Operations/Second2,311,510.22/sec548,551.45/sec
MB/Second2,257.33 MB/sec535.68 MB/seec

File I/O

sysbench --test=fileio prepare
sysbench --test=fileio --file-test-mode=rndrw run
sysbench --test=fileio cleanup
 LinodeDigital Ocean
Number of Events10,00010,000
Total Time1.6893s1.6235s
Execution Time0.0930s0.1605s
Minimum Request0.00ms0.00ms
Average Request0.01ms0.02ms
Maximum Request0.11ms4.19ms
95th Percentile0.02ms0.03ms
Requests/Second5,919.56/sec6,159.62/sec
MB/Second92.493 MB/sec96.244 MB/sec

Apps: Apache

ab -kc 1000 -n 10000 http://127.0.0.1/
 LinodeDigital Ocean
Concurrency Level10001000
Time Taken (seconds)2.426s5.902s
Completed Requests10,00010,000
Failed Requests301292
Requests/sec (mean)4,121.64/sec1,694.42
Time per request (mean)242.622ms590.172ms
Transfer Rate45,405.85 KB/sec18,697.41 KB/sec

Apps: MySQL

mysql -uroot -e "CREATE DATABASE sbtest;"
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root prepare
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root run
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root cleanup
 LinodeDigital Ocean
Number of Queries210,000210,000
Total Time36.16s55.3371s
Execution Time36.1036s55.2440s
Minimum Request2.25ms2.27ms
Average Request3.61ms5.52ms
Maximum Request359.96ms1141.29ms1
95th Percentile4.83ms10.45ms
Read/Write Requests/sec5,254.43/sec3,433.50/sec
Transactions/sec276.55/sec180.71/sec
Other Operations/sec553.10/sec361.42/sec

Apps: Speedtest

speedtest-cli --server=5479
 LinodeDigital Ocean
Distance30.81km4101.95km2
Ping66.529ms5.036ms
Download1,432.71 Mbit/sec1118.17 Mbit/sec
Upload344.86 Mbit/sec314.71 Mbit/sec

8GB — $40.00/month

CPU

sysbench --test=cpu run
 LinodeDigital Ocean
Number of Events10,00010,000
Total Time13.7149s15.0707s
Event Execution13.7105s15.0640s
Minimum Request1.24ms1.47ms
Average Request1.37ms1.51ms
Maximum Request2.94ms3.28ms
p951.50ms1.52ms

Memory

Read
sysbench --test=memory run
 LinodeDigital Ocean
Number of Events104,857,600104,857,600
Total Time55.1697s196.5439s
Execution Time45.6143s151.9530s
Minimum Request0.00ms0.00ms
Average Request0.00ms0.00ms
Maximum Request11.02ms2.03ms
95th Percentile0.00ms0.00ms
Operations/Second1,900,637.74/sec533,501.80/sec
MB/Second1,856.09 MB/sec521 MB/sec

Write

sysbench --test=memory --memory-oper=write run
 LinodeDigital Ocean
Number of Events104,857,600104,857,600
Total Time62.5355s202.5272s
Execution Time51.6640s156.6225s
Minimum Request0.00ms0.00ms
Average Request0.00ms0.00ms
Maximum Request4.36ms2.22ms
95th Percentile0.00ms0.00ms
Operations/Second1,676.770.31/sec517,745.73/sec
MB/Second1,637.47 MB/sec505.61 MB/sec

File I/O

sysbench --test=fileio prepare
sysbench --test=fileio --file-test-mode=rndrw run
sysbench --test=fileio cleanup
 LinodeDigital Ocean
Number of Events10,00010,000
Total Time2.1398s1.1296s
Execution Time0.0854s0.1273s
Minimum Request0.00ms0.00ms
Average Request0.01ms0.01ms
Maximum Request0.07ms0.13ms
95th Percentile0.01ms0.03ms
Requests/Second4,673.39/sec8,852.78/sec
MB/Second73.022 MB/sec138.32 MB/sec

Apps: Apache

ab -kc 1000 -n 10000 http://127.0.0.1/
 LinodeDigital Ocean
Concurrency Level10001000
Time Taken (seconds)5.778s5.803s
Completed Requests10,00010,000
Failed Requests450332
Requests/sec (mean)1,730.67/sec1,723.18/sec
Time per request (mean)577.811ms580.323ms
Transfer Rate18,733.09 KB/sec18,946.15 KB/sec

Apps: MySQL

mysql -uroot -e "CREATE DATABASE sbtest;"
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root prepare
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root run
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root cleanup
 LinodeDigital Ocean
Number of Queries210,000210,000
Total Time38.8435s38.5574s
Execution Time38.7863s38.4869s
Minimum Request2.06ms2.75ms
Average Request3.88ms3.85ms
Maximum Request46.47ms304.95ms1
95th Percentile5.29ms4.71ms
Read/Write Requests/sec4,891.42/sec4,927.71/sec
Transactions/sec257.44/sec259.35/sec
Other Operations/sec514.89/sec518.71/sec

Apps: Speedtest

speedtest-cli --server=5479
 LinodeDigital Ocean
Distance30.81km4101.95km2
Ping63.279ms55.343ms
Download1,635.88 Mbit/sec824.12 Mbit/sec
Upload275.91 Mbit/sec262.63 Mbit/sec

Conclusion

Comparing both sets of VPSes against each other yielded mixed results. The Linoe VPSes ran away with the win in most categories, with Digital Ocean ending up the underdog winner. For CPU performance, both providers were pretty well in line. I wouldn’t consider at 1.08x difference enough to warrant a migration or decision based on that stat alone. If Digital Ocean’s High CPU offerings were in play, I would be surprised if they didn’t take the cake.

Moving into the Memory tests, though, we see much larger gaps between the two. Linode was frequently ahead by as much at 4.5x, though the gap started to close as the VPSes increased in size. Raw bits/sec as well as time to execute were several times better. There’s not much else to say here.

File IO was where we started seeing some mixed results, with Digital Ocean coming out as the leader. For the 1GB and 8GB VPSes, Digital Ocean ran away with the win in bytes/second, while Linode barely squeaked through.

Looking at application benchmarks, the MySQL tests were surprising, given the file I/O results. Apache seemed to line up with what we saw in terms of CPU performance and both providers had sexy-fast networks though Linode came out on top two out of three times.

At the end of the day, unless you’re running highend workloads, these general purpose VPSes are likely to perform just about the same. Compute tasks are better served by offerings that are designed to be utilized for that purpose. If you need every bit of RAW in-memory power you can muster, Linode will likely offer better results overall.

The race to the bottom continues with Digital Ocean halfing their prices and I’m glad to see it happen. Given that there’s still on-paper desparities between each provider, it made sense and I’m surprised they didn’t do it sooner.

I look forward to testing these again in the future in hopes that backed by new/better hardware, Digital Ocean can surpass Linode and further boost the VPS wars that end up benefiting the consumer even more.

Expect more tests that include other providers like Vultur, Media Temple, Dreamhost, Lightsail, and more, perhaps even a mega comparo!

Disclaimer: The FTC requires I state that links in this article may be monetized.

  1. A possible statistical outlier that would need to be reviewed and possibly re-tested.  2 3 4

  2. The geographic location doesn’t match up with the ping and the location Digital Ocean says the server was located. My guess is based on Geo IP lookup, the IP is registered in Canada and threw this number off.  2 3


filed under: Reviews / Technology
more about: benchmarks / digital ocean / linode / sysbench / vps