Optimization

Cách kiểm tra tốc độ đọc ghi ổ NVMe trên VPS

VPS mới thuê về, bạn cài xong Ubuntu 24.04, ssh vào và muốn biết con NVMe mà nhà cung cấp gắn cho mình "khỏe" tới đâu. Đừng đoán mò. Bài này sẽ chỉ bạn cách kiểm tra tốc độ đọc ghi ổ NVMe trên VPS bằng các công cụ phổ biến nhất: fio cho kết quả chính xác nhất, dd cho kiểm tra nhanh, và hdparm để xem thông số cơ bản. Bạn sẽ biết cách đo, cách đọc kết quả, và quan trọng là biết con số nào đáng tin, con số nào chỉ để tham khảo.

Vì sao phải kiểm tra tốc độ NVMe trên VPS

Ổ cứng là thành phần ảnh hưởng trực tiếp đến tốc độ truy xuất dữ liệu của mọi ứng dụng. Website tải chậm, database query lâu, hay thao tác copy file nặng nề, rất có thể nguyên nhân nằm ở tốc độ đọc ghi của ổ đĩa chứ không phải CPU hay RAM. Trên thực tế, khi benchmark một VPS, nhiều người chỉ chú ý đến sysbench CPU rồi bỏ qua khâu kiểm tra ổ đĩa. Điều này dễ dẫn đến hiểu lầm: cấu hình mạnh nhưng I/O yếu thì mọi thứ vẫn chậm.

Với VPS dùng ổ NVMe, con số bạn nhận được từ lệnh benchmark sẽ khác biệt rõ rệt so với VPS dùng SSD SATA thế hệ cũ. Việc kiểm tra giúp bạn xác nhận nhà cung cấp có đúng như cam kết (NVMe thật hay chỉ là SSD thường), đồng thời nắm được "sức khỏe" của ổ để tính toán khả năng chịu tải. Khi thuê VPS Linux chạy các ứng dụng nặng về database hoặc file I/O, kiểm tra NVMe trước khi đưa vào production là việc nên làm.

Yêu cầu trước khi bắt đầu

  • VPS chạy Linux (bài này dùng Ubuntu 24.04 LTS, các bản Debian 12, AlmaLinux 9 tương tự).
  • Quyền root hoặc user sudo để cài công cụ.
  • Không chạy benchmark khi server đang xử lý workload nặng, kết quả sẽ bị nhiễu.

Bước 1 - Cài đặt công cụ benchmark

Trên Ubuntu/Debian, cài fiohdparm bằng lệnh sau. dd có sẵn trong coreutils nên không cần cài.

sudo apt update
sudo apt install -y fio hdparm

Trên AlmaLinux/Rocky Linux 9, dùng dnf:

sudo dnf install -y fio hdparm

Giải thích ngắn: fio là công cụ benchmark I/O mạnh mẽ, tạo ra các luồng đọc ghi theo kịch bản bạn định nghĩa, cho kết quả chính xác về throughput, IOPS và latency. hdparm đọc thông số cơ bản và đo tốc độ đọc tuần tự nhanh, không ghi dữ liệu lên ổ. Sau khi cài, kiểm tra xem ổ đĩa của bạn tên gì:

lsblk

Kết quả mong đợi: bạn sẽ thấy danh sách ổ đĩa, thường là vda (KVM virtio) hoặc nvme0n1 (nếu là NVMe thật). Ghi lại tên này, các lệnh sau sẽ dùng đến.

Bước 2 - Kiểm tra nhanh bằng dd

dd là cách nhanh nhất để ước lượng tốc độ, phù hợp khi bạn chỉ cần con số tham khảo trong vài giây. Lệnh ghi 1GB dữ liệu:

dd if=/dev/zero of=/tmp/testfile bs=1M count=1024 oflag=direct conv=fdatasync

Lệnh này tạo file 1GB trong /tmp, dùng cờ oflag=direct để bỏ qua RAM cache, đo tốc độ ghi thực tế xuống ổ. Kết quả sẽ hiện dòng như: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.23456 s, 870 MB/s. Đọc tốc độ đọc lại bằng lệnh:

dd if=/tmp/testfile of=/dev/null bs=1M count=1024 iflag=direct

Lưu ý: kết quả dd chỉ phản ánh throughput tuần tự một luồng, không phản ánh hiệu năng I/O ngẫu nhiên hay khả năng xử lý nhiều luồng cùng lúc. Một ổ NVMe tốt trên VPS thường cho tốc độ ghi tuần tự vài trăm MB/s đến hơn 1GB/s, tùy vào dung lượng gói và mức độ chia sẻ tài nguyên vật lý giữa các VPS khác nhau. Đây chỉ là bước kiểm tra nhanh; kết quả chi tiết nên dựa vào fio ở bước sau.

