Although I usually try to avoid IaaS services as much as possible, for this side project I needed to expose Kestrel webserver directly and hence the obvious choice for hosting web app – the App Service – wasn’t an option. So I went for a VM. And given it’s a side project, I also wanted to run it cheaply. And why not to try to go all out with B1ls VM using Linux.
About the VM
The B1ls using Linux is a cheapest option at the moment on Azure. Around €3-4. You get 1 vCPU, 0,5 GB of RAM and 160 IOPS/10MBps of uncached disk throughput. Not much, but at least on paper it should be capable of running ASP.NET Core app (not a huge one, obviously) without any hacking.
I went for a Debian distribution, only because from all the options it’s what I liked the most. Instead of installing just the runtime I installed the whole SDK, since I also wanted to try compiling the app directly on the VM. The installation was smooth and in a short amount of time I was able to run
.NET Core SDK (reflecting any global.json): Version: 3.1.401 Commit: 39d17847db Runtime Environment: OS Name: debian OS Version: 10 OS Platform: Linux RID: debian.10-x64 Base Path: /usr/share/dotnet/sdk/3.1.401/ Host (useful for support): Version: 3.1.7 Commit: fcfdef8d6b .NET Core SDKs installed: 3.1.401 [/usr/share/dotnet/sdk] .NET Core runtimes installed: Microsoft.AspNetCore.App 3.1.7 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App] Microsoft.NETCore.App 3.1.7 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
Compiling a basically empty ASP.NET Core app on this machine takes a lot of time, like between 1 and 3 minutes. The reason is the nature of B-series burstable VMs and the size/IOPS of B1ls. But it’s possible.
Running the application is pretty easy too. On my machine I executed
dotnet publish -c Release -r linux-64 --self-contained false and copied the result onto the VM using
+x for the binary and off I go. My application is fairly small (just an ASP.NET Core (no MVC, no Razor Pages, etc.) and everything goes from memory (no disk, no database, etc.)), but I was still surprised how quickly it started (my expectation was something like Raspberry Pi 2/3/4 that I use for running .NET Core apps too).
This is the summary snapshot from
top command while my application is running.
Tasks: 84 total, 1 running, 83 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st MiB Mem : 397.5 total, 22.1 free, 250.9 used, 124.6 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 131.2 avail Mem
It is absolutely possible to run an ASP.NET Core on a B1ls VM, but it needs to be a slim one. The B1s might be a better option for a “reasonable” ASP.NET Core app with still a very favorable pricing (about double the price of B1ls).