PoV Benchmark Runbook — GreenNode/Lightbits
Mục tiêu: chạy đúng bộ test trong tài liệu PoV để ghi nhận report.
Client: oss-nvme-06 (1 client).
Cluster: oss-nvme-01/02/03, EC4+2, replica 2.
⚠️ LƯU Ý QUAN TRỌNG
- Tài liệu PoV mục 4.1: Each client is connected to a separate volume + target cluster-wide (60 GB/s đọc, 4 triệu IOPS) được tính cho NHIỀU client + dual 100GbE/node.
- LAB này chỉ 1 client nên các số đo trần khả năng cao là giới hạn ở client chứ phải trần cluster.
- Report phải nêu rõ: single-client baseline chứ không so trực tiếp với target cluster-wide.
- Để đo trần cluster thật cần ≥3-4 client chạy song song.
Cài đặt nload để xem workload
dnf install -y epel-release
dnf install -y nload
Map test PoV → device
- Mỗi test PoV: 1 client ↔ 1 volume.
- Dùng /dev/nvme8n1 cho mọi bài baseline (1 volume), để khớp 1 client 1 volume của PoV.
- Các disk nvme8nX chính là volume Lightbits, không đụng tới nvme0..7 vì là disk local client.
PHẦN 1 — CHUẨN BỊ
Trên client oss-nvme-06, xác nhận volume
[root@oss-nvme-06 ~]# nvme list | grep -i lightbits
/dev/nvme8n1 /dev/ng8n1 f973dc215df7aebb Lightbits LightOS 0x2 214.75 GB / 214.75 GB 4 KiB + 0 B 3.18
/dev/nvme8n2 /dev/ng8n2 f973dc215df7aebb Lightbits LightOS 0x3 214.75 GB / 214.75 GB 4 KiB + 0 B 3.18
/dev/nvme8n3 /dev/ng8n3 f973dc215df7aebb Lightbits LightOS 0x5 214.75 GB / 214.75 GB 4 KiB + 0 B 3.18
/dev/nvme8n4 /dev/ng8n4 f973dc215df7aebb Lightbits LightOS 0x6 214.75 GB / 214.75 GB 4 KiB + 0 B 3.18
/dev/nvme8n5 /dev/ng8n5 f973dc215df7aebb Lightbits LightOS 0x1 214.75 GB / 214.75 GB 4 KiB + 0 B 3.18
/dev/nvme8n6 /dev/ng8n6 f973dc215df7aebb Lightbits LightOS 0x4 214.75 GB / 214.75 GB 4 KiB + 0 B 3.18
PoV mục 4.1: "All runs executed after volumes and nodes have been pre-conditioned".
Phải fill đầy 6 volume trước = pre-conditioned.
Device bench thực tế
6 volume Lightbits = /dev/nvme8n1 .. /dev/nvme8n6 (cùng controller nvme8, subsystem Lightbits).
Xác nhận:
nvme list | grep -i lightbits # phải thấy nvme8n1..n6, model "Lightbits LightOS", 214.75 GB
⚠️⚠️ Cảnh báo: nvme0n1..nvme7n1 là 8 Ổ NVMe vật lý local của oss-nvme-06 (Samsung PM9A3).
Tuyệt đối không để filename trỏ nvme0..7.
Đổi iopolicy = round-robin (trải IO đều 3 path/3 node)
Mặc định iopolicy=numa → chỉ ưu tiên 1 path. round-robin trải đều cả 3 node → ép cluster tốt hơn.
[root@oss-nvme-06 ~]# echo round-robin > /sys/class/nvme-subsystem/nvme-subsys8/iopolicy
[root@oss-nvme-06 ~]# cat /sys/class/nvme-subsystem/nvme-subsys8/iopolicy
round-robin
(subsys8 là subsystem Lightbits trong output nvme list-subsys.)
Fill data — bơm đầy + đo bandwidth ghi tuần tự
Để bench giống prod nhất cần fill data.
Fill cũng là phép đo write bandwidth thô. 6×200GB=1.2TB → khá mất thời gian.
PHẦN 2 — BENCHMARK
Bước 1 — Setup
Quy trình dưới đây có thể áp dụng được cho 1 hoặc nhiều client, hãy chạy trên tất cả các client đoạn shell dưới đây.
cd ~
VOLS="/dev/nvme8n1 /dev/nvme8n2 /dev/nvme8n3 /dev/nvme8n4 /dev/nvme8n5 /dev/nvme8n6"
RT=120; RAMP=10; QDS="1 2 4 8 16 32"
runwl() { # $1=outdir $2=name $3=rw $4=bs $5=mix $6=numjobs $7=iswrite
local dir="$1" name="$2" rw="$3" bs="$4" mix="$5" nj="$6" wr="$7"
mkdir -p "$dir"; cd "$dir"
for QD in $QDS; do
local f="${name}-qd${QD}.fio"
{
echo "[global]"; echo "ioengine=libaio"; echo "direct=1"; echo "time_based"
echo "runtime=$RT"; echo "ramp_time=$RAMP"; echo "rw=$rw"
[ -n "$mix" ] && echo "rwmixread=$mix"
echo "bs=$bs"; echo "numjobs=$nj"; echo "iodepth=$QD"
echo "randrepeat=0"; echo "norandommap=1"; echo "group_reporting=1"
echo "cpus_allowed_policy=split"; echo "cpus_allowed=0-127"; echo "log_avg_msec=1000"
if [ "$wr" -eq 1 ]; then
echo "refill_buffers"; echo "buffer_compress_percentage=50"; echo "buffer_compress_chunk=4096"
fi
local i=1; for d in $VOLS; do echo "[vol$i]"; echo "filename=$d"; i=$((i+1)); done
} > "$f"
echo "=== $(hostname -s) | $name qd$QD ==="
fio "$f" --output-format=json --output="${name}-qd${QD}.json"
done
cd ~
echo ">>> XONG: $name ($(hostname -s))"
}
echo "runwl ready."
Bước 2 — Trường hợp 1 client (reference)
Chỉ chạy trên 1 client, ví dụ oss-nvme-06.
# latency floor (1 job, 1 vol)
mkdir -p ~/lbfio-1client && cd ~/lbfio-1client
cat > lat-floor-4k-qd1.fio <<EOF
[global]
ioengine=libaio
direct=1
time_based
runtime=$RT
ramp_time=$RAMP
rw=randread
bs=4k
numjobs=1
iodepth=1
randrepeat=0
norandommap=1
group_reporting=1
cpus_allowed_policy=split
cpus_allowed=0-127
[vol1]
filename=/dev/nvme8n1
EOF
echo "=== A0 latency floor ==="
fio lat-floor-4k-qd1.fio --output-format=json --output=lat-floor-4k-qd1.json
cd ~
# read sweeps
runwl ~/lbfio-1client read-rand-4k randread 4k "" 21 0
runwl ~/lbfio-1client read-rand-8k randread 8k "" 21 0
runwl ~/lbfio-1client read-seq-1m read 1m "" 4 0
Bước 2 — Trường hợp nhiều client (aggregate)
Có bao nhiêu client thì chạy hết. Mỗi workload dưới đây paste vào 3 terminal cùng lúc, chờ cả 3 thông báo >>> XONG, rồi mới sang workload kế.
Các bài write/mix sẽ ghi đè dữ liệu.
B1 — 4K random read (tiêu chí IOPS)
runwl ~/lbfio-3client read-rand-4k randread 4k "" 21 0
B2 — 1M seq read (tiêu chí bandwidth)
runwl ~/lbfio-3client read-seq-1m read 1m "" 4 0
B3 — 8K random read
runwl ~/lbfio-3client read-rand-8k randread 8k "" 21 0
B4 — 4K random write ⚠️
runwl ~/lbfio-3client write-rand-4k randwrite 4k "" 10 1
B5 — 4K 70/30 mix ⚠️
runwl ~/lbfio-3client mix70-rand-4k randrw 4k 70 10 1
B6 — 4K 50/50 mix ⚠️
runwl ~/lbfio-3client mix50-rand-4k randrw 4k 50 10 1
B7 — 8K random write ⚠️
runwl ~/lbfio-3client write-rand-8k randwrite 8k "" 10 1
B8 — 8K 70/30 mix ⚠️
runwl ~/lbfio-3client mix70-rand-8k randrw 8k 70 10 1
B9 — 1M seq write ⚠️
runwl ~/lbfio-3client write-seq-1m write 1m "" 4 1
B10 — 1M 50/50 mix ⚠️
runwl ~/lbfio-3client mix50-seq-1m rw 1m 50 4 1
Nén lưu kết quả nếu cần
cd ~ && tar -czf fio-results-$(hostname -s).tar.gz lbfio-1client lbfio-3client 2>/dev/null
ls -lh ~/fio-results-$(hostname -s).tar.gz
Lưu ý
- Mỗi workload B chỉ ~13 phút (6 QD × 130s). Xong workload nào là 3 máy tái đồng bộ ở workload kế → không còn lệch tích lũy.
- Nếu muốn nhanh hơn nữa, sửa QDS="1 4 16 32" ở Bước 0 (đủ thấy đường cong + bão hòa).
- Mẹo đồng bộ khi paste 3 terminal: có thể dùng terminal có chế độ broadcast/send to all panes, ví dụ Tmux :setw synchronize-panes on để gõ 1 lần chạy cả 3.
- Thứ tự ưu tiên nếu không chạy hết: B1, B2, B3 (read — tiêu chí chính) trước và write/mix sau.