Phân biệt hai phép đo
Đường đi ĐẦY ĐỦ của 1 I/O request thật khi cluster đang hoạt động — 6 tầng đều tham gia.
ceph tell osd bench — đo IOPS qua tầng OSD (BlueStore + RocksDB). Đây là con số mClock tự dùng khi auto-bench. Vấn đề của nó: chạy lúc OSD init/khi máy đang bận → kết quả dao động, đôi khi sai lệch (chính là dải 46–69k lệch nhau bạn thấy, hoặc ca Proxmox bị kẹt 3.7k).
fio raw trên đĩa — đo IOPS thô của phần cứng, không qua OSD. Ổn định, đáng tin về năng lực đĩa, nhưng cao hơn nhiều so với mức OSD thật sự đạt được.
→ Mâu thuẫn nằm ở đây: fio đáng tin hơn về việc "đĩa khỏe hay yếu", nhưng không phải con số đúng để nhét thẳng vào mClock, vì mClock cần mức qua OSD chứ không phải trần phần cứng. Nhét fio raw vào → capacity bị thổi phồng → over-admit → slow.
Vậy tóm lại bench sao để lấy số gắn cho OSD
Dùng ceph tell osd bench làm nguồn số (vì đúng tầng đo), nhưng chạy nhiều lần lúc cluster rảnh để khắc phục cái nhược điểm "dao động" của nó:
# 1. Cluster phải rảnh (off-peak), OSD đã tồn tại
ceph tell osd.X cache drop
ceph tell osd.X bench 12288000 4096 4194304 100
# -> IOPS = bytes_per_sec / 4096 (hoặc đọc trường "iops")
# 2. Lặp 3-5 lần cho MỖI OSD, ghi lại
# 3. Bỏ outlier, lấy mức ổn định nhất
Vai trò của fio trong quy trình này: chỉ dùng để chẩn đoán đĩa lỗi, không phải để lấy số. Nếu một OSD bench ra thấp bất thường (vd 10k trong khi đồng loại 50k), chạy fio raw trên đĩa đó (sau khi gỡ OSD) để phân biệt: - fio raw cũng thấp → đĩa thật sự yếu/lỗi → thay đĩa. - fio raw bình thường (cao) → đĩa tốt, chỉ là ceph bench đo sai lúc đó → bench lại bằng ceph tell.
Tức fio là công cụ kiểm chứng, ceph bench là công cụ lấy số.
Và đặt số thế nào cho đỡ phụ thuộc phép đo dao động
Best practice (cũng là cách tránh hẳn vấn đề "ceph bench không tin tưởng được"): bench ceph tell nhiều lần cho tất cả đĩa cùng model → bỏ outlier → đặt một giá trị chung, hơi bảo thủ cho cả lớp:
ceph config set osd osd_mclock_max_capacity_iops_ssd 50000
# gỡ entry per-OSD để giá trị chung có hiệu lực (auto-bench ghi per-OSD đè class)
for id in $(ceph osd ls); do
ceph config rm osd.$id osd_mclock_max_capacity_iops_ssd 2>/dev/null
done
Cách này khiến số mClock không còn phụ thuộc vào lần bench dao động nào — bạn chốt một con số đại diện và áp đều, vì đằng nào trong pool replicated OSD chậm nhất cũng gate cả PG, để đều quan trọng hơn để cao.
Tóm lại trả lời thẳng câu bạn: lấy số bằng ceph tell osd bench (đúng tầng mClock cần), chạy nhiều lần lúc rảnh để bù độ dao động; fio chỉ để kiểm tra đĩa có lỗi không, không phải nguồn số. Sau đó chốt một giá trị nhất quán ~50k cho cả lớp ssd thay vì tin vào từng lần bench lẻ. Xin lỗi vì lượt trước diễn đạt khiến bạn hiểu thành "bench lại bằng fio để lấy số" — fio là để verify đĩa, không phải để gắn vào mClock.