Skip to main content
RunBook Academy

CephII · Storage Performance FundamentalsStorage Performance Fundamentals

Fast disks are not fast distributed storage

Intermediate⏱ ~15 mincephfio

What you'll learn

  • Decompose a distributed write into its latency components
  • Explain why the device number is a floor rather than an expectation
  • Set realistic latency budgets for RBD, CephFS, and RGW
  • Recognise designs that assume local-disk latency from distributed storage

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

Not yet marked complete on this device.

Why this matters in production

“We bought NVMe, so storage will be fast” is a sentence that has preceded a great many disappointing Ceph deployments. NVMe is necessary for a low-latency cluster and it is nowhere near sufficient, because the device is one of five things in the path and usually not the largest.

The honest framing: the device latency is the floor. Everything else in the distributed path is added on top, and the total is what the application experiences.

Decomposing a replicated write

flowchart TD
  A[Client issues write] --> B[librbd / librados<br/>encode, choose PG]
  B --> C[Network to primary OSD]
  C --> D[Primary OSD queue and threads]
  D --> E[BlueStore commit on primary]
  D --> F[Network to replica 1]
  D --> G[Network to replica 2]
  F --> H[BlueStore commit on replica 1]
  G --> I[BlueStore commit on replica 2]
  H --> J[Ack to primary]
  I --> J
  E --> J
  J --> K[Ack to client]

An indicative budget on a well-built NVMe cluster with a 25 GbE network:

ComponentTypical contribution
Client library encode and placementtens of microseconds
Network, client to primary0.1-0.3 ms
Primary OSD queue and processing0.2-0.5 ms
Network, primary to replicas (parallel)0.1-0.3 ms
BlueStore commit on the slowest replica0.1-0.5 ms
Acknowledgement path back0.1-0.3 ms
Totalroughly 1-2 ms

The device itself contributes perhaps a quarter of that. A local NVMe write completing in 80 microseconds becomes a 1.5 ms distributed write, and no amount of faster NVMe closes the gap — the network and the software path are the majority of it.

The consequences that surprise people

  • Faster drives have diminishing returns. Moving from SATA SSD to NVMe helps meaningfully. Moving from one NVMe generation to a faster one usually does not, because the device stopped being the bottleneck.
  • The network becomes the thing to buy. Latency at 10 GbE versus 25 GbE is a real difference in the round-trip components, and there are three of them in the diagram above.
  • Replication factor is a latency setting as well as a durability one. Waiting for three commits rather than two costs the difference between the second-slowest and the slowest.
  • One slow device raises everyone’s latency, because the write waits for the slowest replica and any given OSD participates in many PGs.

Designing with the real number

The practical discipline is to establish the budget first and design the application to it, rather than discovering it afterwards:

  • A database whose commit latency budget is 1 ms should be on local NVMe, with Ceph as the backup and archive tier.
  • A database whose budget is 10 ms is comfortable on an NVMe-backed RBD pool.
  • A VM fleet doing routine work is comfortable on SATA SSD or on HDD with NVMe metadata devices.
  • An archive does not have a latency budget worth discussing.

Placing a workload against that list at design time is a five-minute conversation. Discovering it in production is a migration.

Quiz

Knowledge check · 4 questions

  1. Q1. A cluster is upgraded from one generation of NVMe to a faster one. Write latency improves by less than 10%. What is the most likely explanation?

  2. Q2. Because the primary OSD sends to both replicas in parallel, replication adds roughly one extra network round trip to the write path rather than one per replica.

  3. Q3. A team wants to move a latency-critical trading application from local NVMe to Ceph RBD to simplify operations. Current commit latency is 90 microseconds. Advise them.

    Application commits to a local NVMe drive at 90 microseconds p99, roughly 40,000 commits per second at peak. The proposal is an NVMe-backed Ceph pool, 3-way replication, on the existing 25 GbE network shared with client traffic. The stated motivation is to stop managing local disks and to gain snapshots and failover.

  4. Q4. List the components of a replicated write latency budget in order, and say which one an operator has the most control over.

Passing score: 75%. Answers are checked in this browser.

Production discipline

Publish a latency budget derived from the architecture before anyone buys hardware or places a workload, and state it as a range with its components. Once NVMe is in place, spend on the network rather than on faster drives — there are two network traversals on the critical path of every write and only one device commit. And treat any requirement below roughly a millisecond as a signal that the workload belongs on local storage with Ceph in a supporting role, rather than as a tuning target.

Cross-course references

  • Ceph: Part XXVIII (Ceph Networking) and Part XXIX (Network Design) for the links this budget depends on.
  • Ceph: Part XII (BlueStore) for the commit path on the OSD side.
  • Linux: Part XLII (Network Performance) for measuring the round trips directly.