2018 Budget VPS Survey

October 30, 2018 15 min read

Every few years, GoDaddy acquires my web host of choice and I embark upon a technical pilgrimage to greener pastures. Webfaction has been the latest victim and I’ve decided to run my own VPS and shop around for the right software and provider.

Things have been good with Webfaction, and I’ve defended its shared platform which stands apart from any other I’ve experienced. Every now and then noisy neighbors would be an issue, but sites sped along nearly as if hosted on a VPS with plenty of memory and CPU. (This includes shared service and the first two cloud levels, about a dozen accounts. I would have included it in the benchmarks below, but the sustained CPU usage had the test processes automatically dropped before they could finish.) Some servers were more stable than others, but most were unfailingly fast and rarely down. But if there’s one thing I can’t forgive, it’s being acquired by GoDaddy.

My humble sites don’t see a lot of traffic, so a single server instance behind Cloudflare works great. My goal is to find the fastest VPS I can, as close to me as possible, at <=$20/month with at least 99% uptime. There’s a lot of subjectivity and my approach is hardly scientific, but I enjoy comparing what’s out there and hope my notes might be interesting or useful.

Software

After trying (and retrying) a few provisioning/management services I decided I’m ready for more direct control over the VPS. I’m finally comfortable enough with Linux to ditch a web-based GUI and keep things lean. Centmin Mod lulled me away from Ubuntu into CentOS. It’s an actively-maintained suite of shell scripts and tools that provision and maintain a CentOS box with lots of fine-tuning for speed and common web server usage. Most importantly for me, it provides a reassuring amount of structure, optimization, and community support when I might otherwise feel like I’m in too deep. George’s notes, benchmarks, and comments are all insightful and often reassuring.

Service Provider Goals

I had an experimental 512MB RamNode VPS a few years ago and got used to noticing its 100% uptime as I checked on other “more serious” servers. I’ve since deployed projects on cool platforms like AWS, Digital Ocean and fortrabbit, but thought it’d be fun to look around and see where I could maximize performance per dollar. There are tradeoffs with cheaper hosts: monitoring, backups, instant provisioning and hourly billing are all nice (if not essential) and rarely offered by budget providers. Since I’m experimenting with my own projects and not client sites, I’m comfortable working those things out for the sake of learning. I ended up trying out servers from RamNode, SSD Nodes, HostUS and Hyper Expert, comparing against Digital Ocean, Vultr and AWS to see how things would stack up.

My interests are…

  1. Memory, CPU, and fast storage, because I want sites and apps to be as fast as they can.
  2. Network bandwidth, in case the usual trickle ever becomes a flood.
  3. Cost, as I’m ruthlessly cheap with my own hosting and my low-traffic sites don’t warrant exciting infrastructure spend.
  4. Location/latency. I’m in Seattle and short pings make everything feel fast.
  5. Support, which should be competent and able to respond to coherently-submitted tickets within at least a few hours.
  6. Stability: reasonable load and strong uptime.

Cheap VPS Challengers

I wasn’t trying to find servers that’d closely match each other feature for feature, but compare different things and see what I could learn. Let’s see how various <=$20/month options stack up first, then we can compare on performance later.

Provider+Plan Xeon CPU RAM Storage Cost Location
RamNode 2GB OpenVZ 2×E5-2630 2GB 60GB SSD $6.65/month* Seattle, WA
RamNode 2GB NVMe 2×E3-1240 2GB 25GB SSD $12/month Los Angeles, CA
SSD Nodes KVM / X-Large 4×Skylake 16GB 80GB SSD $9.99/month* Dallas, TX
HostUS 4GB OpenVZ 4×L5640 4GB 150GB HDD $9.56/month Los Angeles, CA
Hyper Expert 12GB KVM 8×E5-2670 12GB 80GB SSD $18.89/month* Seattle, WA
Digital Ocean 2GB 1×E5-2650 2GB 50GB $10/month San Francisco, CA
Digital Ocean 4GB 2×E5-2650 4GB 80GB SSD $20/month San Francisco, CA
Linode 2GB 1×Gold 6148 2GB 50GB $10/month Fremont, CA
Linode 4GB 2×E5-2697 4GB 80GB $20/month Fremont, CA
Vultr 2GB 1×Skylake 2GB 40GB $10/month Seattle, WA
Vultr 4GB 2×Skylake 4GB 60GB $20/month Seattle, WA
AWS Lightsail 2GB 1×E5-2676 2GB 60GB $10/month Northern OR
AWS Lightsail 4GB 2×E5-2676 4GB 80GB $20/month Northern OR

