Skip to content

VMFleet

Tool: VMFleet Status: Fully Implemented VMFleet 2.1.0.0

VMFleet deploys a fleet of lightweight Server Core VMs across your Azure Local cluster nodes, each running DiskSpd workloads to stress-test Storage Spaces Direct (S2D). It measures IOPS, throughput, and latency under realistic storage load.


Run This Test

Prerequisites

  • Azure Local cluster with Storage Spaces Direct enabled
  • PowerShell 7.2+ on your management workstation
  • WinRM access to all cluster nodes
  • A Server Core base VHD on the cluster CSV
  • Framework prerequisites completed

The VMFleet orchestrator runs all phases end-to-end with checkpoint-based resume:

# From the repository root
.\tools\vmfleet\Invoke-VMFleetPipeline.ps1 `
    -ConfigPath "config\variables.yml" `
    -Profiles @("General", "Peak") `
    -CredentialSource Interactive `
    -GenerateReports

If the pipeline fails mid-run, resume from the last checkpoint:

.\tools\vmfleet\Invoke-VMFleetPipeline.ps1 `
    -ConfigPath "config\variables.yml" `
    -Resume

Option B — Run Each Step Manually

Run each phase independently. This is useful for debugging, re-running a single phase, or learning how the pipeline works.

1. Install VMFleet on the cluster

.\tools\vmfleet\scripts\Install-VMFleet.ps1 `
    -ClusterName "hci01.corp.infiniteimprobability.com" `
    -Nodes @("hci01-node1", "hci01-node2")

2. Deploy fleet VMs

.\tools\vmfleet\scripts\Deploy-VMFleet.ps1 `
    -ClusterName "hci01.corp.infiniteimprobability.com" `
    -Nodes @("hci01-node1", "hci01-node2") `
    -VMCountPerNode 4 `
    -VMMemoryGB 2

3. Start a workload test

.\tools\vmfleet\scripts\Start-VMFleetTest.ps1 `
    -ClusterName "hci01.corp.infiniteimprobability.com" `
    -Profile "General" `
    -DurationSeconds 600

4. Monitor in real-time (run in a separate terminal)

.\tools\vmfleet\scripts\Watch-VMFleetMonitor.ps1 `
    -ClusterName "hci01.corp.infiniteimprobability.com"

5. Stop the test (if needed before duration completes)

.\tools\vmfleet\scripts\Stop-VMFleetTest.ps1 `
    -ClusterName "hci01.corp.infiniteimprobability.com"

6. Collect and aggregate results

.\tools\vmfleet\scripts\Collect-VMFleetResults.ps1 `
    -ClusterName "hci01.corp.infiniteimprobability.com" `
    -Nodes @("hci01-node1", "hci01-node2") `
    -RunId "<run-id>"

7. Clean up fleet VMs (optional)

.\tools\vmfleet\scripts\Remove-VMFleet.ps1 `
    -ClusterName "hci01.corp.infiniteimprobability.com"

Available Workload Profiles

Profile Write % Random % Block Size Target IOPS Use Case
General 30% 70% 8K ~5,000 Balanced mixed workload baseline
Peak IOPS 0% 100% 4K ~50,000 Maximum random read throughput
VDI 20% 80% 8K ~3,000 Virtual desktop simulation
SQL OLTP 30% 100% 8K ~10,000 SQL Server transaction processing
Sequential Throughput 100% 0% 512K N/A (MB/s) Sequential write ceiling

Profile YAML files are in tools/vmfleet/config/profiles/.


What You Get

After a test completes, you will have:

  • Raw DiskSpd XML per VM per node in tools/vmfleet/logs/
  • Aggregated JSON metrics with IOPS, throughput (MB/s), and latency (ms) per profile
  • Reports in PDF, DOCX, and/or XLSX format (if --GenerateReports was used)

File Locations

Component Path
Orchestrator tools/vmfleet/Invoke-VMFleetPipeline.ps1
Scripts tools/vmfleet/scripts/
Workload Profiles tools/vmfleet/config/profiles/
Monitoring Collectors tools/vmfleet/monitoring/collectors/
Alert Rules tools/vmfleet/monitoring/alerts/alert-rules.yml
Azure Monitor Workbook tools/vmfleet/monitoring/workbooks/vmfleet-workbook.json
Report Templates tools/vmfleet/reports/templates/
Logs tools/vmfleet/logs/

Deep Dive

Topic Page
Cluster and VMFleet requirements Prerequisites
VM deployment details Deployment
Profile parameters and tuning Workload Profiles
Metric collection and dashboards Monitoring
Report formats and templates Reporting
Common errors and fixes Troubleshooting

Automate This Test

To run VMFleet on a schedule or as part of a CI/CD workflow, see CI/CD Pipelines. The run-vmfleet.yml GitHub Actions workflow calls the same Invoke-VMFleetPipeline.ps1 script above with parameters from workflow dispatch inputs.