Ceph 儲存空間使用率統計資料解讀
Luminous Ceph 的儲存空間使用統計
Luminous 時每個pool 的USED 是使用者資料大小(未經過壓縮前的,per-pool 的RAW USED也是未經壓縮的考慮了副本數的資料大小),而GLOBAL 的RAW USED 是實際分配的硬碟空間大小(壓縮後的)。
Sage: "The per-pool USED is the logical user data written (before compression). The RAW USED space is the actual on-disk space consumed (after compression). That's why they vary."
- Luminous Ceph:
(3206+311)3=10551M < 22032M (GLOBAL RAW USED)
一般的,每個三副本pool USED3 = RAW USED
USED = sum.num_bytes
RGW USED = sum.num_bytes * raw_used_rate * curr_object_copies_rate,curr_object_copies_rate 是未降級副本率(<=1),raw_used_rate 相當於副本數。
一句話,luminous 的pool USED 結果是不合適的,USED 不應當作為使用者物件資料的邏輯大小總和。USED 應當是從硬碟實際佔有考慮,N 版後per-pool 使用者資料大小使用STORED 表示,USED 是實際空間分配的大小。
N版之後是通過store_stats 計算的,N版之前的pool USED 都是通過stats 計算的,
store_stats 的統計是BlueStore 做的,和OSD 的USED 統計是一致的。一致以來GLOBAL USED 的計算是跟OSD 一致的,都是通過ObjectStore 層獲取的。因此GLOBAL USED 和OSDs USED 是可以對上的,但是和L 版的pool USED 是對不上的(通過stats 計算獲取)。
object_stat_sum_t 是物件統計的彙總。
N 版後的改進
pr https://github.com/ceph/ceph/pull/19454 後,ceph df 給出的叢集和儲存池空間統計出現重大變化,但是未backport 至L 版和M 版:
- 【GLOBAL section】: USED 是所有block 裝置上儲存的物件資料之和(所有OSDs 之和),RAW USED 是包含USED 和在block 上的Ceph 軟體系統自身的資料佔用(如BlueFS )。
- 【POOLS section】:RAW USED 被刪除了;USED 包含當前pool 在所有OSDs上空間分配使用大小,包含了副本、分配粒度、糾刪碼擦除、資料壓縮和小物件資料空洞,但不包含在block 上的Ceph 軟體系統自身的資料佔用(如BlueFS )。STORED 是Ceph使用者視角在pool 上存的資料大小,類似之前的USED,但是計算更精確了(包含了檔案空洞,OMAP 佔用 )。
uint64_t get_used() const
{ return total - available - internally_reserved; }
// this accumulates both actually used and statfs's internally_reserved
uint64_t get_used_raw() const
{ return total - available; }
由上面的計算公式可知:used 肯定是不大於raw 的
BlueStore 的壓縮:https://docs.ceph.com/en/latest/rados/configuration/bluestore-config-ref/#inline-compression