2018 Budget VPS Survey


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 #

  • ServerPilot
  • RunCloud
  • Laravel Forge
  • Moss
  • Cloudways
  • Centmin Mod 👍

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+PlanXeon CPURAMStorageCostLocation
RamNode 2GB OpenVZ2×E5-26302GB60GB SSD$6.65/month*Seattle, WA
RamNode 2GB NVMe2×E3-12402GB25GB SSD$12/monthLos Angeles, CA
SSD Nodes KVM / X-Large4×Skylake16GB80GB SSD$9.99/month*Dallas, TX
HostUS 4GB OpenVZ4×L56404GB150GB HDD$9.56/monthLos Angeles, CA
Hyper Expert 12GB KVM8×E5-267012GB80GB SSD$18.89/month*Seattle, WA
Digital Ocean 2GB1×E5-26502GB50GB$10/monthSan Francisco, CA
Digital Ocean 4GB2×E5-26504GB80GB SSD$20/monthSan Francisco, CA
Linode 2GB1×Gold 61482GB50GB$10/monthFremont, CA
Linode 4GB2×E5-26974GB80GB$20/monthFremont, CA
Vultr 2GB1×Skylake2GB40GB$10/monthSeattle, WA
Vultr 4GB2×Skylake4GB60GB$20/monthSeattle, WA
AWS Lightsail 2GB1×E5-26762GB60GB$10/monthNorthern OR
AWS Lightsail 4GB2×E5-26764GB80GB$20/monthNorthern 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

$/MonthvCPU CoresRAM (GB)Storage (GB)RamNode 2GB OpenVZRamNode 2GB NVMeSSD Nodes KVM / X-LargeHostUS 4GB OpenVZHyper Expert 12GB KVMDigital Ocean 2GBDigital Ocean 4GBLinode 2GBLinode 4GBVultr 2GBVultr 4GBAWS Lightsail 2GBAWS Lightsail 4GB0255075100125150$6.6522 GB60 GB$1222 GB25 GB$9.99416 GB80 GB$9.5644 GB150 GB$18.89812 GB80 GB$1012 GB50 GB$2024 GB80 GB$1012 GB50 GB$2024 GB80 GB$1012 GB40 GB$2024 GB60 GB$1012 GB60 GB$2024 GB80 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:

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:

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

...
------------------------
Total              2.655
real: 2.74s user: 2.70s sys: 0.03s cpu: 99% maxmem: 19740 KB cswaits: 1

...
------------------------
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

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:

randomreads: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
randomwrites: (g=0): rw=randwrite, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64

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-CoreUnixBenchRamNode 2GB OpenVZRamNode 2GB NVMeSSD Nodes KVM / X-LargeHostUS 4GB OpenVZHyper Expert 12GB KVMDigital Ocean 2GBDigital Ocean 4GBLinode 2GBLinode 4GBVultr 2GBVultr 4GBAWS Lightsail 2GBAWS Lightsail 4GB02800560084001120014000168002874622.579261718.680051684.36264712.2138943515.42690702.754381481.63321859.745951543.537641135.474352006.4309874858781490.2

Higher is better.

PHP + MySQL Performance

PHPMySQLRamNode 2GB OpenVZRamNode 2GB NVMeSSD Nodes KVM / X-LargeHostUS 4GB OpenVZHyper Expert 12GB KVMDigital Ocean 2GBDigital Ocean 4GBLinode 2GBLinode 4GBVultr 2GBVultr 4GBAWS Lightsail 2GBAWS Lightsail 4GB05101520253023.674s4.751s2.436s2.042s3.7657s3.396s4.6333s2.807s3.9357s1.927s4.5547s4.247s3.9987s2.425s3.531s2.677s4.6533s2.252s2.598s2.675s2.7583s1.298s3.5807s2.89s3.7107s1.665s

Lower is better.

Storage I/O

Random Read MB/sRandom Write MB/sRamNode 2GB OpenVZRamNode 2GB NVMeSSD Nodes KVM / X-LargeHostUS 4GB OpenVZHyper Expert 12GB KVMDigital Ocean 2GBDigital Ocean 4GBLinode 2GBLinode 4GBVultr 2GBVultr 4GBAWS Lightsail 2GBAWS Lightsail 4GB010020030040050060060.971 MB/s341.527 MB/s486.019 MB/s435.018 MB/s171.798 MB/s97.921 MB/s291.99 MB/s574.7 MB/s314.491 MB/s377.956 MB/s321.332 MB/s112.403 MB/s395.337 MB/s195.495 MB/s494.497 MB/s307.484 MB/s333.385 MB/s128.880 MB/s159.834 MB/s159.712 MB/s201.853 MB/s191.602 MB/s12.384 MB/s12.291 MB/s12.381 MB/s12.282 MB/s