Bước 3 - Benchmark chi tiết bằng fio

fio là công cụ chuyên nghiệp mà dân sysadmin dùng để đo hiệu năng ổ đĩa. Nó tạo ra các job đọc ghi với kích thước khối, độ sâu hàng đợi, tỉ lệ đọc/ghi khác nhau, từ đó tính ra IOPS và throughput. Chạy lệnh sau để đo hiệu năng ghi ngẫu nhiên (random write) - kịch bản phổ biến nhất cho database:

fio --name=random_write --ioengine=libaio --direct=1 --rw=randwrite --bs=4k --size=1G --numjobs=1 --iodepth=32 --runtime=30 --time_based --group_reporting

Giải thích từng tham số trước khi chạy:
- --rw=randwrite: kịch bản ghi ngẫu nhiên (random write).
- --bs=4k: kích thước khối 4KB, giống như database query nhỏ.
- --iodepth=32: độ sâu hàng đợi (queue depth) 32, mô phỏng nhiều request cùng lúc.
- --size=1G: tổng dung lượng ghi là 1GB.
- --runtime=30: chạy trong 30 giây.
- --time_based: chạy đủ thời gian quy định, không dừng sớm.

Sau khi chạy, chú ý các dòng output quan trọng:

write: IOPS=..., BW=...MiB/s (MB/s), lat=...usec

Tiếp theo, đo hiệu năng đọc ngẫu nhiên (random read), quan trọng cho các ứng dụng đọc dữ liệu thường xuyên:

fio --name=random_read --ioengine=libaio --direct=1 --rw=randread --bs=4k --size=1G --numjobs=1 --iodepth=32 --runtime=30 --time_based --group_reporting

Để đo throughput tuần tự (sequential), đổi --rw=randwrite thành --rw=write (hoặc read) và tăng --bs=128k hoặc 1M. Kịch bản này phù hợp cho việc copy file lớn, backup, xử lý video. Một mẹo nhỏ: nếu ổ đĩa của bạn có dung lượng lớn, tăng --size lên 4G hoặc 8G để có kết quả ổn định hơn, tránh ảnh hưởng của cache. Với thuê VPS NVMe, con số IOPS ngẫu nhiên 4K thường ở mức hàng chục nghìn, latency dưới 1ms là bình thường.

Bước 4 - Đo tốc độ đọc bằng hdparm

Nếu chỉ cần kiểm tra nhanh tốc độ đọc tuần tự mà không muốn tạo file, dùng hdparm. Lưu ý công cụ này chỉ đọc, không ghi, nên an toàn rất cao với dữ liệu. Chạy với /dev/vda (thay bằng tên ổ của bạn):

sudo hdparm -t /dev/vda

Kết quả hiển thị tốc độ đọc bộ nhớ đệm và tốc độ đọc trực tiếp từ ổ đĩa. hdparm -t cho tốc độ đọc ổ đĩa thô, không qua cache. Với VPS NVMe, con số này thường cao hơn hẳn VPS SSD thường, đôi khi đạt 1GB/s trở lên nếu không bị giới hạn bởi CPU hay ảo hóa.

Điểm yếu của hdparm: nó không đo được tốc độ ghi, không đo được I/O ngẫu nhiên. Vì vậy, dùng nó như bước kiểm tra sơ bộ, còn quyết định cuối cùng nên dựa vào fio.

Cách đọc kết quả và so sánh với thông số nhà cung cấp

Kết quả benchmark không có nghĩa lý rất cao nếu bạn không biết cách đặt trong bối cảnh. Một VPS NVMe chạy trên host ảo hóa KVM, kết quả đo được phụ thuộc vào mức độ chia sẻ tài nguyên với các VPS khác cùng vật lý. Nếu nhà cung cấp bán gói VPS NVMe cam kết tốc độ đọc ghi tuần tự 800MB/s-1.2GB/s, trong khi bạn đo được 500MB/s, có thể do đang giờ cao điểm, hoặc bạn dùng phương pháp đo khác (dd một luồng so với fio đa luồng), hoặc ổ đang bị chiếm dụng bởi VPS hàng xóm. Trước khi kết luận nhà cung cấp "cùi", hãy chạy nhiều lần vào các thời điểm khác nhau.

