fio — Workload Profiles¶
This guide covers the built-in fio workload profiles and how to execute them.
Built-in Profiles¶
| Profile | File | Category | Block Size | Pattern | Primary Threshold |
|---|---|---|---|---|---|
| Sequential Read | sequential-read.yml |
throughput | 128K | read |
≥ 500 MB/s |
| Sequential Write | sequential-write.yml |
throughput | 128K | write |
≥ 400 MB/s |
| Random Read | random-read.yml |
iops | 4K | randread |
≥ 50,000 IOPS |
| Random Write | random-write.yml |
iops | 4K | randwrite |
≥ 30,000 IOPS |
| Mixed 70/30 | mixed-70-30.yml |
mixed | 4K | randrw |
≥ 25,000 IOPS |
Profile Details¶
Sequential Read¶
Measures peak sustained read throughput using large 128K blocks — typical of streaming, analytics, and backup/restore workloads.
profile:
name: "Sequential Read"
description: "128K sequential reads for maximum throughput measurement"
category: "throughput"
parameters:
block_size: "128k"
rw: "read"
io_engine: "libaio"
io_depth: 16
num_jobs: 4
runtime_seconds: 300
test_directory: "/tmp/fio-test"
expected_thresholds:
min_throughput_mbps: 500
max_lat_mean_ms: 50
min_iops: 4000
When to use: Pre-migration validation for streaming workloads; storage tier qualification; RDMA-enabled storage read baseline.
Sequential Write¶
Measures peak sustained write throughput — typical of log ingestion, backup targets, and write-heavy analytics.
profile:
name: "Sequential Write"
parameters:
block_size: "128k"
rw: "write"
io_engine: "libaio"
io_depth: 16
num_jobs: 4
runtime_seconds: 300
expected_thresholds:
min_throughput_mbps: 400
max_lat_mean_ms: 100
min_iops: 3200
When to use: Storage write path validation; HSM/ILM tier benchmarking; backup storage qualification.
Random Read¶
Measures peak random read IOPS at 4K — the standard metric for OLTP database read performance.
profile:
name: "Random Read"
parameters:
block_size: "4k"
rw: "randread"
io_engine: "libaio"
io_depth: 32
num_jobs: 4
runtime_seconds: 300
expected_thresholds:
min_iops: 50000
max_lat_mean_ms: 5
max_lat_p99_ms: 20
When to use: Before deploying SQL Server, PostgreSQL, or other OLTP databases; cache effectiveness testing.
Random Write¶
Measures peak random write IOPS at 4K — validates write endurance and journal/WAL performance.
profile:
name: "Random Write"
parameters:
block_size: "4k"
rw: "randwrite"
io_engine: "libaio"
io_depth: 32
num_jobs: 4
runtime_seconds: 300
expected_thresholds:
min_iops: 30000
max_lat_mean_ms: 8
max_lat_p99_ms: 30
When to use: Write-intensive database validation; storage tier endurance tests.
Mixed 70/30¶
Simulates a production OLTP read/write ratio (70% read, 30% write) at 4K — the closest to real-world database workloads.
profile:
name: "Mixed 70/30"
parameters:
block_size: "4k"
rw: "randrw"
rwmixread: 70
io_engine: "libaio"
io_depth: 32
num_jobs: 4
runtime_seconds: 300
expected_thresholds:
min_iops: 25000
max_lat_mean_ms: 10
max_lat_p99_ms: 40
When to use: General cluster validation; pre-production sign-off; mixed workload capacity planning.
Running Profiles¶
Single Profile¶
.\tools\fio\scripts\Start-FioTest.ps1 `
-ClusterName "hci01.corp.infiniteimprobability.com" `
-Nodes @("hci01-node1", "hci01-node2") `
-Profile "random-read"
Override Parameters at Runtime¶
.\tools\fio\scripts\Start-FioTest.ps1 `
-ClusterName "hci01.corp.infiniteimprobability.com" `
-Nodes @("hci01-node1") `
-Profile "random-read" `
-RuntimeSeconds 600 `
-IODepth 64
Explicit parameters override the profile values; profile values override fio.json defaults.
Profile Sweep (All Profiles)¶
$nodes = @("hci01-node1", "hci01-node2", "hci01-node3")
$profiles = @("sequential-read", "sequential-write", "random-read", "random-write", "mixed-70-30")
foreach ($profile in $profiles) {
$result = .\tools\fio\scripts\Start-FioTest.ps1 `
-ClusterName "hci01.corp.infiniteimprobability.com" `
-Nodes $nodes `
-Profile $profile
.\tools\fio\scripts\Collect-FioResults.ps1 `
-ClusterName "hci01.corp.infiniteimprobability.com" `
-Nodes $nodes `
-RunId $result.RunId
}
Profile Schema¶
All profiles follow this schema:
profile:
name: string # Human-readable name
description: string # One-line description
category: string # throughput | iops | mixed
parameters:
block_size: string # e.g. "4k", "128k"
rw: string # read | write | randread | randwrite | randrw
rwmixread: integer # 0-100 (only for randrw)
io_engine: string # libaio (Linux)
io_depth: integer # Outstanding I/O operations per job
num_jobs: integer # Parallel fio job processes
runtime_seconds: integer
test_directory: string
expected_thresholds:
min_iops: integer
min_throughput_mbps: number
max_lat_mean_ms: number
max_lat_p99_ms: number
Creating Custom Profiles¶
Copy an existing profile YAML and adjust parameters:
Then reference it by stem name at runtime: -Profile "my-profile".