Skip to content

Commit 58ee58c

Browse files
author
Kristopher Turner
committed
feat: implement fio, hammerdb, iperf, stress-ng tools
- fio (closes #12): Install-Fio, Start-FioTest, Collect-FioResults, 5 profiles (sequential-read/write, random-read/write, mixed-70-30), alert rules, report templates, Pester tests - hammerdb (closes #13): Install-HammerDB, Start-HammerDBTest, Collect-HammerDBResults, tpc-c/tpc-h profiles, alert rules, report templates, Pester tests - iperf (closes #14): Start-IperfTest, Collect-IperfResults, tcp-throughput/udp-latency/mesh profiles, alert rules, report templates, Pester tests - stress-ng (closes #14): Start-StressNgTest, Collect-StressNgResults, cpu-stress/memory-stress/io-stress profiles, alert rules, report templates, Pester tests All tools follow VMFleet pattern: PowerShell 7.2, CmdletBinding(SupportsShouldProcess), common/modules integration, try/catch/finally with Stop-LogSession
1 parent 3e2c9a4 commit 58ee58c

59 files changed

Lines changed: 3480 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

tools/fio/config/profiles/.gitkeep

Whitespace-only changes.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# =============================================================================
2+
# fio Workload Profile: Mixed 70/30
3+
# =============================================================================
4+
# 4K random mixed read/write (70% read, 30% write).
5+
# Represents typical production OLTP database workloads.
6+
# =============================================================================
7+
8+
profile:
9+
name: "Mixed 70/30"
10+
description: "4K random mixed I/O — 70% read, 30% write (production OLTP simulation)"
11+
category: "mixed"
12+
parameters:
13+
block_size: "4k"
14+
rw: "randrw"
15+
rwmixread: 70
16+
io_engine: "libaio"
17+
io_depth: 32
18+
num_jobs: 4
19+
runtime_seconds: 300
20+
test_directory: "/tmp/fio-test"
21+
expected_thresholds:
22+
min_iops: 25000
23+
max_lat_mean_ms: 10
24+
max_lat_p99_ms: 40
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# =============================================================================
2+
# fio Workload Profile: Random Read
3+
# =============================================================================
4+
# 4K random reads for peak IOPS measurement.
5+
# Represents OLTP read-heavy workloads (database reads, caching).
6+
# =============================================================================
7+
8+
profile:
9+
name: "Random Read"
10+
description: "4K random reads for peak read IOPS measurement"
11+
category: "iops"
12+
parameters:
13+
block_size: "4k"
14+
rw: "randread"
15+
rwmixread: 100
16+
io_engine: "libaio"
17+
io_depth: 32
18+
num_jobs: 4
19+
runtime_seconds: 300
20+
test_directory: "/tmp/fio-test"
21+
expected_thresholds:
22+
min_iops: 50000
23+
max_lat_mean_ms: 5
24+
max_lat_p99_ms: 20
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# =============================================================================
2+
# fio Workload Profile: Random Write
3+
# =============================================================================
4+
# 4K random writes for write IOPS measurement.
5+
# Represents OLTP write-heavy workloads (database inserts/updates).
6+
# =============================================================================
7+
8+
profile:
9+
name: "Random Write"
10+
description: "4K random writes for peak write IOPS measurement"
11+
category: "iops"
12+
parameters:
13+
block_size: "4k"
14+
rw: "randwrite"
15+
rwmixread: 0
16+
io_engine: "libaio"
17+
io_depth: 32
18+
num_jobs: 4
19+
runtime_seconds: 300
20+
test_directory: "/tmp/fio-test"
21+
expected_thresholds:
22+
min_iops: 30000
23+
max_lat_mean_ms: 8
24+
max_lat_p99_ms: 30
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# =============================================================================
2+
# fio Workload Profile: Sequential Read
3+
# =============================================================================
4+
# Full-sequential large-block reads for throughput measurement.
5+
# Represents streaming read workloads (backups, analytics, media).
6+
# =============================================================================
7+
8+
profile:
9+
name: "Sequential Read"
10+
description: "128K sequential reads for maximum throughput measurement"
11+
category: "throughput"
12+
parameters:
13+
block_size: "128k"
14+
rw: "read"
15+
rwmixread: 100
16+
io_engine: "libaio"
17+
io_depth: 16
18+
num_jobs: 4
19+
runtime_seconds: 300
20+
test_directory: "/tmp/fio-test"
21+
expected_thresholds:
22+
min_throughput_mbps: 500
23+
max_lat_mean_ms: 50
24+
min_iops: 4000
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# =============================================================================
2+
# fio Workload Profile: Sequential Write
3+
# =============================================================================
4+
# Full-sequential large-block writes for throughput measurement.
5+
# Represents streaming write workloads (log ingestion, backup targets).
6+
# =============================================================================
7+
8+
profile:
9+
name: "Sequential Write"
10+
description: "128K sequential writes for maximum write throughput measurement"
11+
category: "throughput"
12+
parameters:
13+
block_size: "128k"
14+
rw: "write"
15+
rwmixread: 0
16+
io_engine: "libaio"
17+
io_depth: 16
18+
num_jobs: 4
19+
runtime_seconds: 300
20+
test_directory: "/tmp/fio-test"
21+
expected_thresholds:
22+
min_throughput_mbps: 400
23+
max_lat_mean_ms: 100
24+
min_iops: 3200

tools/fio/monitoring/alerts/.gitkeep

Whitespace-only changes.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# =============================================================================
2+
# Alert Rules - fio Load Testing
3+
# =============================================================================
4+
# Threshold-based alert rules for monitoring host metrics during fio tests.
5+
# =============================================================================
6+
7+
metadata:
8+
version: "1.0.0"
9+
description: "Alert rules for fio storage load testing"
10+
11+
alert_rules:
12+
# ---- Storage Alerts ----
13+
- name: fio_high_disk_wait
14+
category: storage
15+
counter: '\PhysicalDisk(*)\% Disk Time'
16+
condition: greater_than
17+
threshold: 95
18+
severity: warning
19+
message: "Disk utilization exceeds 95% on {node} ({instance}) during fio test"
20+
cooldown_seconds: 60
21+
22+
- name: fio_high_disk_latency
23+
category: storage
24+
counter: '\PhysicalDisk(*)\Avg. Disk sec/Transfer'
25+
condition: greater_than
26+
threshold: 0.050 # 50ms
27+
severity: critical
28+
message: "CRITICAL: Disk transfer latency exceeds 50ms on {node} ({instance})"
29+
cooldown_seconds: 60
30+
31+
- name: fio_high_disk_queue
32+
category: storage
33+
counter: '\PhysicalDisk(*)\Current Disk Queue Length'
34+
condition: greater_than
35+
threshold: 64
36+
severity: warning
37+
message: "Disk queue length exceeds 64 on {node} ({instance}) during fio"
38+
cooldown_seconds: 120
39+
40+
# ---- Compute Alerts ----
41+
- name: fio_high_cpu
42+
category: compute
43+
counter: '\Processor(_Total)\% Processor Time'
44+
condition: greater_than
45+
threshold: 90
46+
severity: warning
47+
message: "CPU usage exceeds 90% on {node} during fio test (may affect accuracy)"
48+
cooldown_seconds: 300
49+
50+
- name: fio_high_iowait
51+
category: compute
52+
counter: '\System\Processor Queue Length'
53+
condition: greater_than
54+
threshold: 32
55+
severity: warning
56+
message: "High processor queue length on {node} — potential CPU bottleneck affecting I/O results"
57+
cooldown_seconds: 300
58+
59+
# ---- Memory Alerts ----
60+
- name: fio_low_memory
61+
category: memory
62+
counter: '\Memory\Available MBytes'
63+
condition: less_than
64+
threshold: 512
65+
severity: warning
66+
message: "Available memory below 512 MB on {node} during fio — page cache pressure may affect results"
67+
cooldown_seconds: 300
68+
69+
# ---- Network Alerts (for distributed fio) ----
70+
- name: fio_network_saturation
71+
category: network
72+
counter: '\Network Interface(*)\Current Bandwidth'
73+
condition: greater_than
74+
threshold: 9000000000 # 9 Gbps (90% of 10GbE)
75+
severity: warning
76+
message: "Network interface near saturation on {node} during fio test"
77+
cooldown_seconds: 120

tools/fio/reports/templates/.gitkeep

Whitespace-only changes.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
[discrete]
2+
= {doctitle}
3+
4+
[.text-center]
5+
--
6+
image::../../docs/images/logo.png[width=200,pdfwidth=30%,align=center]
7+
8+
[.lead]
9+
*Azure Local Load Testing Report — fio*
10+
11+
{cluster-name} | {test-date}
12+
13+
[.small]
14+
Run ID: {run-id} +
15+
Generated by Azure Local Load Tools +
16+
{revdate}
17+
--
18+
19+
<<<

0 commit comments

Comments
 (0)