Trong bài viết này, chúng ta sẽ thảo luận về cách kiểm tra hiệu suất của ổ cứng hoặc mảng lưu trữ trên Linux. IOPS (input/output operations per second) là số lượng hoạt động đầu vào/đầu ra mà một hệ thống lưu trữ dữ liệu thực hiện mỗi giây (có thể là một ổ đĩa đơn lẻ, mảng RAID hoặc LUN trong thiết bị lưu trữ ngoài). Nói chung, IOPS đề cập đến số lượng block có thể đọc hoặc ghi lên phương tiện lưu trữ.
Hầu hết các nhà sản xuất ổ cứng chỉ định giá trị IOPS danh nghĩa, nhưng thực tế đây không phải là giá trị được đảm bảo. Để hiểu hiệu suất của hệ thống lưu trữ trước khi bắt đầu dự án, bạn nên lấy được giá trị IOPS tối đa mà hệ thống lưu trữ có thể xử lý.
Sử dụng công cụ FIO (Flexible I/O) để benchmark lưu trữ
Để đo hiệu suất IOPS ổ cứng trên Linux, bạn có thể dùng công cụ fio (có sẵn cho CentOS/RHEL trong kho EPEL). Vì vậy, để cài đặt fio trên RHEL hoặc CentOS, dùng trình quản lý gói yum (dnf):
# yum install epel-release -y
# yum install fio -y
Hoặc apt-get trên Debian hoặc Ubuntu:
# apt-get install fio

Sau đó bạn cần xác định các ổ đĩa cần kiểm tra. Kiểm tra được thực hiện bằng cách thực hiện các thao tác đọc/ghi trong thư mục nơi ổ đĩa hoặc LUN được mount.
Hãy thực hiện một số loại kiểm tra hiệu suất IOPS ổ cứng trong các kịch bản tải đĩa khác nhau (chế độ kiểm tra bạn chọn tùy thuộc vào logic ứng dụng được lưu trữ và cơ sở hạ tầng chung của dự án).
Kiểm tra thao tác Đọc/Ghi ngẫu nhiên
Khi chạy kiểm tra, một file 8 GB sẽ được tạo. Sau đó fio sẽ đọc/ghi block 4KB (kích thước block tiêu chuẩn) với tỷ lệ 75/25% theo số lượng thao tác đọc và ghi và đo hiệu suất. Lệnh như sau:
# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randrw --rwmixread=75

Tôi chạy bài kiểm tra đầu tiên trên mảng bao gồm hai SSD và nhận được kết quả tốt:
- Read: 3280MiB/s, IOPS avg 83000
- Write: 110MiB/s, IOPS avg 28000
Vì chúng ta chạy kiểm tra kết hợp đọc/ghi, giá trị cho các bài kiểm tra riêng biệt sẽ cao hơn.
Để so sánh, tôi đo hiệu suất trên ổ SATA:

- Read: IOPS=430, BW=1.7 MiB/s
- Write: IOPS=143, BW=0.6 MiB/s
Tất nhiên, kết quả HDD kém hơn SSD.
Kiểm tra thao tác Đọc ngẫu nhiên
Để đo hiệu suất ổ cứng cho thao tác đọc ngẫu nhiên, chạy lệnh sau:
# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randread
Phần cuối của lệnh được thay đổi thành --readwrite=randread.

Như tôi nói trước, hiệu suất đọc/ghi sẽ cao hơn nếu đo riêng biệt:
READ: IOPS=150k, BW=584MiB/s (612MB/s)
Kiểm tra thao tác Ghi ngẫu nhiên
Đo hiệu suất ổ cứng cho thao tác ghi ngẫu nhiên, chạy lệnh này:
# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=fiotest --bs=4k --iodepth=64 --size=8G --readwrite=randwrite
WRITE: IOPS=84.7k, BW=331MiB/s (347MB/s)
Hiệu suất ghi trên SSD tốt cũng rất cao. Giống như bài kiểm tra đọc, sự khác biệt so với bài kiểm tra kết hợp đạt 200-250 MiB/s và 50000 IOPS.
Nếu tham khảo tài liệu chính thức của nhà sản xuất (đây là Intel SSD), có thể nói rằng các giá trị là chính xác.
Ví dụ file cấu hình Fio
Fio cho phép kiểm tra hiệu suất ổ cứng bằng lệnh tương tác và với file cấu hình chuẩn bị trước. Để dùng tùy chọn này, tạo một file:
# nano read.fio
Và thêm nội dung sau vào:
[global] rw=randread size=8G filename=/tmp/testfio ioengine=libaio iodepth=4 invalidate=1 direct=1 [bgread] rw=randread iodepth=64
Sau đó bắt đầu kiểm tra:
# fio read.fio
Bài kiểm tra sẽ đo hiệu suất đọc của ổ cứng. Để kiểm tra hiệu suất ghi, dùng file cấu hình sau:
[global] rw=randwrite size=8G filename=/tmp/testfio ioengine=libaio iodepth=4 invalidate=1 direct=1 [bgwrite] rw=randwrite iodepth=64
Đo độ trễ ổ cứng bằng Ioping
Ngoài IOPS, còn có một tham số quan trọng khác đặc trưng cho chất lượng lưu trữ của bạn: đó là độ trễ (latency). Latency là độ trễ yêu cầu đầu vào/đầu ra xác định thời gian truy cập vào bộ nhớ (đo bằng milliseconds). Càng độ trễ cao, ứng dụng của bạn càng phải chờ lâu để lấy dữ liệu từ đĩa. Giá trị độ trễ trên 20 ms cho các hệ thống lưu trữ dữ liệu điển hình được coi là kém.
Để kiểm tra độ trễ ổ cứng trên Linux, công cụ ioping được dùng:
# yum install ioping -y
# apt-get install ioping
Chạy kiểm tra độ trễ cho ổ đĩa của bạn (chạy 20 yêu cầu):
# ioping -c 20 /tmp/
4 KiB <<< /tmp/ (ext4 /dev/md126p5): request=1 time=1.55 ms (warmup) ...................... 4 KiB <<< /tmp/ (ext4 /dev/md126p5): request=19 time=176.3 us (fast) 4 KiB <<< /tmp/ (ext4 /dev/md126p5): request=20 time=356.9 us --- /tmp/ (ext4 /dev/md126p5) ioping statistics --- 19 requests completed in 5.67 ms, 76 KiB read, 3.35 k iops, 13.1 MiB/s generated 20 requests in 19.0 s, 80 KiB, 1 iops, 4.21 KiB/s min/avg/max/mdev = 176.3 us / 298.7 us / 368.9 us / 45.7 us
Giá trị trung bình là 298.7 us (microseconds), do đó độ trễ trung bình trong trường hợp của chúng ta là 0.3 ms, rất tốt.
Giá trị độ trễ có thể được chỉ định bằng us (microseconds) hoặc ms (milliseconds). Để lấy giá trị ms từ giá trị us, chia cho 1,000.
Vậy bạn có thể thực hiện bài kiểm tra tải lưu trữ trên máy chủ trước khi triển khai dự án và kiểm tra các giá trị hiệu suất cao nhất. Tuy nhiên, bài kiểm tra không đảm bảo mảng đĩa hoặc ổ cứng của bạn sẽ hiển thị cùng hiệu suất liên tục, nhưng đáng để thực hiện ở giai đoạn đầu của dự án. Tìm hiểu cách kiểm tra IOPS trên Windows trong bài viết này.