Running WordPress on Azure B1ls Virtual Machines

Azure B1l - 50 user load with no caching

Have you ever wondered “How bad is it to run a WordPress site on a $3.80/month virtual machine in Azure?”. I haven’t either. But as I was browsing Azure virtual machine options the other day I came across the B1ls machines and figured I would give it a go. If for no reason other than keeping people from doing it.

Provisioning the Azure B1ls

Azure is most definitely not targeted at your typical WordPress user. Azure specializes in large corporations with complicated infrastructure demands. If you don’t have any experience configuring cloud infrastructure (Azure, AWS, GCP, etc) this could be confusing.

Part of the problem with Azure (versus something like DigitalOcean) is that you have to configure everything. Need an IP address? Add it yourself. Need a hard disk? Add it yourself. Need almost anything that isn’t a VM? Better get cozy because you’re going to be here awhile.

After all was said and done I was able to configure a $3.80 B1ls machine with 1 vCPU, 512MB of RAM, accessible from the internet, with Ubuntu 18.04 installed on it.

WordPress Azure B1ls configuration
Azure after slamming my head against it for awhile.

WordPress Configuration

Once the VM was provisioned and the network was set up, I was able to install a pretty basic LAMP stack.

  • PHP 7.2
  • MariaDB
  • Nginx
  • PHP-FPM
  • Memcached

During the installation and configuration of WordPress I did notice 1 thing: This VM is SUPER slow. I’m not sure if it’s memory constraints or CPU slowness, but it took forever to install the above packages.

Torturing Azure

I ran two WordPress load tests against the Azure B1ls instance. The first was 50 concurrent users with no caching and the second was 50 concurrent users with caching enabled. The results were predictable, but I wasn’t prepared for how well this cheap box performed when caching was enabled.

No Cache

This is the predictable portion of this adventure. It is well known that out of the box WordPress isn’t very performant. Given it’s flexibility this isn’t surprising.

WordPress Azure B1ls system load, no cach
System Load – 50 Users, No Cache

Let’s talk about how we tested this. Using Kernl’s WordPress Load Testing product, I was able to throw 50 concurrent users at the Azure VM from two different regions (New York, San Francisco). The results were not great.

WordPress Azure B1ls requests/failures per second
Requests / Failures per second

In the graph above you can see that things went OK for a few minutes, but eventually the B1ls VM couldn’t keep up anymore. Eventually all the requests that didn’t get handled timed out leading to the HUGE spike of failures. After that, you can see the failures started to level out.

WordPress Azure B1ls response times no cache
Response Time

Response times honestly weren’t awful, but they don’t really matter if the site can’t return content 🙂 At the end of the chart things start to look good, but that’s only because the server was throwing 500 errors almost immediately.

Cache Enabled

Now is where we start to bump in to the unexpected portion of this adventure. Given how poorly the Azure B1ls VM handled uncached WordPress I really couldn’t imagine them doing much better when cached. Boy was I wrong.

system load, cached
System Load – Cached

For this test we ran the same exact configuration as the uncached test (50 concurrent, New York, San Francisco), but this time we had W3 Total Cache configured with Memcached.

WordPress Azure B1ls requests per second, cached
Requests / Failures per Second

As you can see from the chart above, the story around running WordPress on the Azure B1ls VM in a cached scenario is VERY different. We maxed out at around 650 requests / second with zero failures.

Now you are probably wondering how we achieved 650 req/s on a 50 user load test. Me too. This is definitely a bug in Kernl’s load testing implementation which should be resolved soon.

response time distribution, cached
Response time distribution

Even with our unexpected request volume the response time distribution was pretty great. 100% of requests finished in under 3.5 seconds (this includes outliers). 99% of requests finished in 140ms. Given the number of concurrent requests and the cost of operation, I’m honestly amazed at that number.

Conclusions

Running WordPress on Azure is a choice most of us don’t make. Azure is a big, scary, complicated cloud provider targeted at Enterprise customers. The Azure B1ls virtual machines are an OK fit for WordPress, but only if your workload is cache friendly. As soon as you have to do things more complicated than going to the cache and fetching a page things fall apart quickly.

My conclusion is that the Azure B1ls virtual machines are fine for a WordPress personal blog with limited traffic so long as you cache everything. If you don’t fall into that category, stay away.

Want to load test your own WordPress site? Sign up for Kernl’s 30 day free trial.