I profiled 23 different servers over the course of four weeks. I’ve omitted all kinds of gleeful and superfluous detail so it looks like it wasn’t just some obsessive spree. (It was.)

Contender Specs

$/Month vCPU Cores RAM (GB) Storage (GB) RamNode 2GB OpenVZ RamNode 2GB NVMe SSD Nodes KVM / X-Large HostUS 4GB OpenVZ Hyper Expert 12GB KVM Digital Ocean 2GB Digital Ocean 4GB Linode 2GB Linode 4GB Vultr 2GB Vultr 4GB AWS Lightsail 2GB AWS Lightsail 4GB 0 25 50 75 100 125 150 $6.65 2 2 GB 60 GB $12 2 2 GB 25 GB $9.99 4 16 GB 80 GB $9.56 4 4 GB 150 GB $18.89 8 12 GB 80 GB $10 1 2 GB 50 GB $20 2 4 GB 80 GB $10 1 2 GB 50 GB $20 2 4 GB 80 GB $10 1 2 GB 40 GB $20 2 4 GB 60 GB $10 1 2 GB 60 GB $20 2 4 GB 80 GB

The HostUS plan uses RAID-10 HDD, not SSD.

OpenVZ vs. KVM

The type of virtualization may not be hugely important for hosting a few PHP projects, but I think it could be important particularly for low-resource plans.

In each case, a physical server somewhere is being divided up for multiple customers. The more accounts a hosting company can get onto that hardware, the more money they make. We want them making money because we want them to keep existing, offering support, and having an interest in keeping things fast and stable. At the same time, fewer neighbors means you get more of that hardware to yourself as a customer. Better performance, increased stability, more power. The divvying up happens via virtualization, which often comes in two flavors: OpenVZ and KVM.

I’m not a virtualization expert, but my takeaway is that OpenVZ is a bit leaner and more limiting. A KVM VPS has you running your own kernel, meaning you can do more with it but you also pay the performance overhead of running the entire kernel. OpenVZ containers all share a kernel and will thus be more limited by a host. Your resources, however, are more devoted to applications and the business end of whatever you’re doing there.

Performance-wise, I don’t know that OpenVZ or KVM virtualization made a whole lot of difference. My only practical takeaway is that KVM is better for monitoring and can be tuned more flexibly; my OpenVZ servers didn’t report various I/O metrics to nginx Amplify or StatusCake, and Centmin Mod has more power to tune when it has more direct control over system settings.

RamNode

RamNode is a small company with a seemingly good reputation, and in my experience extremely low latency and unmatched uptime. This is where I first compared OpenVZ and KVM servers with similar specs and got my first hands-on experience with the two virtualization types. I tried the (blazing fast) NVMe service from Los Angeles since all NVMe were out of stock in Seattle, but I’d put that in my top three if the stock replenished. I’m also curious about their VDS, but it’d break the $20 budget.

SSD Nodes

I found SSD Nodes on LowEndBox and assumed it was a scam. After digging around skeptically, it seemed like the company actually delivered on fast, reliable servers at surprisingly low prices. Most reviewers claimed to see strong uptime and performance, and the company responded to overcrowding accusations by publishing a live display of load across all its servers. This and a generous trial period convinced me to give their XL plan a shot.

They apparently used to offer Seattle servers, and if those ever re-appear with similar pricing I’ll jump on one in a heartbeat.

So far, this $9.99/month server (prepaid one year) has vastly outperformed anything in the same price range. Support responses have been helpful and decent, taking maybe a few hours with medium priority. (I try not to abuse "urgent" flags, and I’ve only been testing the VPS I got.) I decided to keep it and am curious whether uptime and benchmarks will be as good a year later.