Bandwidth

RamNode 2GB OpenVZRamNode 2GB NVMeSSD Nodes KVM / X-LargeHostUS 4GB OpenVZHyper Expert 12GB KVMDigital Ocean 2GBDigital Ocean 4GBLinode 2GBLinode 4GBVultr 2GBVultr 4GBAWS Lightsail 2GBAWS Lightsail 4GB05010015020025030017.9 MB/s86.4 MB/s103 MB/s35.8 MB/s105 MB/s242 MB/s137 MB/s178 MB/s130 MB/s138 MB/s140 MB/s68.4 MB/s75.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+PlanXeon CPURAMStorageCostLocation
Vultr 32GB8×Skylake32GB300GB$160/monthSeattle, WA
Digital Ocean 16GB CPU8×Platinum 816816GB100GB SSD$160/monthSan Francisco, CA
AWS m5.2xlarge8×Skylake32GB-$262.08/monthNorthern OR
Digital Ocean 32GB8×Gold 614032GB640GB SSD$160/monthSan Francisco, CA
Linode 32GB8×E5-268032GB640GB SSD$160/monthFremont, CA
Lightsail 16GB4×E5-268616GB320GB SSD$80/monthNorthern OR

Geekbench Multi-Core + UnixBench Scores

Geekbench Multi-CoreUnixBenchHyper Expert 12GB KVMSSD Nodes 16GB KVM XLVultr 32GBDigital Ocean 16GB CPUAWS m5.2xlargeDigital Ocean 32GBLinode 32GBLightsail 16GB04400880013200176002200026400138943515.480051684.3214314182.9175004408.1161764681.1132464110123553618.2112072979

Higher is better.

PHP + MySQL Performance

PHPMySQLHyper Expert 12GB KVMSSD Nodes 16GB KVM XLVultr 32GBDigital Ocean 16GB CPUAWS m5.2xlargeDigital Ocean 32GBLinode 32GBLightsail 16GB01234563.9357s1.927s3.7657s3.396s2.701s1.644s2.5303s0.993s2.7517s0.661s5.9287s1.744s4.2063s1.963s3.435s1.059s

Lower is better.

Storage I/O

Random Read MB/sRandom Write MB/sHyper Expert 12GB KVMSSD Nodes 16GB KVM XLVultr 32GBDigital Ocean 16GB CPUAWS m5.2xlargeDigital Ocean 32GBLinode 32GBLightsail 16GB0140280420560700840314.491 MB/s377.956 MB/s171.798 MB/s97.921 MB/s164.008 MB/s148.854 MB/s686.855 MB/s164.187 MB/s12.137 MB/s12.053 MB/s350.31 MB/s32.329 MB/s300.438 MB/s130.095 MB/s12.34 MB/s12.281 MB/s

Bandwidth

Hyper Expert 12GB KVMSSD Nodes 16GB KVM XLVultr 32GBDigital Ocean 16GB CPUAWS m5.2xlargeDigital Ocean 32GBLinode 32GBLightsail 16GB050100150200250300105 MB/s103 MB/s120 MB/s279 MB/s224 MB/s237 MB/s171 MB/s43.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 OpenVZRamNode 2GB NVMeSSD Nodes KVM / X-LargeHostUS 4GB OpenVZHyper Expert 12GB KVMDigital Ocean 2GBDigital Ocean 4GBDigital Ocean 16GB CPUDigital Ocean 32GBLinode 2GBLinode 4GBLinode 32GBVultr 2GBVultr 4GBVultr 32GBAWS m5.2xlargeAWS Lightsail 2GBAWS Lightsail 4GBAWS Lightsail 16GB04008001200160020002400307 MB170 MB1640 MB428 MB650 MB204 MB204 MB102 MB204 MB204 MB204 MB204 MB204 MB204 MB204 MB125 MB204 MB204 MB204 MB

Higher is better.

Geekbench Points per Dollar

RamNode 2GB OpenVZRamNode 2GB NVMeSSD Nodes KVM / X-LargeHostUS 4GB OpenVZHyper Expert 12GB KVMDigital Ocean 2GBDigital Ocean 4GBDigital Ocean 16GB CPUDigital Ocean 32GBLinode 2GBLinode 4GBLinode 32GBVultr 2GBVultr 4GBVultr 32GBAWS m5.2xlargeAWS Lightsail 2GBAWS Lightsail 4GBAWS Lightsail 16GB01703405106808501020432660801428735269271109823322297737636713361309293140

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.


I spent lots of time and very little money putting all this together, and I have no special relationship with any of these hosts beyond that of paying customer. I avoided using affiliate links above, but here they are if you’d like to try any of these providers and encourage me to keep wasting even more time experimenting further.

* * *