GreenNode × Lightbits PoV — BÁO CÁO BENCHMARK TỔNG HỢP
Báo cáo gộp 2 lần đo:
- Run 1 (23–24/06/2026, 1 client, baseline PoV 4.1 + max-bench)
- Run 2 (29/06/2026, 3 client × 6 volume = 18 volume, 300s/test)
Cluster info: - 3× storage node (oss-nvme-01/02/03) - LightOS 3.18.2 - Mỗi node 6 NVMe data EC 4+2 + 2 journal (Samsung PM9A3 15,36TB) - AMD EPYC 9554P 64c/128t - Network bond0 2×100GbE (LACP, layer3+4, MTU 9000, single-NUMA)
Client: - Run 1: oss-nvme-04 - Run2: oss-nvme-04+05+06 - Tất cả client phần cứng, cấu hình giống như server
1. Executive Summary
| Tiêu chí PoV | Mục tiêu | Kết quả tốt nhất | Verdict |
|---|---|---|---|
| 4K Random Read IOPS (aggregate) | > 4,0M | 5,44M (3 client) | ✅ PASS — vượt 36% |
| 4K QD1 Read latency | < 0,2 ms | 0,198 ms (Run 1) / 0,201 ms (Run 2) | ⚠️ Đúng ngưỡng — dao động ±2µs quanh mốc |
| Aggregate Sequential Read | > 60 GB/s | 27,49 GB/s (3 client) | ❌ FAIL — kẹt trần ~66 Gbps/node |
| CPU overhead phía client | < 15% | ~0,4% avg / 6,9% peak (softirq, Run 2) | ✅ PASS |
| No IO disruption khi reboot 1 node | — | chưa chạy | ⬜ Còn lại (mục 4.4) |
| FIO baseline 4.1.1/4.1.2/4.1.3 | đầy đủ | 18/18 bài × 610s | ✅ Hoàn thành |
Ghi nhận 3 vấn đề: 1. IOPS rất tốt — 5,44M IOPS 4K read (vượt target 36%) với latency 0,84ms avg / 2,18ms p99; đây là chỉ số quan trọng nhất cho workload database. 2. Sequential read bị limit chưa giải thích được ở ~66 Gbps/node egress — 1 client kéo 24,69 GB/s (~99% line-rate 200GbE của client), nhưng 3 client chỉ ra 27,49 GB/s (+11%). Mọi nghi phạm client-side/network/config đã loại trừ; khả năng cao limit nằm trong data-path mỗi storage node trong khi node còn ~42% CPU idle và ~65% NIC rảnh. 3. Write ở concurrency cao sụt vì GC trên ổ read-intensive — PM9A3 ~1 DWPD không phải ổ mạnh về write; hiện tượng khớp Grafana (GC BW ≈ Write BW, journal latency 60–90ms). Docs Lightbits khuyến nghị journal dùng ổ write-intensive (DWPD × size × số ổ > 80TB) — cấu hình lab chưa đạt chuẩn này.
2. Môi trường & phương pháp
| Hạng mục | PoV tham chiếu (3.1) | Lab | Ghi chú |
|---|---|---|---|
| Storage node | 3 | 3 | trùng |
| NVMe data/node | 6 | 6 (+2 journal) | trùng |
| CPU/node | AMD 64 core | EPYC 9554P 64c/128t | trùng |
| Network/node | 2×100GbE = 200Gbps | bond0 200Gbps | trùng |
| EC | enabled | 4+2 | trùng |
| LightOS | 3.15.3→3.18.1 | 3.18.2 | tương đương |
| Client tạo tải | nhiều | 1 (Run 1) / 3 (Run 2) | khác biệt chính giữa 2 run |
| SSD | không nêu | PM9A3 read-intensive ~1 DWPD | ảnh hưởng write GC |
Benchmark: fio libaio, direct=1, numjobs=8/job-file, runtime 600s+10s ramp (Run 1 baseline), 300s (Run 2); IOPS/BW cộng từ JSON per-volume; latency = clat.
3. Kết quả Run 1 — 1 client (baseline PoV 4.1)
4KB Random (nj8)
| Test | IOPS | BW MB/s | avg ms | p99 ms | CPU% |
|---|---|---|---|---|---|
| QD1 RandRead | 38,9k | 159 | 0,198 | 0,239 | 4,8 |
| QD4 RandRead | 144,9k | 594 | 0,214 | 0,289 | 16,4 |
| QD1 RandWrite | 43,1k | 177 | 0,177 | 0,247 | 5,7 |
| QD4 RandWrite | 142,1k | 582 | 0,218 | 0,350 | 16,8 |
| QD1 70/30 | 27,7k R + 11,9k W | 162 | R 0,200 / W 0,180 | R 0,251 / W 0,222 | 5,1 |
| QD4 70/30 | 101,4k R + 43,4k W | 593 | R 0,221 / W 0,196 | R 0,322 / W 0,281 | 16,8 |
8KB Random (nj8)
| Test | IOPS | BW MB/s | avg ms | p99 ms | CPU% |
|---|---|---|---|---|---|
| QD1 RandRead | 34,8k | 285 | 0,222 | 0,272 | 4,5 |
| QD4 RandRead | 99,3k | 814 | 0,315 | 0,457 | 11,8 |
| QD1 RandWrite | 31,6k | 259 | 0,245 | 0,313 | 4,0 |
| QD4 RandWrite | 98,3k | 806 | 0,318 | 0,477 | 10,4 |
| QD1 70/30 | 19,2k R + 8,2k W | 225 | R 0,299 / W 0,247 | R 0,391 / W 0,297 | 3,5 |
| QD4 70/30 | 68,8k R + 29,5k W | 805 | R 0,336 / W 0,278 | R 0,514 / W 0,367 | 11,2 |
1MB Sequential (nj8)
| Test | IOPS | BW MB/s | avg ms | p99 ms | CPU% |
|---|---|---|---|---|---|
| QD1 Read | 5,4k | 5.683 | 1,427 | 2,073 | 3,5 |
| QD4 Read | 7,3k | 7.639 | 4,339 | 6,455 | 3,9 |
| QD1 Write | 3,5k | 3.697 | 2,217 | 4,751 | 2,4 |
| QD4 Write | 3,8k | 3.979 | 8,395 | 10,945 | 1,9 |
| QD1 50/50 | 2,1k+2,1k | 4.506 | R 1,836 / W 1,786 | R 2,834 / W 3,064 | 2,8 |
| QD4 50/50 | 3,6k+3,6k | 7.585 | R 3,385 / W 5,379 | R 6,062 / W 16,712 | 3,0 |
Nhận xét: latency 4K/8K ổn định 0,18–0,48ms, p99 <0,5ms; write sạch ở QD thấp (chưa chạm GC); CPU% là tổng tiến trình fio (gồm phần sinh tải) — overhead storage thuần thấp hơn.
Max-bench 1 client (trần một client, ngoài bảng PoV)
| Chỉ số | Kết quả |
|---|---|
| 4K RandRead | 1,64M IOPS |
| 8K RandRead | 1,80M IOPS |
| 1M SeqRead | 24,73 GB/s ≈ 99% line-rate 200GbE |
| 4K RandWrite | 1,36M IOPS (chưa dính GC) |
| 8K RandWrite (conc. cao) | 0,25M IOPS, p99 969ms, swing ×453 — GC |
| 1M SeqWrite (conc. cao) | 6k IOPS, p50 137ms, p99 1.200ms — GC |
Xuất hiện GC trên Grafana:
1. GC BW ≈ Total Write BW — băng thông GC ngang bằng băng thông ghi của client. Nghĩa là cứ mỗi GB client ghi vào, hệ thống phải ghi thêm ~1GB nữa chỉ để dọn nhà (di chuyển dữ liệu còn sống ra khỏi các block sắp xóa). Disk đang làm việc gấp đôi — một nửa cho khách, một nửa cho việc nội bộ.
2. WA ~100% — Write amplification phản ánh lượng ghi thật xuống NAND ≈ gấp đôi lượng client gửi.
3. Journal latency 60–90ms — cho kết quả mỗi op write vào phải xếp hàng sau đám IO GC trên cùng bộ đĩa → latency write của client vọt lên.
4. CPU/mem/read-congestion ~0% — cho biết CPU không nghẽn, RAM không thiếu, đọc không tắc. Tức không còn nghi phạm nào khác — chậm không phải do thiếu tài nguyên, mà do đĩa bận dọn rác.
Ghép lại cho thấy disk đang ghi gấp đôi (1+2), khiến journal nghẽn (3) và không gì khác có lỗi (4) → GC là thủ phạm duy nhất. Có thể PM9A3 là disk read-intensive (~1 DWPD) — over-provisioning thấp, GC yếu bẩm sinh khi bị dội write dồn dập ở concurrency cao.
4. Kết quả Run 2 — 3 client × 18 volume
| Bài test | Cấu hình | Throughput | IOPS | avg | p99 |
|---|---|---|---|---|---|
| SeqRead 1 client | nj8/qd64 | 24,69 GB/s | — | 128,4 ms | 350,2 ms |
| SeqRead 3 client QD thấp | nj2/qd16 | 27,70 GB/s | — | 21,8 ms | 50,1 ms |
| SeqRead 3 client QD cao | nj4/qd32 | 27,49 GB/s | — | 87,8 ms | 329,3 ms |
| 4K RandRead 3 client | nj8/qd32 | 22,26 GB/s | 5,44M | 0,840 ms | 2,179 ms |
| 4K QD1 latency floor | nj1/qd1 | — | — | 0,201 ms | 0,239 ms |
Phát hiện trọng tâm: trần ~66 Gbps/node
Trạng thái storage node lúc full-load sequential:
| Node | Core 100% | Core 70–95% | CPU idle | %soft | TX | %NIC |
|---|---|---|---|---|---|---|
| oss-nvme-01 | 16 | 35 | ~42% | ~6% | 66 Gbps | ~33% |
| oss-nvme-02 | 16 | 35 | ~42% | ~6% | 64 Gbps | ~32% |
| oss-nvme-03 | 16 | 38 | ~42% | ~6% | 68 Gbps | ~34% |
Mỗi node đứng im ở ~66 Gbps egress dù còn ~42% CPU idle, ~65% NIC rảnh, disk dư. Tăng QD ×4 (192→768 IO/client): throughput bất động (27,70→27,49), latency tăng tuyến tính (21,8→87,8ms) — loại giả thuyết thiếu QD.
Nghi phạm đã loại trừ
- NUMA (single node0, NIC cùng node)
- Version (3.18.2)
- Bond/LACP (802.3ad cả 2 link), hash layer3+4 (TX trải đều), MTU 9000 hai đầu
- Queue depth (×4 không đổi)
- Client/NIC (1 client kéo ~198Gbps)
- CPU storage (idle 42%, %soft ~1,5%)
Nghi phạm còn lại:
Giới hạn nội tại data-path duroslight per-node ở pattern sequential read — phân bổ core theo module (reader cores cố định trong system profile), pinning/shard-to-connection mapping hoặc tuning NVMe/TCP target. 16 core chạy 100% trong khi tổng CPU idle 42% gợi ý một nhóm shard cố định bão hòa chứ không phải thiếu CPU tổng.
5. So sánh chéo hai run & tính nhất quán
| Chỉ số | Run 1 (1 client) | Run 2 (3 client) | |
|---|---|---|---|
| SeqRead tổng | 24,73 GB/s | 27,49 GB/s | +11% dù ×3 client → trần server-side |
| 4K RandRead | 1,64M | 5,44M | scale ~3,3× — random scale đẹp, sequential không |
| QD1 latency | 0,198 ms | 0,201 ms | ngưỡng ổn ở 0,2ms |
| Kỳ vọng 3 client sẽ đạt 60 GB/s | dự đoán ✅ | thực tế ❌ | Nghi vấn giới hạn nội tại data-path per-node |
Điểm nhất quán đáng tin: hai bài test độc lập, cách nhau 5 ngày, cho cùng floor latency và cùng trần sequential (~24,7 vs ~27,5) → số liệu ổn định.