Many people have been asking me about my setup for the dynamic memory demonstration that I did in a number of locations earlier this year.  I have been telling myself that I would take the time to polish up my demo scripts and post them here – but I have been too busy lately – so instead you are going to get the unpolished scripts Smile

The first part of the dynamic memory demonstration was to make sure that I had virtual machines that “looked right”.  I did not want to have a bunch of idle virtual machines – as people would not be interested in seeing how much memory I could squeeze out of Windows when it was not doing anything.  At the same time I did not want to use some of the higher end workload simulators – as many of these are server / client applications – and I needed something that would work on a laptop without a network connection.

My solution was what I ended up calling “VDI lite”

(Let me be crystal clear – I am in no way pretending that this is an accurate representation of a real user workload.  This was not used in any testing or validation of dynamic memory – this is simply something I put together by myself to make my demo look good!).

The approach I took was to gather a bunch of common document files – I did this by doing a “file type” search on Microsoft.com.  I have put these files up on my skydrive:

(had to do it in two files – due to the 50mb file size limit on sky drive)

These are all documents that you can find on Microsoft.com and most of them reference Hyper-V in one way or another.  I then wrote this PowerShell script:

# Setup Arrays
$documentSourceArray = @()
$processArray = New-Object System.Collections.ArrayList
 
# Populate source array.  Entries have three values - the document, the program to open it with, and the process name for closing the process
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\05-2008ClabbySixReasonsWhyMSwillovertakeVMW.PDF""","""C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe""", "AcroRd32")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\BTS09HyperV.pdf""","""C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe""", "AcroRd32")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Hyper-V_ProductOverview_v1_2.pdf""","""C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe""", "AcroRd32")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\LefthandHyper-VBrief.pdf""","""C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe""", "AcroRd32")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Top Ten Reasons for Hyper-V.pdf""","""C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe""", "AcroRd32")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\LiveMigrationWhitepaper_Final.docx""","""C:\Program Files\Microsoft Office\Office14\WINWORD.EXE""", "WINWORD")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Windows Server 2008 R2 Hyper-V RC Public  FAQ.docx""","""C:\Program Files\Microsoft Office\Office14\WINWORD.EXE""", "WINWORD")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Windows_Server_2008_R2_Reviewers_Guide_RTM.docx""","""C:\Program Files\Microsoft Office\Office14\WINWORD.EXE""", "WINWORD")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Windows_Server_2008_R2_TDM_Whitepaper_RTM.docx""","""C:\Program Files\Microsoft Office\Office14\WINWORD.EXE""", "WINWORD")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\WS08_R2_VHD_Performance_WhitePaper_Final.docx""","""C:\Program Files\Microsoft Office\Office14\WINWORD.EXE""", "WINWORD")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Storage and Hyper-V - The Choices You Can Make and the Things You Need to Know.pptx""","""C:\Program Files\Microsoft Office\Office14\POWERPNT.EXE""", "POWERPNT")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Windows Server 2008 R2 - Hyper-V Part 1.pptx""","""C:\Program Files\Microsoft Office\Office14\POWERPNT.EXE""", "POWERPNT")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Windows Server 2008 R2 - Hyper-V Part 2.pptx""","""C:\Program Files\Microsoft Office\Office14\POWERPNT.EXE""", "POWERPNT")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\WS08 R2 Hyper-V Overview_R2.pptx""","""C:\Program Files\Microsoft Office\Office14\POWERPNT.EXE""", "POWERPNT")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\WS08 R2 Hyper-V Technical Overview_R2.pptx""","""C:\Program Files\Microsoft Office\Office14\POWERPNT.EXE""", "POWERPNT")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Hyper-V RAM Calculator.xls""","""C:\Program Files\Microsoft Office\Office14\EXCEL.EXE""", "EXCEL")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Appendix_A_-_Test_Results_Spreadsheet.xlsx""","""C:\Program Files\Microsoft Office\Office14\EXCEL.EXE""", "EXCEL")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\DPM 2010 Storage Calculator for Hyper-V DRAFT.xlsx""","""C:\Program Files\Microsoft Office\Office14\EXCEL.EXE""", "EXCEL")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Windows Server 2008 Hyper-V Attack Surface Reference.xlsx""","""C:\Program Files\Microsoft Office\Office14\EXCEL.EXE""", "EXCEL")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\WinHEC08_Agenda.xlsx""","""C:\Program Files\Microsoft Office\Office14\EXCEL.EXE""", "EXCEL")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Microsoft Events  TechEd USA.mht""","""C:\Program Files\Internet Explorer\iexplore.exe""", "iexplore")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Virtual PC Guy's WebLog - Site Home - MSDN Blogs.mht""","""C:\Program Files\Internet Explorer\iexplore.exe""", "iexplore")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Windows Server 2008 R2 Virtualization with Hyper-V.mht""","""C:\Program Files\Internet Explorer\iexplore.exe""", "iexplore")
$documentSourceArray += ,("""C:\Users\DM-VDI-Demo\Documents\Windows Virtual PC Home Page.mht""","""C:\Program Files\Internet Explorer\iexplore.exe""", "iexplore")
 
# Loop for all eternity
while (1 -eq 1)
{
 
# Generate random sleep time between 10 and 90 seconds
$sleepTime = Get-Random -min 10 -max 90
 
# Generate random boolean value
$test = [boolean](get-random -input 0,1)
 
# If the boolean is true - or no processes are running - start a new process
if ($test -or ($processArray.count -eq 0))
   {
   # Choose a random entry from the source array
   $entry = $documentSourceArray[(Get-Random -min 0 -max ($documentSourceArray.length - 1))]
   # Start the process
   $p = [diagnostics.process]::start($entry[1], $entry[0])
   # Add the process name to the process array - if it is not already there
   if (!$processArray.contains($entry[2]))
      {
      [void]$processArray.add($entry[2])
      }
   
   # Display debug information
   write-host "Opening program" $entry[2]
   write-host "Opening file" $entry[0]
   Write-host
   write-host "Numer of open programs:" $processArray.count
   write-host "Open programs:"
   write-host $processArray
   Write-host   
   
   }
# Otherwise close a program
else 
   {
   # Choose a random program, or if there is only one choose it and set the sleep counter to 1 second
   if ($processArray.count -gt 1) {$index = Get-Random -min 0 -max ($processArray.count - 1)}
   else {$index = 0;$sleepTime = 1}
   
   # Display debug information
   write-host "Closing program" $processArray[$index]
   Write-host
   
   # Close the process.  Key things - CloseMainWindow ensures that the process exists politely.
   # All the looping makes sure that all instances are fully closed
   $p = @(Get-Process -name $processArray[$index])
   while ($p = @(Get-Process -name $processArray[$index] -ea 0)) {foreach ($q in $p) {[void]$q.CloseMainWindow()}; sleep 1}
   
   # Remove the process from the array
   $processArray.Remove($processArray[$index])
   
   # Display debug information
   write-host "Numer of remaining programs:" $processArray.count
   write-host "Remaining programs:"
   write-host $processArray
   Write-host
   }
 
# wait for a random amount of time
write-host "Waiting for" $sleepTime "seconds"
Write-host
sleep $sleepTime  
}

Which does the following:

  • Creates an array which contains the details of all the documents that I have (you will probably need to fix the path to use it on your computer)
  • Waits a random period of time and then either:
    • Opens a new document
    • Closes a currently open program

Nothing too fancy – but it does cause memory to move around between virtual machines, and it does demonstrate that the virtual machines are actually doing something.

Cheers,
Ben