HostUS

HostUS is another company I encountered on LowEndBox. My initial benchmarks were strong, and after some weird IO issues I ran another set and found read and write performance wheezing at 1-2 MB/s. I filed a ticket that spurred a pleasant support discussion and investigation, only to find that the ticket had been closed after this comment from support staff:

We sometimes end up putting a blanket limit on IO in place per VM due to the level of abuse we see on our OpenVZ plans, this is the quickest and easiest method to mitigate larger issues at scale.

While I did run two benchmarks that used a bunch of CPU, and while I understand resources aren’t dedicated, the limit of 1-2 MB/s observed over several tests is an issue. This is the only server I tested that had an outage and dropped occasional http requests, and I’m not feeling compelled to keep the account. For what it’s worth, I do like the customization HostUS made to the otherwise-standard control panel, which offers convenient bonuses like adding SSH keys and disabling root login from outside the VPS.

Hyper Expert

I found Hyper Expert, once again on LowEndBox, toward the end of my search specifically for Seattle-based providers. I wasn’t sure exactly what I was getting when I signed up, but took advantage of a 10% off code and used it to customize a seemingly impressive VPS. I didn’t expect much, but it’s been my all-around favorite. Excellent performance, lowest load among its competition and friendly, responsive support. Its proximity and low latency make everything about the server feel fast. The company has a Discord server and strong reviews, and my one (low priority) support ticket received a fast and friendly answer in just under three hours on a Saturday.

And then there are the more established providers…

Linode

SliceHost and Linode were the first VPS providers I ever used. SliceHost was acquired by Rackspace, and Linode’s still going strong. The company is apparently one of Digital Ocean’s major competitors, and is the first of four "name brand" providers I decided to include for comparison.

Digital Ocean

Digital Ocean is lovely to work with and has been my choice for several client projects, but I don’t need instant provisioning or hourly billing and for now I’ll manage my own monitoring and backups. But Digital Ocean is a popular provider, so I figure it can’t hurt to compare my budget finds against an established host and much larger company.

Vultr

I’ve only ever poked around at Vultr, which has a reputation for being fast that didn’t disappoint. Seattle is one of their datacenter options, which is a plus for me.

AWS (+Lightsail)

High on the rush of spinning up powerful servers just to benchmark them, I decided to throw in a beefy EC2 instance along with another from Lightsail, which is Amazon’s clever way of simplifying your experience with AWS while drawing you into its vast universe.

Testing Method

For each server, I installed CentOS 7 and Centmin Mod before running tests with ServerScope.io, GeekBench, and Centminbench. The metrics I’m sharing here are the one’s I’ve found most interesting or useful.

Geekbench and UnixBench scores are straightforward, the latter all coming from ServerScope’s tests.

MySQL performance measurements came from mysqlslap via Centminbench:

-------------------------------------------
Running mysqlslap
-------------------------------------------

mysqlslap --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-secondary-indexes=5 --number-int-cols=5 --number-char-cols=5 --number-of-queries=25000 --auto-generate-sql-unique-query-number=40 --auto-generate-sql-unique-write-number=40 --auto-generate-sql-write-number=1000 --concurrency=64 --iterations=10 --engine=myisam 
Benchmark
	Running for engine myisam
	Average number of seconds to run all queries: 1.644 seconds
	Minimum number of seconds to run all queries: 1.379 seconds
	Maximum number of seconds to run all queries: 1.805 seconds
	Number of clients running queries: 64
	Average number of queries per client: 390

PHP performance measurements, again from Centminbench, are the average of three Zend/micro_bench.php runs:

-------------------------------------------
Run PHP test Zend/micro_bench.php
-------------------------------------------

