CephXCVI · Node MaintenanceNode Maintenance
What clients experience during node maintenance
What you'll learn
- Predict the client impact of node maintenance
- Measure it during the window
- Bound it with configuration
- Communicate it accurately
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
Node maintenance produces a specific, predictable sequence of client effects, and stating them beforehand is what makes the window acceptable.
The sequence
t+0 the host's OSDs stop
t+0 in-flight operations to them stall
t+20s peers report them down; the monitors mark them down
t+20s affected PGs re-peer briefly
t+21s I/O resumes from the surviving replicas
the PGs are degraded for the duration
t+Nmin the host returns; OSDs rejoin and catch up
brief additional load while they do
t+Nmin the cluster returns to active+clean
| Phase | Client experience |
|---|---|
| Stop to down-marking | stalled I/O to affected PGs, up to osd_heartbeat_grace |
| Re-peering | a brief additional pause |
| Degraded operation | normal latency, one fewer copy |
| OSDs rejoining | brief elevated latency as they catch up |
ceph config get osd osd_heartbeat_grace
The first phase is the visible one and its duration is the heartbeat grace period.
Measuring during the window
# the RBD pool holding the probe image:
POOL=rbd-vms
# from a client, throughout
fio --name=probe --ioengine=rbd --pool="$POOL" --rbdname=probe \
--rw=randwrite --bs=4k --iodepth=16 --runtime=1800 --time_based \
--log_avg_msec=1000 --write_lat_log=maint
# and cluster-side
watch -n 10 'ceph -s | grep -E "degraded|osds"'
The latency log shows the stall and its duration precisely, which is what turns “there was a brief pause” into a measured figure.
Bounding it
# shorten the detection window
ceph config get osd osd_heartbeat_grace
# ensure guests tolerate the stall
# in a Linux guest:
cat /sys/block/sda/device/timeout
| Measure | Effect |
|---|---|
| Guest timeouts above the grace period | the stall is a pause, not an error |
noout set | no recovery during the window |
| One host at a time | one host’s worth of degradation |
| Maintenance during low load | fewer affected operations |
size=3 rather than size=2 | I/O continues throughout |
With size=2 and min_size=2, a host going down takes PGs below min_size
and blocks I/O to them entirely.
Communicating it
Maintenance: ceph-03 kernel upgrade, 22:00–22:30
Expected client impact:
a stall of up to 20 seconds at the start, affecting operations to
roughly 1/8 of PGs
normal latency thereafter with one fewer copy
a brief latency increase when the host returns
no I/O blocked at any point
Not expected:
data loss
I/O errors, provided guest timeouts exceed 30 seconds
extended degradation
Stating what is not expected is what makes the statement useful — it tells the reader what to report if it happens.
Quiz
Knowledge check · 4 questions
Q1. What happens to a size=2, min_size=2 pool when a host goes down for maintenance?
Q2. Stating what is not expected during a maintenance window is what gives readers a criterion for escalating.
Q3. Communicate a maintenance window.
A kernel upgrade on one OSD host is planned. The affected pools are size=3, min_size=2. Guest disk timeouts are 180 seconds.
Q4. What determines the duration of the initial stall during node maintenance?
Passing score: 75%. Answers are checked in this browser.
Production discipline
State what is not expected alongside what is when communicating a
maintenance window — it gives affected teams a criterion for escalating.
Verify guest timeouts exceed osd_heartbeat_grace, which is what turns
the initial stall into a pause rather than an error.
Cross-course references
- Kubernetes: stating expected and unexpected behaviour during a rollout serves the same purpose
- Linux: client timeouts relative to failover windows determine whether a failover is visible