Skip to main content
RunBook Academy

CephIII · Storage HardwareStorage Hardware

NVMe — parallelism, not just speed

Intermediate⏱ ~15 minnvmeceph

What you'll learn

  • Describe the NVMe queue model and how it differs from SATA
  • Explain why a single OSD may not saturate an NVMe device
  • Decide when to run multiple OSDs per NVMe device
  • Identify the NVMe roles in a mixed Ceph cluster

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

NVMe is usually described as “faster”, which undersells the change. The important difference is architectural: NVMe replaces a single 32-deep command queue behind a storage controller with many deep queues addressed directly over PCIe, one per CPU core. That changes how a Ceph OSD should be configured, not only how fast it goes.

The queue model

SATA (AHCI)NVMe
Command queues1up to 64k
Depth per queue32up to 64k
Protocol overheadSCSI translationnative, minimal
Interrupt handlingsharedper-queue, per-core
Typical latency100-200 µs20-80 µs

The per-core queue is the part that matters for a storage daemon. Each CPU core submits to its own queue and handles its own completions, so there is no shared lock and no cross-core interrupt handling on the hot path. Concurrency scales with cores rather than contending on one queue.

Why one OSD may not be enough

A ceph-osd process has a bounded amount of internal parallelism — its shards and worker threads — and on a fast NVMe device a single OSD frequently cannot issue enough concurrent work to keep the device busy. The device is idle while the daemon is the bottleneck.

The remedy is more OSDs on the same device:

ceph orch daemon add osd \
  host1:data_devices=/dev/nvme0n1,osds_per_device=2

Two or four OSDs per NVMe device is common for high-end drives. Each gets its own process, its own threads, and its own RocksDB, so the device sees several independent streams of work.

Where NVMe earns its place

In priority order, when budget is limited:

  1. BlueStore WAL and DB for HDD OSDs. The highest return on a small number of devices. Removes all metadata seeks from spindles.
  2. Metadata pools. CephFS metadata and RGW bucket indexes are small, hot, and latency critical. A handful of NVMe devices transforms them.
  3. Latency-sensitive RBD pools. Databases and anything with a tight commit budget.
  4. General OSD data. Excellent, and the most expensive way to spend the budget per terabyte.

That ordering is worth following literally. Ten NVMe devices placed at points one and two often do more for a cluster than sixty placed at point four.

Monitoring NVMe health

nvme smart-log /dev/nvme0n1
nvme error-log /dev/nvme0n1

The fields to watch are percentage_used (the drive’s own estimate of consumed endurance, where 100 does not mean failure but does mean plan replacement), media_errors, critical_warning, and temperature. Thermal throttling is a real effect on dense NVMe deployments and presents as unexplained periodic latency spikes — worth checking before blaming Ceph.

Quiz

Knowledge check · 4 questions

  1. Q1. A cluster with NVMe OSDs shows the devices at low utilisation while client latency is higher than expected and the ceph-osd processes are busy. What is the likely cause?

  2. Q2. Running four OSDs on one NVMe device improves parallelism and means a single device failure now removes four OSDs at once.

  3. Q3. A budget allows ten NVMe devices for a 60-OSD HDD cluster serving RGW and CephFS. The team wants to add them as ten new fast OSDs. Propose a better allocation.

    60 HDD OSDs across 6 hosts, BlueStore WAL and DB colocated on the spindles. Workloads: RGW archive with 300 million objects, and CephFS used by a render farm with heavy metadata activity. Complaints are slow bucket listings and slow directory traversal. Ten enterprise NVMe devices available, roughly two per host if spread.

  4. Q4. Explain why NVMe makes CPU and network more visible as Ceph bottlenecks than they were on HDD.

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

Production discipline

Spend NVMe budget in order: BlueStore WAL and DB for HDD OSDs first, then metadata pools, then latency-sensitive data pools, and only then general capacity. Expect a single OSD process not to saturate a high-end device, and raise osds_per_device deliberately after confirming the cluster can absorb losing all the OSDs on one device at once. And plan CPU and network alongside NVMe, because at microsecond device latency they become the components that decide what the client actually sees.

Cross-course references

  • Ceph: Part XII (BlueStore) for WAL and DB device roles.
  • Ceph: Part XXIX (Network Design) for why NVMe clusters need faster links.
  • Ceph: Part XVI (Device Classes) for separating NVMe from HDD in CRUSH.