Tại sao lscpu hay hdparm là chưa đủ để đánh giá ổ cứng?
Bạn đã bao giờ thắc mắc tại sao lệnh dd báo tốc độ ghi lên tới 500MB/s mà database vẫn chạy chậm như rùa chưa? Hồi mới vào nghề, mình thường dùng dd hoặc hdparm để test nhanh. Thấy con số vài trăm MB/s là mình tự tin server đã tối ưu. Nhưng thực tế phũ phàng hơn nhiều.
Khi triển khai MySQL hay PostgreSQL, hệ thống bắt đầu giật lag dù băng thông vẫn còn dư dả. Vấn đề nằm ở chỗ: dd chỉ đo tốc độ ghi tuần tự (sequential write). Trong khi đó, các ứng dụng thực tế lại cần IOPS (số lượng thao tác đọc/ghi mỗi giây) và độ trễ (Latency) cực thấp.
Đó là lúc bạn cần đến fio (Flexible I/O Tester). Đây là công cụ tiêu chuẩn để mô phỏng chính xác các kịch bản đọc/ghi phức tạp. Mình từng dùng fio để chứng minh một nhà cung cấp Cloud VPS đang “oversell” tài nguyên. Kết quả cho thấy IOPS thực tế chỉ bằng 1/3 so với cam kết trên trang chủ. Kể từ đó, fio luôn là lệnh đầu tiên mình gõ khi nhận server mới.
Cài đặt fio trên các bản phân phối Linux
Hầu hết các distro phổ biến đều có sẵn fio trong kho ứng dụng. Việc cài đặt chỉ mất vài giây.
Với Ubuntu hoặc Debian:
sudo apt update && sudo apt install fio -y
Với CentOS, RHEL hoặc AlmaLinux:
sudo yum install epel-release -y
sudo yum install fio -y
Gõ fio --version để kiểm tra. Nếu hiện ra phiên bản từ 3.x trở lên là bạn đã sẵn sàng.
Giải mã các tham số cốt lõi khi benchmark
Đừng để những câu lệnh dài dằng dặc làm bạn bối rối. Hãy tập trung vào những tham số “vàng” sau:
- –direct=1: Bắt buộc
fiobỏ qua cache của hệ điều hành. Bạn sẽ đo được hiệu năng thực của phần cứng thay vì đo tốc độ của RAM. - –rw: Chế độ test. Dùng
randread/randwriteđể đo IOPS vàread/writeđể đo băng thông (throughput). - –bs (block size): Kích thước khối dữ liệu. Hãy dùng 4k cho IOPS (chuẩn database) và 1M cho throughput (chuẩn copy file lớn).
- –ioengine=libaio: Cách thức xử lý I/O. Đây là lựa chọn hiệu quả nhất trên Linux.
- –iodepth: Số yêu cầu gửi đi cùng lúc. Với SSD NVMe, mình thường đặt 32 hoặc 64 để ép ổ cứng chạy hết công suất.
3 kịch bản benchmark thực chiến
Dưới đây là 3 lệnh mình thường dùng để “vắt kiệt” sức mạnh của ổ cứng.
1. Đo IOPS Đọc Ngẫu Nhiên (Random Read)
Chỉ số này cực kỳ quan trọng cho Web Server hoặc Database.
fio --name=randread --ioengine=libaio --direct=1 --bs=4k --iodepth=64 --size=1G --runtime=60 --rw=randread --filename=testfile --group_reporting
Sử dụng bs=4k vì đa số database hiện nay lưu trữ dữ liệu dưới dạng các block nhỏ tương đương.
2. Đo Throughput Ghi Tuần Tự (Sequential Write)
Phù hợp nếu bạn làm server lưu trữ video, backup hoặc ghi log file liên tục.
fio --name=seqwrite --ioengine=libaio --direct=1 --bs=1M --iodepth=16 --size=2G --runtime=60 --rw=write --filename=testfile --group_reporting
Ở đây mình nâng bs lên 1M để dữ liệu đi qua “đường ống” lớn, giúp tối ưu băng thông tối đa.
3. Đo Hiệu Năng Hỗn Hợp (Mixed R/W)
Giả lập môi trường thực tế với 70% đọc và 30% ghi.
fio --name=mixed_rw --ioengine=libaio --direct=1 --bs=4k --iodepth=32 --size=1G --runtime=60 --rw=randrw --rwmixread=70 --filename=testfile --group_reporting
Đọc hiểu kết quả: Đừng chỉ nhìn vào con số to nhất
Khi fio kết thúc, đừng vội mừng khi thấy IOPS cao. Hãy nhìn vào 3 chỉ số này:
- IOPS: Số lượng thao tác/giây. Với SSD SATA thường khoảng 80k-100k, NVMe có thể lên tới hàng triệu.
- BW (Bandwidth): Tốc độ truyền tải (ví dụ: 500MiB/s).
- lat (Latency): Đây mới là “kẻ giết chết” hiệu năng. Hãy nhìn vào
clat(completion latency). Một ổ SSD NVMe xịn thường có độ trễ dưới 200us (micro giây). Nếu con số này nhảy lên hàng chục ms, hệ thống sẽ cảm giác rất trì trệ.
Mẹo nhỏ: Hãy chạy test ít nhất 3 lần vào các khung giờ khác nhau. Trên Cloud, hiệu năng thường bị ảnh hưởng bởi “hàng xóm” (noisy neighbors) dùng chung tài nguyên.
Kinh nghiệm để kết quả benchmark không bị “ảo”
Sau nhiều lần benchmark sai, mình rút ra vài quy tắc sống còn:
- Tránh test trên ổ gần đầy: Hiệu năng SSD giảm mạnh khi dung lượng trống dưới 10-20% do cơ chế Garbage Collection.
- File test phải lớn hơn RAM: Nếu server có 16GB RAM mà bạn test file 1GB, kết quả sẽ nhanh một cách vô lý vì dữ liệu nằm gọn trong cache. Hãy chọn
--sizeđủ lớn hoặc luôn dùng--direct=1. - Cẩn thận với đường dẫn: Tuyệt đối không dùng
--filename=/dev/sdanếu bạn không muốn xóa sạch hệ điều hành. Hãy trỏ vào một file cụ thể trong thư mục.
Hy vọng những chia sẻ này giúp bạn đánh giá chính xác sức mạnh server của mình. fio là một chiếc kính hiển vi tuyệt vời để soi rõ mọi vấn đề của hệ thống lưu trữ.

