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.
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…
- Memory, CPU, and fast storage, because I want sites and apps to be as fast as they can.
- Network bandwidth, in case the usual trickle ever becomes a flood.
- Cost, as I’m ruthlessly cheap with my own hosting and my low-traffic sites don’t warrant exciting infrastructure spend.
- Location/latency. I’m in Seattle and short pings make everything feel fast.
- Support, which should be competent and able to respond to coherently-submitted tickets within at least a few hours.
- 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.
|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.)
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 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.
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 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.
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…
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 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.
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.
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.
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.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
Cheap VPS Results
Geekbench Multi-Core + UnixBench Scores
PHP + MySQL Performance
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:
|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
PHP + MySQL Performance
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
Geekbench Points per Dollar
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.