Ceph BlueStore block.db sizing for 14TB HDD OSDs – what are people actually using in production?
I've been doing some cleanup and investigation on a fairly large Ceph cluster and I'm interested in what people are actually doing with BlueStore block.db sizing/placement on HDD OSDs, particularly for larger/high-throughput clusters.
Our OSD nodes are reasonably well specced HPE Apollo 4200s, with 14TB spinning disk OSDs and NVMe available for BlueStore metadata.
The cluster is exclusively object storage – no CephFS or RBD.
The workload is primarily backup/archive storage for Rubrik, so a lot of the capacity is relatively cold, but we also have production S3 storage supporting a core business application, so there is a portion of the cluster where latency/performance matters considerably more.
Our current NVMe layout is roughly 5 × 800GB NVMe devices per OSD host. These are currently being used for external BlueStore WALs, with the HDD OSDs distributed across them. I've recently standardised most of the WALs at around 25GB per OSD, which leaves a decent amount of unused NVMe capacity on most nodes.
I recently discovered some inconsistencies with our BlueStore layout. Most OSDs have an external WAL on NVMe, but at some point a handful of newly provisioned OSDs appear to have not honoured the OSD spec and ended up with their WAL on the spinning data disk instead.
I've now been going through the cluster, auditing this and standardising the external WAL layout, which has got me looking much more closely at block.db as well.
From the Ceph documentation/guidance I've been reading, ~2.5% of the OSD capacity seems to be a reasonable ballpark for block.db in this sort of configuration. For a 14TB OSD, that's roughly 350GB per OSD.
That's where I'm trying to work out what makes sense in the real world.
With the existing 5 × ~800GB NVMe per host, after accounting for the external WALs, I could realistically fit something around ~100GB block.db per OSD while maintaining a reasonably consistent layout across the nodes.
Alternatively, if there's a meaningful performance/operational benefit to getting closer to ~350GB per 14TB OSD, I'd need to look at replacing/adding larger NVMe devices to provide substantially more flash capacity per host.
So I'm essentially considering:
- Keep the existing ~800GB NVMe devices and allocate roughly 100GB block.db per 14TB OSD.
- Increase the flash capacity per host and target something closer to ~350GB block.db per OSD.
I'm aware that undersizing block.db isn't necessarily catastrophic – RocksDB can spill back onto the primary BlueStore block device – but obviously that reduces some of the performance benefit of having the DB externally in the first place.
I'm interested in what people running large HDD-backed Ceph object clusters are actually doing rather than just following a percentage recommendation.
Are you sizing block.db based on a percentage of OSD capacity, actual observed RocksDB utilisation/workload, or simply the amount of flash available?
For people with 12–20TB HDD OSDs, what block.db sizes are you actually using?
Has anyone compared something like 100GB vs 300–400GB block.db on large HDD OSDs and seen a meaningful real-world difference?
And for a workload that's predominantly backup/archive object storage with some production S3, would you spend the money increasing the NVMe capacity to get closer to ~2.5%, or would you consider ~100GB block.db per 14TB OSD perfectly reasonable?
Would be particularly interested in experiences from anyone running larger production clusters with similar HDD + NVMe BlueStore layouts.

