Comparing Windows Server 2016 Nano TP5 Provisioning Time to GUI/Core Installation Options

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’ ; MemoryStartupBytes1GB }

$LAbVMs += @{ VMName ‘Win2016_Core’ ; Configuration ‘Simple’ ; ParentVHD ‘Win2016Core_G2.vhdx’ ; MemoryStartupBytes1GB }

$LAbVMs += @{ VMName = ‘Win2016_Nano’ ; Configuration ‘Simple’ ; ParentVHD ‘Win2016Nano_G2.vhdx’ ; MemoryStartupBytes1GB }

$LAbVMs += @{ VMName ‘Win2012’ ; Configuration ‘Simple’ ; ParentVHD ‘Win2012r2_G2.vhdx’ ; MemoryStartupBytes1GB ; Win2012Djoin=‘Yes’ }

$LAbVMs += @{ VMName ‘Win2012_Core’ ; Configuration ‘Simple’ ; ParentVHD ‘Win2012r2Core_G2.vhdx’ ; MemoryStartupBytes1GB ; 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)

..\Tools\convert-windowsimage.ps1

#win 2012r2

Convert-WindowsImage -SourcePath X:\sources\install.wim -DiskLayout UEFI -VHDPath .\ParentDisks\win2012r2_G2.vhdx-Edition datacenter -SizeBytes 40GB -Package .\Packages\Windows8.1-KB2919355-x64.msu,.\Packages\Windows8.1-KB3156418-x64.msu

#win 2012r2 core

Convert-WindowsImage -SourcePath X:\sources\install.wim -DiskLayout UEFI -VHDPath .\ParentDisks\win2012r2Core_G2.vhdx-Edition datacentercore -SizeBytes 40GB -Package .\Packages\Windows8.1-KB2919355-x64.msu,.\Packages\Windows8.1-KB3156418-x64.msu

#win 2016

Convert-WindowsImage -SourcePath x:\sources\install.wim -DiskLayout UEFI -VHDPath .\ParentDisks\win2016_G2.vhdx-Edition datacenter -SizeBytes 40GB -Package .\Packages\AMD64-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 R2 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 R2 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 R2 Core

82

9.1

1,618

10.4

1,426

10.6

3,044

10.5

2012 R2 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