empty_loop         0.034
func()             0.089    0.055
undef_func()       0.096    0.062
int_func()         0.047    0.012
$x = self::$x      0.081    0.047
self::$x = 0       0.082    0.048
isset(self::$x)    0.079    0.044
empty(self::$x)    0.086    0.052
$x = Foo::$x       0.061    0.027
Foo::$x = 0        0.059    0.025
isset(Foo::$x)     0.060    0.026
empty(Foo::$x)     0.065    0.031
self::f()          0.109    0.075
Foo::f()           0.088    0.054
$x = $this->x      0.060    0.026
$this->x = 0       0.051    0.017
$this->x += 2      0.091    0.057
++$this->x         0.064    0.030
--$this->x         0.063    0.029
$this->x++         0.072    0.038
$this->x--         0.072    0.038
isset($this->x)    0.078    0.044
empty($this->x)    0.082    0.048
$this->f()         0.096    0.062
$x = Foo::TEST     0.083    0.049
new Foo()          0.204    0.170
$x = TEST          0.058    0.024
$x = $_GET         0.088    0.054
$x = $GLOBALS['v'] 0.131    0.097
$x = $hash['v']    0.089    0.055
$x = $str[0]       0.106    0.072
$x = $a ?: null    0.063    0.029
$x = $f ?: tmp     0.070    0.035
$x = $f ? $f : $a  0.057    0.023
$x = $f ? $f : tmp 0.062    0.028
------------------------
Total              2.776
real: 2.84s user: 2.80s sys: 0.02s cpu: 99% maxmem: 19740 KB cswaits: 2

empty_loop         0.032
func()             0.087    0.056
undef_func()       0.094    0.063
int_func()         0.045    0.014
$x = self::$x      0.078    0.047
self::$x = 0       0.079    0.047
isset(self::$x)    0.078    0.046
empty(self::$x)    0.084    0.052
$x = Foo::$x       0.058    0.026
Foo::$x = 0        0.058    0.027
isset(Foo::$x)     0.058    0.027
empty(Foo::$x)     0.065    0.033
self::f()          0.116    0.084
Foo::f()           0.089    0.057
$x = $this->x      0.056    0.024
$this->x = 0       0.048    0.016
$this->x += 2      0.084    0.052
++$this->x         0.060    0.028
--$this->x         0.059    0.027
$this->x++         0.064    0.033
$this->x--         0.065    0.033
isset($this->x)    0.074    0.043
empty($this->x)    0.079    0.047
$this->f()         0.093    0.061
$x = Foo::TEST     0.078    0.047
new Foo()          0.209    0.177
$x = TEST          0.053    0.022
$x = $_GET         0.082    0.050
$x = $GLOBALS['v'] 0.117    0.085
$x = $hash['v']    0.087    0.055
$x = $str[0]       0.077    0.045
$x = $a ?: null    0.062    0.031
$x = $f ?: tmp     0.067    0.036
$x = $f ? $f : $a  0.057    0.025
$x = $f ? $f : tmp 0.061    0.030
------------------------
Total              2.655
real: 2.74s user: 2.70s sys: 0.03s cpu: 99% maxmem: 19740 KB cswaits: 1

empty_loop         0.032
func()             0.089    0.057
undef_func()       0.096    0.064
int_func()         0.046    0.013
$x = self::$x      0.079    0.046
self::$x = 0       0.078    0.045
isset(self::$x)    0.077    0.045
empty(self::$x)    0.083    0.051
$x = Foo::$x       0.060    0.027
Foo::$x = 0        0.058    0.026
isset(Foo::$x)     0.058    0.025
empty(Foo::$x)     0.064    0.032
self::f()          0.108    0.075
Foo::f()           0.087    0.054
$x = $this->x      0.057    0.025
$this->x = 0       0.049    0.016
$this->x += 2      0.085    0.053
++$this->x         0.062    0.029
--$this->x         0.060    0.027
$this->x++         0.067    0.034
$this->x--         0.067    0.034
isset($this->x)    0.077    0.045
empty($this->x)    0.080    0.048
$this->f()         0.094    0.061
$x = Foo::TEST     0.079    0.046
new Foo()          0.197    0.165
$x = TEST          0.054    0.021
$x = $_GET         0.081    0.049
$x = $GLOBALS['v'] 0.134    0.101
$x = $hash['v']    0.089    0.056
$x = $str[0]       0.077    0.044
$x = $a ?: null    0.063    0.031
$x = $f ?: tmp     0.067    0.035
$x = $f ? $f : $a  0.057    0.024
$x = $f ? $f : tmp 0.062    0.029
------------------------
Total              2.672
real: 2.71s user: 2.69s sys: 0.01s cpu: 99% maxmem: 19740 KB cswaits: 1