Chỉ sốGiá trị tham khảo (VPS NVMe phổ biến)Ý nghĩa
Sequential Read (fio, bs=1M)800 MB/s - 1.5 GB/sCopy file lớn, backup
Sequential Write (fio, bs=1M)500 MB/s - 1.2 GB/sGhi log, tạo file lớn
Random Read 4K (fio, iodepth=32)30,000 - 80,000 IOPSDatabase query, website
Random Write 4K (fio, iodepth=32)15,000 - 50,000 IOPSGhi log, cập nhật database
Latency 4K (fio)< 1 msĐộ trễ mỗi request

Lưu ý bảng trên chỉ là khoảng tham khảo phổ biến, không phải chuẩn rất cao. Nếu bạn thuê gói VPS nhỏ, 1 vCPU, kết quả có thể thấp hơn vì CPU làm điểm nghẽn khi xử lý I/O. Với VPS n8n chạy automation, hoặc VPS WordPress tải cao, ưu tiên chỉ số random read 4K hơn là throughput tuần tự.

Xử lý lỗi và hiểu đúng các cạm bẫy khi benchmark

Lỗi 1: fio: io_u error on file /tmp/testfile: No space left on device
Lỗi này xảy ra khi ổ đĩa hết dung lượng do file test quá lớn so với dung lượng trống. Kiểm tra bằng df -h, giảm --size xuống còn 512M hoặc 256M. Nếu /tmp không đủ chỗ, dùng thư mục khác có dung lượng lớn hơn.

Lỗi 2: Kết quả dd cao bất thường, hơn 3GB/s
Bạn quên cờ oflag=direct trong lệnh ghi, nên dữ liệu được ghi vào RAM cache chứ chưa xuống ổ. Lệnh sai cho kết quả ảo. Thêm oflag=direct và chạy lại. Tương tự, lệnh đọc phải có iflag=direct để bỏ qua cache đọc.

Lỗi 3: Test bị treo hoặc quá chậm
Kiểm tra xem ổ có bị chiếm dụng bởi tiến trình khác không với iostat -x 1. Nếu %util gần rất cao là ổ đang bận. Chờ hoặc chạy benchmark vào giờ thấp điểm. Ngoài ra, với VPS dùng chung host, có thể các VPS khác đang gây áp lực lên ổ vật lý, làm kết quả chậm hơn bình thường.

Một cạm bẫy nữa: đừng chạy benchmark ngay sau khi thuê VPS và cài hệ điều hành xong. Lúc này hệ thống còn đang cài đặt gói, index file, kết quả sẽ không chính xác. Hãy đợi 30 phút đến 1 giờ cho hệ thống ổn định, rồi mới đo.

Câu hỏi thường gặp

Kiểm tra tốc độ NVMe trên VPS bằng lệnh nào nhanh nhất?

Lệnh dd ghi và đọc 1GB file là nhanh nhất, mất khoảng 2-5 giây. Tuy nhiên kết quả chỉ phản ánh throughput tuần tự một luồng, không chính xác bằng fio. Dùng dd khi cần kiểm tra sơ bộ, dùng fio khi cần đánh giá chi tiết.

Chỉ số nào quan trọng nhất khi benchmark NVMe cho VPS chạy database?

Với database, ưu tiên hàng đầu là Random Read 4K (IOPS) và latency. Cụ thể, fio --rw=randread --bs=4k --iodepth=32 cho bạn biết khả năng xử lý nhiều truy vấn nhỏ cùng lúc, đây là kịch bản điển hình của MySQL, PostgreSQL, MariaDB.

Kết quả benchmark NVMe trên VPS có giống với máy chủ vật lý không?

Không. VPS chia sẻ tài nguyên ổ đĩa vật lý với nhiều VPS khác trên cùng host. Kết quả đo được có thể thấp hơn máy chủ vật lý chạy cùng loại NVMe. Con số cũng biến động theo thời điểm. Vì vậy, hãy benchmark nhiều lần và dùng giá trị trung bình.

hdparm có đo được tốc độ ghi không?

Không. hdparm chỉ đo tốc độ đọc. Để đo tốc độ ghi, dùng dd hoặc fio. Nếu muốn an toàn cho dữ liệu hiện có, chỉ nên đo ở những thư mục tạm như /tmp hoặc tạo file test riêng.

Benchmark xong có cần xóa file test không?

Có. File test (/tmp/testfile) có thể chiếm vài GB. Xóa bằng rm -f /tmp/testfile. Nếu dùng fio với --size=1G, fio tự động dọn file sau khi chạy xong, nhưng dd thì không.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.