Foreword
Hello again from Prague! Here is Jaromir and, in this post, I’ll show you how you can play with ws2016lab to measure I/O consumption of each server installation option.
I decided to compare the Nano Server IO footprint to other, traditional GUI/Core installations. Why? I just wanted to demonstrate that having unnecessary components is something you really don’t want because it is not only a bigger security surface, but also significantly higher IO overhead.
Why should you care? Let’s say you would like to deploy a new application – therefore you need to provision a new server. It’s not only the provisioning time you should be concerned about, but also how much you will slow down production, as some server will be spinning up.
In this blog post I’ll be comparing very first boot IOs of domain joined and offline patched servers (Cumulative Update for Windows Server 2016 TP5 and 2 Cumulative Updates for Windows Server 2012R2). You will see how many Mbytes each edition consumes during very first boot from your Storage.
Scenario
I’ll be using my ws2016lab (https://github.com/Microsoft/ws2016lab) with following configuration.
$LabConfig=@{AdminPassword=‘LS1setup!’; DomainAdminName=‘Jaromirk’; Prefix = ‘PerfTest-‘; SecureBoot=‘ON’; CreateClientParent=‘No’;DCEdition=‘ServerDataCenter’}
$NetworkConfig=@{SwitchName = ‘LabSwitch’ ; StorageNet1=‘172.16.1.’; StorageNet2=‘172.16.2.’}
$LAbVMs = @()
$LAbVMs += @{ VMName = ‘Win2016’ ; Configuration = ‘Simple’ ; ParentVHD = ‘Win2016_G2.vhdx’ ; MemoryStartupBytes= 1GB }
$LAbVMs += @{ VMName = ‘Win2016_Core’ ; Configuration = ‘Simple’ ; ParentVHD = ‘Win2016Core_G2.vhdx’ ; MemoryStartupBytes= 1GB }
$LAbVMs += @{ VMName = ‘Win2016_Nano’ ; Configuration = ‘Simple’ ; ParentVHD = ‘Win2016Nano_G2.vhdx’ ; MemoryStartupBytes= 1GB }
$LAbVMs += @{ VMName = ‘Win2012’ ; Configuration = ‘Simple’ ; ParentVHD = ‘Win2012r2_G2.vhdx’ ; MemoryStartupBytes= 1GB ; Win2012Djoin=‘Yes’ }
$LAbVMs += @{ VMName = ‘Win2012_Core’ ; Configuration = ‘Simple’ ; ParentVHD = ‘Win2012r2Core_G2.vhdx’ ; MemoryStartupBytes= 1GB ; Win2012Djoin=‘Yes’ }
Ws2016 lab does not create Windows Server 2016 Full, Windows Server 2012 R2, and Windows Server 2012 R2 Core images, so I’ll create them manually using following commands and tool convert-windowsimage.ps1 ]https://github.com/Microsoft/Virtualization-Documentation/tree/master/hyperv-tools/Convert-WindowsImage
#loading convert-windowsimage into the memory (notice . in front of command)
..Toolsconvert-windowsimage.ps1
#win 2012r2
Convert-WindowsImage -SourcePath X:sourcesinstall.wim -DiskLayout UEFI -VHDPath .ParentDiskswin2012r2_G2.vhdx ` -Edition datacenter -SizeBytes 40GB -Package .PackagesWindows8.1-KB2919355-x64.msu,.PackagesWindows8.1-KB3156418-x64.msu
#win 2012r2 core
Convert-WindowsImage -SourcePath X:sourcesinstall.wim -DiskLayout UEFI -VHDPath .ParentDiskswin2012r2Core_G2.vhdx ` -Edition datacentercore -SizeBytes 40GB -Package .PackagesWindows8.1-KB2919355-x64.msu,.PackagesWindows8.1-KB3156418-x64.msu
#win 2016
Convert-WindowsImage -SourcePath x:sourcesinstall.wim -DiskLayout UEFI -VHDPath .ParentDiskswin2016_G2.vhdx ` -Edition datacenter -SizeBytes 40GB -Package .PackagesAMD64-all-windows10.0-kb3158987-x64_6b363d8ecc6ac98ca26396daf231017a258bfc94.msu
You can see that each image is using the following update rollups.
Windows 2012R2: https://support.microsoft.com/en-us/kb/2919355 + https://support.microsoft.com/en-us/kb/3156418
Windows 2016: http://support.microsoft.com/kb/3158987
In this screenshot you can see all vhdx files in the parent disks folder. Big size differences, right? And yes, I was writing this blog for you late at night.
Note: Nano server contains all of these packages:
Microsoft-NanoServer-DSC-Package.cab
Microsoft-NanoServer-FailoverCluster-Package.cab
Microsoft-NanoServer-Guest-Package.cab
Microsoft-NanoServer-Storage-Package.cab
Microsoft-NanoServer-SCVMM-Package.cab
All servers are hydrated as VMs on my laptop on my 1T Samsung 840 EVO SSD
Hydrated machines ready to be started
Msinfo32
Measuring IO overhead
For measuring IO overhead, I’ll be using Windows Performance Recorder and Windows Performance Analyzer – tools that you can download and install for free as part of Windows ADK. For each VM, I’ll start recording, boot VM, wait for logon screen to appear and then wait additional 60 seconds just to settle things down.
Windows Performance Recorder settings:
Results
For displaying results I’m using Windows Performance Analyzer. Again – its free and part of Windows ADK.
Windows Server 2016 Nano
From the screenshot below you can see that IO settled down after 9 seconds. Total reads were 156 MB and Total Writes 135 MB. Machine did not reboot at all.
Windows Server 2016 Core
From the screenshot below you can see that IO settled down after 85 seconds. Total reads were 2,304 MB and Total Writes 1,170 MB. Machine rebooted once.
Windows Server 2016 Full
From the screenshot below you can see that IO settled down after 135 seconds. Total reads were 2,533 MB and Total Writes 2,089 MB. Machine rebooted once.
Windows Server 2012 Core
From the screenshot below you can see that IO settled down after 82 seconds. Total reads were 1,618 MB and Total Writes 1,426 MB. Machine rebooted once.
Windows Server 2012 Full
From the screenshot below you can see that IO settled down after 84 seconds. Total reads were 1,694 MB and Total Writes 1,453 MB. Machine rebooted once.
Summary
Results table: Degradation column is how many times is result bigger compared to Nano Server.
Server |
Boot Time (s) |
Boot Degradation |
Read (MB) |
Read Degradation |
Write (MB) |
Write Degradation |
Total (MB) |
Total IO Degradation |
2016 Nano |
9 |
1.0 |
156 |
1.0 |
135 |
1.0 |
290 |
1.0 |
2016 Core |
85 |
9.4 |
2,304 |
14.8 |
1,170 |
8.7 |
3,474 |
12.0 |
2016 Full |
135 |
15.0 |
2,533 |
16.3 |
2,089 |
15.5 |
4,622 |
15.9 |
2012 Core |
82 |
9.1 |
1,618 |
10.4 |
1,426 |
10.6 |
3,044 |
10.5 |
2012 Full |
84 |
9.3 |
1,694 |
10.9 |
1,453 |
10.8 |
3,147 |
10.8 |
Bonus
Memory Demand
Running Services
Wrap-up
As you can see, there are significant differences between each installation option in terms of boot time and Read/Write Mbytes. Now imagine you have to deploy dozens of servers. Sure, you can have caching that improves things a lot, but still… If you want GUI, use a Client with RSAT https://www.microsoft.com/en-us/download/details.aspx?id=45520
The results are illustrative as I did not do proper lab measurement (I don’t have an extra machine), I did not repeat measurements (Its really late here J ) and I did not calculate uncertainty – or whatever it is called now (it’s been a long time since I finished my University, so I don’t remember formulas anymore). Anyway – with all this info you can repro it on your laptop, measure it yourself and ping me with your results!
Do you want to see what other stuff I can do with ws2016lab tool? Let me know in comments.
Cheers!
Jaromirk@msft