micro_bench.php results from 3 runs
2.776
2.655
2.672

micro_bench.php avg: 2.7010
Avg: real: 2.76s user: 2.73s sys: 0.02s cpu: 99.00% maxmem: 19740.00KB cswaits: 1.33
created results log at /home/phpbench_logs/bench_micro_291018-190520.log
server PHP info log at /home/phpbench_logs/bench_phpinfo_291018-190520.log

I opted to use a very simple bandwidth benchmark, which is Centminbench’s Cachefly download. The file itself should be close because of the CDN:

Download from Cachefly (http://cachefly.cachefly.net/100mb.test)
Download Cachefly: 120MB/s

Disk read/write came from Centminbench’s fio benchmarks:

Running FIO benchmark...

FIO_VERSION = fio-2.0.9

FIO random reads: 
randomreads: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.0.9
Starting 1 process
randomreads: Laying out IO file(s) (1 file(s) / 1024MB)

randomreads: (groupid=0, jobs=1): err= 0: pid=32279: Mon Oct 29 19:06:42 2018
  read : io=1024.3MB, bw=164008KB/s, iops=41001 , runt=  6395msec
  cpu          : usr=4.69%, sys=20.24%, ctx=46236, majf=0, minf=85
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued    : total=r=262207/w=0/d=0, short=r=0/w=0/d=0

Run status group 0 (all jobs):
   READ: io=1024.3MB, aggrb=164007KB/s, minb=164007KB/s, maxb=164007KB/s, mint=6395msec, maxt=6395msec

Disk stats (read/write):
  vda: ios=253783/2, merge=0/1, ticks=380446/9, in_queue=380417, util=98.45%

FIO random writes: 
randomwrites: (g=0): rw=randwrite, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.0.9
Starting 1 process

randomwrites: (groupid=0, jobs=1): err= 0: pid=32283: Mon Oct 29 19:06:50 2018
  write: io=1024.3MB, bw=148854KB/s, iops=37213 , runt=  7046msec
  cpu          : usr=4.95%, sys=20.55%, ctx=24538, majf=0, minf=20
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued    : total=r=0/w=262207/d=0, short=r=0/w=0/d=0

Run status group 0 (all jobs):
  WRITE: io=1024.3MB, aggrb=148854KB/s, minb=148854KB/s, maxb=148854KB/s, mint=7046msec, maxt=7046msec

Disk stats (read/write):
  vda: ios=0/257522, merge=0/3, ticks=0/422346, in_queue=422340, util=98.67%

I’ll be monitoring my finalists with StatusCake and nginx Amplify to see how they behave longer-term.

Cheap VPS Results

Geekbench Multi-Core + UnixBench Scores

Geekbench Multi-Core UnixBench RamNode 2GB OpenVZ RamNode 2GB NVMe SSD Nodes KVM / X-Large HostUS 4GB OpenVZ Hyper Expert 12GB KVM Digital Ocean 2GB Digital Ocean 4GB Linode 2GB Linode 4GB Vultr 2GB Vultr 4GB AWS Lightsail 2GB AWS Lightsail 4GB 0 2800 5600 8400 11200 14000 16800 2874 622.5 7926 1718.6 8005 1684.3 6264 712.2 13894 3515.4 2690 702.7 5438 1481.6 3321 859.7 4595 1543.5 3764 1135.4 7435 2006.4 3098 748 5878 1490.2

Higher is better.

PHP + MySQL Performance

PHP MySQL RamNode 2GB OpenVZ RamNode 2GB NVMe SSD Nodes KVM / X-Large HostUS 4GB OpenVZ Hyper Expert 12GB KVM Digital Ocean 2GB Digital Ocean 4GB Linode 2GB Linode 4GB Vultr 2GB Vultr 4GB AWS Lightsail 2GB AWS Lightsail 4GB 0 5 10 15 20 25 30 23.674s 4.751s 2.436s 2.042s 3.7657s 3.396s 4.6333s 2.807s 3.9357s 1.927s 4.5547s 4.247s 3.9987s 2.425s 3.531s 2.677s 4.6533s 2.252s 2.598s 2.675s 2.7583s 1.298s 3.5807s 2.89s 3.7107s 1.665s

Lower is better.

Storage I/O

Random Read MB/s Random Write MB/s RamNode 2GB OpenVZ RamNode 2GB NVMe SSD Nodes KVM / X-Large HostUS 4GB OpenVZ Hyper Expert 12GB KVM Digital Ocean 2GB Digital Ocean 4GB Linode 2GB Linode 4GB Vultr 2GB Vultr 4GB AWS Lightsail 2GB AWS Lightsail 4GB 0 200 400 600 800 1000 1200 60.971 MB/s 341.527 MB/s 486.019 MB/s 435.018 MB/s 171.798 MB/s 97.921 MB/s 291.99 MB/s 574.7 MB/s 314.491 MB/s 377.956 MB/s 321.332 MB/s 112.403 MB/s 395.337 MB/s 195.495 MB/s 494.497 MB/s 307.484 MB/s 333.385 MB/s 128.880 MB/s 159.834 MB/s 159.712 MB/s 201.853 MB/s 191.602 MB/s 12.384 MB/s 12.291 MB/s 12.381 MB/s 12.282 MB/s

Bandwidth

RamNode 2GB OpenVZ RamNode 2GB NVMe SSD Nodes KVM / X-Large HostUS 4GB OpenVZ Hyper Expert 12GB KVM Digital Ocean 2GB Digital Ocean 4GB Linode 2GB Linode 4GB Vultr 2GB Vultr 4GB AWS Lightsail 2GB AWS Lightsail 4GB 0 50 100 150 200 250 300 17.9 MB/s 86.4 MB/s 103 MB/s 35.8 MB/s 105 MB/s 242 MB/s 137 MB/s 178 MB/s 130 MB/s 138 MB/s 140 MB/s 68.4 MB/s 75.1 MB/s

Higher is better.

Performance Competitors

Thrilled with the Hyper Expert VPS performance, I decided I’d try a few more plans to compete on directly performance instead of price.

Here are the additional higher-performance plans:

Provider+Plan Xeon CPU RAM Storage Cost Location
Vultr 32GB 8×Skylake 32GB 300GB $160/month Seattle, WA
Digital Ocean 16GB CPU 8×Platinum 8168 16GB 100GB SSD $160/month San Francisco, CA
AWS m5.2xlarge 8×Skylake 32GB - $262.08/month Northern OR
Digital Ocean 32GB 8×Gold 6140 32GB 640GB SSD $160/month San Francisco, CA
Linode 32GB 8×E5-2680 32GB 640GB SSD $160/month Fremont, CA
Lightsail 16GB 4×E5-2686 16GB 320GB SSD $80/month Northern OR

Geekbench Multi-Core + UnixBench Scores

Geekbench Multi-Core UnixBench Hyper Expert 12GB KVM SSD Nodes 16GB KVM XL Vultr 32GB Digital Ocean 16GB CPU AWS m5.2xlarge Digital Ocean 32GB Linode 32GB Lightsail 16GB 0 4300 8600 12900 17200 21500 25800 13894 3515.4 8005 1684.3 21431 4182.9 17500 4408.1 16176 4681.1 13246 4110 12355 3618.2 11207 2979

Higher is better.

PHP + MySQL Performance

PHP MySQL Hyper Expert 12GB KVM SSD Nodes 16GB KVM XL Vultr 32GB Digital Ocean 16GB CPU AWS m5.2xlarge Digital Ocean 32GB Linode 32GB Lightsail 16GB 0 2 4 6 8 10 12 3.9357s 1.927s 3.7657s 3.396s 2.701s 1.644s 2.5303s 0.993s 2.7517s 0.661s 5.9287s 1.744s 4.2063s 1.963s 3.435s 1.059s

Lower is better.

Storage I/O

Random Read MB/s Random Write MB/s Hyper Expert 12GB KVM SSD Nodes 16GB KVM XL Vultr 32GB Digital Ocean 16GB CPU AWS m5.2xlarge Digital Ocean 32GB Linode 32GB Lightsail 16GB 0 200 400 600 800 1000 1200 314.491 MB/s 377.956 MB/s 171.798 MB/s 97.921 MB/s 164.008 MB/s 148.854 MB/s 686.855 MB/s 164.187 MB/s 12.137 MB/s 12.053 MB/s 350.31 MB/s 32.329 MB/s 300.438 MB/s 130.095 MB/s 12.34 MB/s 12.281 MB/s

Bandwidth

Hyper Expert 12GB KVM SSD Nodes 16GB KVM XL Vultr 32GB Digital Ocean 16GB CPU AWS m5.2xlarge Digital Ocean 32GB Linode 32GB Lightsail 16GB 0 50 100 150 200 250 300 105 MB/s 103 MB/s 120 MB/s 279 MB/s 224 MB/s 237 MB/s 171 MB/s 43.6 MB/s

Higher is better.

Working Conclusion

My current concept of value centers around performance and stability, but despite all the fun here I could see eventually wanting to pay more for service that comes with monitoring, backups, and features that cost very little compared to the time it’d take me to establish and maintain my own solutions. At the moment, I’ve let easily-chartable stats guide me a bit.

Megabytes of RAM per Dollar

RamNode 2GB OpenVZ RamNode 2GB NVMe SSD Nodes KVM / X-Large HostUS 4GB OpenVZ Hyper Expert 12GB KVM Digital Ocean 2GB Digital Ocean 4GB Digital Ocean 16GB CPU Digital Ocean 32GB Linode 2GB Linode 4GB Linode 32GB Vultr 2GB Vultr 4GB Vultr 32GB AWS m5.2xlarge AWS Lightsail 2GB AWS Lightsail 4GB AWS Lightsail 16GB 0 400 800 1200 1600 2000 2400 307 MB 170 MB 1640 MB 428 MB 650 MB 204 MB 204 MB 102 MB 204 MB 204 MB 204 MB 204 MB 204 MB 204 MB 204 MB 125 MB 204 MB 204 MB 204 MB

Higher is better.

Geekbench Points per Dollar

RamNode 2GB OpenVZ RamNode 2GB NVMe SSD Nodes KVM / X-Large HostUS 4GB OpenVZ Hyper Expert 12GB KVM Digital Ocean 2GB Digital Ocean 4GB Digital Ocean 16GB CPU Digital Ocean 32GB Linode 2GB Linode 4GB Linode 32GB Vultr 2GB Vultr 4GB Vultr 32GB AWS m5.2xlarge AWS Lightsail 2GB AWS Lightsail 4GB AWS Lightsail 16GB 0 200 400 600 800 1000 1200 432 660 801 428 735 269 271 109 82 332 229 77 376 367 133 61 309 293 140

Higher is better.

SSD Nodes clearly wins for best performance/cost ratio, but I’ve been most thrilled with the Hyper Expert VPS since it’s in my neighborhood. I’m going to keep both of those around for the next year or so and see what else I learn.

I don’t understand why all AWS read/write values seem consistently fixed near 12 MB/s, or how Digital Ocean’s Droplets do so much better in bandwidth tests.

A lot of this testing seems circumstantial and general at best, but it’s clear to me that processors and storage types matter when it comes to these shared resources. RamNode’s NVMe plan comes with good processors and exceptionally fast storage, and it shows. Time will tell whether all this glorious performance wins out over major platforms and all their perks.

I hope you enjoyed this post! I welcome questions and criticisms in the comments.


Non-Affiliate Links

* * *

Updated 10/16/19 am 1:23am