In this post we are going to explore:

  • how to simulate CPU-load hosted on an Azure web app;
  • how you can set simple rules for automatic scaling; and
  • how to setup alerts to get notified when your app is under pressure.

Let’s start by creating a very simple ASP.NET core web api application. The default web api template in Visual Studio is more than OK.

Create a simple Web Api application

To create a new ASP.NET core web api application, simply click on New Project…, then select ASP.NET Core Web Application, specify a name and from the next popup window select Web Api application, and then press OK.

azure-web-app-scale-test

Simulate CPU-Load

To simulate CPU-load in your web app you need to create a simple controller, `FakeLoadController` with an action `cpu-load` that takes into account two parameters:

  • how many seconds should the CPU-load last, and
  • which percentage should the CPU-load reach.

Please note that this method works in single-core environments, but in multi-core environments is not that accurate. However, for our demo where we want to perform a simple scaling test, it can help us build some fake CPU-load pretty easily.

using System;
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;

namespace AzureScaleTest.Controllers
{
    public class FakeLoadController : Controller
    {
        [HttpGet, Route("api/cpu-load")]
        public IActionResult CpuLoad(int seconds, int percentage)
        {
            FakeWorkload(seconds, percentage);

            return Ok($"Fake load of {percentage}% for {seconds} seconds");
        }

        // Method to simulate cpu load for a period of time        
        private void FakeWorkload(int seconds, int percentageCpu)
        {
            percentageCpu = Math.Max(100, percentageCpu);
            var end = DateTime.Now.AddSeconds(seconds);
            var percentage = percentageCpu;
            Stopwatch watch = new Stopwatch();
            watch.Start();
            while (DateTime.Now < end)
            {
                // Make the loop go on for "percentage" milliseconds then sleep the
                // remaining percentage milliseconds. So 40% utilization means work 40ms and sleep 60ms
                if (watch.ElapsedMilliseconds > percentage)
                {
                    System.Threading.Thread.Sleep(100 - percentage);
                    watch.Reset();
                    watch.Start();
                }
            }
        }
    }
}

Deploy to Azure

Before we start deploying this app to Azure, we need to find out which plan is suitable for this demo. From all the choices you have when you are about to choose an App Service Plan pricing tier, S1 (Standard) is the cheapest one that allows you to have the auto-scale feature, up to 10 instances, automatically.

standard-s1-pricing-tier

Firstly, you need to create a web app in Azure, by simply clicking on New -> Web + Mobile -> Web App and then:

  • name your app, such as `scale-test`,
  • specify a new resource group to keep things tidy,
  • create an App Service plan of at least S1 pricing tier, and
  • click on Create button

create-web-app

To deploy to Azure, go to Visual Studio, right-click on the web project and select Publish… and then follow the wizard steps as shown in the pictures below.

publish-to-azure

If your app gets published successfully, you will have a web application hosted on Azure, with two GET REST apis:

  • `api/values` which returns an array of values
  • `api/cpu-load?seconds={number_of_seconds}&percentage={cpu-load percentage}` to simulate CPU-load

Create rules and alerts for CPU-Load

In Azure web apps, setting a rule to autoscale your app in multiple instances is as easy as moving a slider. For argument’s sake, in Azure portal, head over to scale-test web app, and from the left sidebar click on Scale out (App Service Plan) option.

In the next blade there are two options:

  • the method you want to scale by,
  • and the number of instances you want your app to be scaled out

When you choose Scale by CPU Percentage, you are able to scale up or down based on CPU percentage, by dragging the sliders based on your app’s needs. In our demo we will select our app to be scaled out up to 3 instances when CPU is more than 80% and when the CPU-load drops under 60% the web app will scale down to 1 instance.

When a scale action happens, we can set to receive a notification either to an email or, by setting up a Webhook, to other apps like Slack.

scale-out-rules-cpu

Note: Don’t forget to click on Save button at the top left corner of the blade

Test Azure web app scaling

In order to test Azure web app scaling you need a load testing tool like WebSurge, that allows you to create a session with some http requests and play them back under load.

Click on New Session, select HTTP method (GET) and set the url to hit:

  • http://scale-test.azurewebsites.net/api/cpu-load?seconds=20&percentage=10

websurge-load-test

Then, set Time to 200 seconds and Threads to 20.

When you press Start, lot of CPU-load will be created in your web app and you will be able to see how your app scales up and down.

Monitor your App’s Performance

On the left sidebar, under Monitoring section, there is option Metrics per Instance (Apps). When you click on this option, you can get info about several metrics such as: %Processor Time, IO Read/Write bytes/sec, Requests/sec etc.

In this example, you can monitor % Processor Time while you load-test your app to check if your rules will be activated.

azure-scale-up-to-second-instance

In this graph, the blue line describes %processor time for the initial web app and, in particular, for about 5 minutes the load is between 60% – 80%. After this period of time, based on our scale-up rule, a new process spawns to share the load and an orange line appears while the blue one falls down.

When your app has been successfully scaled out to a second instance, a new email notification will be sent to your inbox, namely:

auto-scale-email-notification

Categorized in:

Tagged in:

,