CephII · Storage Performance FundamentalsStorage Performance Fundamentals
IOPS, throughput, latency — and why two of them fight
What you'll learn
- Define IOPS, throughput, and latency and state the relationship between them
- Derive which of the three a given workload is actually limited by
- Explain why a benchmark can show high IOPS and unusable latency at once
- Read a Ceph performance complaint and identify which number is being described
Prerequisites
None — start here.
Verified against Ceph Tentacle 20.2.x · Ceph Squid 19.2.x (supported previous) · cephadm matches the verified Ceph release · podman 4.x · csi-rbd and csi-cephfs current · RBD / CephFS / RGW current (matches Ceph release) · Linux kernel 5.15+ (5.10 minimum) · Ubuntu 24.04 LTS (Ceph host baseline) · Debian 12 (Bookworm) (Ceph host baseline) · Rocky Linux / RHEL / AlmaLinux 9.x (Ceph host baseline) · Proxmox VE 9.x (cross-course integration) · Kubernetes 1.31+ (cross-course integration) · 2026-08-18
Why this matters in production
Every storage complaint arrives as “it is slow”, and the first job is to work out which of three different things the person means. They are related by simple arithmetic and they behave completely differently under load, so guessing wrong sends you tuning the wrong thing for a day.
- IOPS — operations per second. How many discrete requests the device or cluster completes.
- Throughput — bytes per second. How much data moves.
- Latency — time per operation. How long one request takes.
The arithmetic that binds them
For a workload with a fixed block size:
throughput = IOPS x block size
A device doing 10,000 IOPS at 4 KiB moves about 40 MiB/s. The same device doing 1,000 IOPS at 1 MiB moves about 1 GiB/s. Both numbers describe the same hardware; the workload chose which one looks good.
Latency relates to the others through concurrency, which is where intuition usually breaks:
IOPS ≈ queue depth / latency
At queue depth 1, a device with 1 ms latency does 1,000 IOPS and nothing you do to the device changes that. Raising queue depth to 32 can take it to 30,000 IOPS — with latency now considerably worse than 1 ms per operation, because requests are waiting in a queue. Nothing got faster. More work is in flight.
Which number does the workload care about?
| Workload | Cares about | Because |
|---|---|---|
| Database commit | latency | the transaction blocks until the write lands |
| Database read from buffer pool miss | latency, then IOPS | one page at a time, many of them |
| VM boot storm | IOPS | thousands of small reads, concurrency is high |
| Backup or restore | throughput | large sequential transfers, latency irrelevant |
| Ceph recovery | throughput | moves whole objects as fast as the budget allows |
| Log ingestion | throughput and IOPS | many small appends, batched |
The two rows that matter most for a Ceph operator are the last two. Recovery is a throughput-shaped workload sharing hardware with latency-shaped client workloads, and that collision is the single most common cause of “the cluster went slow” tickets.
Where each number is visible in Ceph
ID=12
POOL=rbd-vms
ceph -s # cluster-wide client IOPS and throughput
ceph osd perf # per-OSD commit and apply latency, ms
ceph daemonperf osd.${ID} # live per-OSD operation counters
rados bench -p ${POOL} 60 write # deliberate throughput measurement
ceph -s reports what clients are getting. ceph osd perf is the one
to reach for when latency is the complaint: it lists every OSD with
its commit latency, and a single outlier in a column of otherwise
similar numbers is a failing device far more often than it is a
tuning problem.
Reading a complaint correctly
“The database is slow” almost always means latency. “The backup does not finish in the window” almost always means throughput. “The VMs hang when everyone logs in at 09:00” means IOPS under concurrency. Ask which one before touching anything, because the remedies are different and some of them are opposites: adding queue depth improves throughput and worsens latency, and throttling recovery improves client latency while making recovery take longer.
Quiz
Knowledge check · 4 questions
Q1. A benchmark reports 45,000 IOPS at 4 KiB from an OSD device, but the database on that pool sees 12 ms commit latency. What is the most likely explanation?
Q2. Doubling the queue depth of a workload generally increases IOPS and improves per-operation latency at the same time.
Q3. A cluster serving VM disks receives complaints of stuttering during business hours. ceph -s shows healthy status and moderate client throughput. Walk the investigation.
Four-node cluster, 24 SATA SSD OSDs, 3-way replication, RBD for 60 VMs. ceph -s shows HEALTH_OK, client I/O around 180 MiB/s read and 40 MiB/s write. Complaints are of brief freezes rather than sustained slowness. No recovery is in progress. Nothing changed recently.
Q4. Give the two formulas that relate IOPS, throughput, latency, and queue depth, and explain what each one predicts about a tuning change.
Passing score: 75%. Answers are checked in this browser.
Production discipline
Establish which of the three numbers a complaint is about before
changing anything, and record all four values — IOPS, throughput,
latency percentiles, and queue depth — whenever you measure. Watch
distributions rather than means: ceph osd perf is the highest-value
single command for latency complaints because one outlier device
raises p99 for every placement group it participates in. And treat
recovery as what it is — a throughput workload sharing devices with
latency-sensitive clients.
Cross-course references
- Linux: Part XLI (Disk Performance) and Part XXXVIII (Performance Fundamentals) for the single-host view.
- Observability: histogram and percentile metrics are the right shape for all three numbers.
- Proxmox: Part VIII (Ceph) for the hyperconverged case where client and cluster workloads share hardware.