1. Giới thiệu.
FIO (Flexible I/O Tester) là một công cụ benchmark và mô phỏng khối lượng công việc cho Linux/Unix được tạo bởi Jens Axboe. FIO rất linh hoạt và được sử dụng rộng rãi cho benchmark hiệu suất lưu trữ.
2. Lợi ích sử dụng FIO.
- Linh hoạt: FIO có thể được cấu hình để mô phỏng nhiều loại khối lượng công việc khác nhau, bao gồm đọc/ghi tuần tự và ngẫu nhiên, I/O kích thước khối khác nhau và nhiều hơn nữa.
- Chính xác: FIO sử dụng các kỹ thuật đo lường thời gian chính xác để cung cấp kết quả benchmark đáng tin cậy.
- Dễ sử dụng: FIO có giao diện dòng lệnh đơn giản và dễ sử dụng.
- Miễn phí và mã nguồn mở: FIO là phần mềm miễn phí và mã nguồn mở được cấp phép theo Giấy phép GPL v2.
3. Cài đặt FIO.
FIO có sẵn trong kho lưu trữ của hầu hết các bản phân phối Linux. Bạn có thể cài đặt nó bằng cách sử dụng lệnh quản lý gói thích hợp cho bản phân phối của mình. Ví dụ, trên Ubuntu hoặc Debian, bạn có thể cài đặt FIO bằng cách sử dụng lệnh sau:
sudo apt install fio -y
4. Sử dụng FIO.
FIO có thể được sử dụng từ dòng lệnh với nhiều tùy chọn khác nhau. Ví dụ dưới đây là một mẫu để chạy FIO.
fio --name=write_throughput --directory=$TEST_DIR --numjobs=8 --size=20G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 --verify=0 --bs=1G --iodepth=64 --rw=write --group_reporting=1
Giải thích các tham số:
--name=write_throughput
: Gán tên “write_throughput” cho công việc để dễ dàng xác định trong kết quả đầu ra.--directory=$TEST_DIR
: Xác định thư mục để sử dụng cho các hoạt động I/O.--numjobs=8
: Đặt số lượng công việc đồng thời (luồng) để chạy, mô phỏng 8 hoạt động ghi đồng thời.--size=20G
: Xác định tổng kích thước dữ liệu cần ghi. Mỗi công việc sẽ góp phần ghi tổng cộng 20 GB.--time_based
: Hướng dẫnfio
chạy thử nghiệm trong khoảng thời gian được chỉ định thay vì đạt đến kích thước dữ liệu cụ thể.--runtime=60s
: Đặt thời lượng thử nghiệm là 60 giây.--ramp_time=2s
: Xác định thời gian khởi động là 2 giây trước khi bắt đầu các phép đo thực tế. Điều này cho phép hệ thống I/O ổn định vào trạng thái ổn định.--ioengine=libaio
: Chọn công cụ I/O không đồng bộ,libaio
để cải thiện hiệu suất.--direct=1
: Kích hoạt I/O trực tiếp, bỏ qua bộ cache filesystem.--verify=0
: Vô hiệu hóa verify dữ liệu sau khi ghi.--bs=1G
: Đặt kích thước khối cho các hoạt động I/O là 1 GB. Điều này có nghĩa là mỗi hoạt động ghi sẽ truyền 1 GB dữ liệu tại một thời điểm.--iodepth=64
: Xác định số lượng yêu cầu I/O đang chờ có thể được gửi cùng một lúc. Nói cách khác, đây là số lượng yêu cầu I/O đang chờ xử lý tại một thời điểm.- Tăng
iodepth
: Khi tăngiodepth
, bạn cho phép hệ thống gửi nhiều yêu cầu I/O hơn mà không cần chờ đợi kết quả của yêu cầu trước đó. Điều này có thể giúp tăng hiệu suất trên các thiết bị lưu trữ có khả năng xử lý đồng thời nhiều yêu cầu, như SSDs hoặc các hệ thống lưu trữ phân tán. - Giảm
iodepth
: Trong một số trường hợp, giảmiodepth
có thể giúp cải thiện độ trễ của từng yêu cầu I/O bởi vì hệ thống không bị quá tải bởi số lượng lớn yêu cầu đang chờ xử lý. Tuy nhiên, điều này có thể làm giảm tổng hiệu suất I/O.
- Tăng
--rw=write
: Xác định rằng thử nghiệm sẽ chỉ thực hiện hành động ghi dữ liệu.--group_reporting=1
: Kích hoạt báo cáo dữ liệu hiệu suất tổng hợp cho tất cả các công việc cùng nhau, cung cấp tổng quan về thông lượng ghi.
5. Ví dụ về sử dụng FIO.
Ví dụ về tình huống iodepth trong thực tế “Ứng dụng CSDL trên máy chủ với SSD”.
Giả sử bạn quản lý một máy chủ chạy một ứng dụng CSDL lớn, sử dụng ổ đĩa SSD để lưu trữ dữ liệu. Ứng dụng này thực hiện một lượng lớn các thao tác đọc và ghi ngẫu nhiên do nhu cầu truy vấn và cập nhật dữ liệu liên tục từ nhiều người dùng.
Mục tiêu: Tối ưu hóa hiệu suất I/O để cải thiện thời gian phản hồi của ứng dụng và tăng khả năng xử lý người dùng đồng thời.
Vấn đề: Bạn nhận thấy rằng thời gian phản hồi của CSDL tăng lên đáng kể trong giờ cao điểm, khi có nhiều yêu cầu truy cập dữ liệu.
Giải pháp: Sử dụng iodepth
trong cấu hình của công cụ benchmarking I/O (ví dụ: fio
) để tìm ra giá trị tối ưu cho ứng dụng CSDL của bạn.
- Phân tích hiện trạng:
- Sử dụng
fio
vớiiodepth
thấp (ví dụ:iodepth=4
) để mô phỏng môi trường I/O với ít yêu cầu đồng thời. Kết quả cho thấy hiệu suất I/O không đạt được tiềm năng tối đa của SSD, với thời gian phản hồi cao và IOPS thấp.
- Sử dụng
- Tăng
iodepth
:- Thực hiện các bài test tiếp theo với
iodepth
tăng dần (ví dụ:iodepth=16
,iodepth=32
,iodepth=64
). Bạn quan sát thấy rằng khi tăngiodepth
, hiệu suất I/O cải thiện đáng kể: IOPS tăng và thời gian phản hồi giảm, do SSD có khả năng xử lý hiệu quả nhiều yêu cầu đồng thời.
- Thực hiện các bài test tiếp theo với
- Tìm giá trị
iodepth
tối ưu:- Khi
iodepth
đạt64
, bạn nhận thấy rằng việc tăng thêm không còn cải thiện đáng kể hiệu suất I/O, và trong một số trường hợp, thậm chí còn gây ra tình trạng nghẽn cổ chai do quá tải controller của SSD. - Qua thử nghiệm, bạn xác định
iodepth=64
là giá trị tối ưu cho ứng dụng CSDL của mình, cung cấp sự cân bằng tốt nhất giữa thời gian phản hồi và tổng throughput.
- Khi
5.1. Xác định đĩa mục tiêu.
Lệnh lsblk
hiển thị danh sách các device. Tìm đĩa bạn muốn kiểm tra (ví dụ: zpool_vol01
, đây là một device tạo ra bởi ZFS).
shell> df -h | grep zpool_vol01
zpool_vol01 153T 97G 153T 1% /srv/node/vol01
Tạo một thư mục mới fiotest
trên đĩa để tránh ảnh hưởng đến dữ liệu hiện có.
TEST_DIR=/srv/node/vol01/fiotest
mkdir -p $TEST_DIR
5.2 Kiểm tra throughput ghi.
Lệnh này thực hiện ghi tuần tự (ghi dữ liệu theo luồng liên tục) với nhiều công việc (8+), kích thước khối 1 MB (lượng dữ liệu được ghi mỗi lần) và độ sâu hàng đợi 64 (số yêu cầu I/O chờ xử lý). Điều này mô phỏng việc ghi các file lớn.
fio --name=write_throughput --directory=$TEST_DIR --numjobs=8 \
--size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio \
--direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
--group_reporting=1
Các tùy chọn chính trong lệnh:
--rw=write
: Chỉ định thao tác ghi.--bs=1M
: Đặt kích thước khối thành 1 Megabyte.--iodepth=64
: Đặt độ sâu hàng đợi thành 64.
Output.
write_throughput: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=64
...
fio-3.28
Starting 8 processes
write_throughput: Laying out IO file (1 file / 10240MiB)
write_throughput: Laying out IO file (1 file / 10240MiB)
write_throughput: Laying out IO file (1 file / 10240MiB)
write_throughput: Laying out IO file (1 file / 10240MiB)
write_throughput: Laying out IO file (1 file / 10240MiB)
write_throughput: Laying out IO file (1 file / 10240MiB)
write_throughput: Laying out IO file (1 file / 10240MiB)
write_throughput: Laying out IO file (1 file / 10240MiB)
Jobs: 8 (f=8): [W(8)][100.0%][w=2225MiB/s][w=2224 IOPS][eta 00m:00s]
write_throughput: (groupid=0, jobs=8): err= 0: pid=2580560: Mon Jul 1 10:34:47 2024
write: IOPS=1842, BW=1851MiB/s (1941MB/s)(109GiB/60013msec); 0 zone resets
slat (usec): min=548, max=293519, avg=4329.44, stdev=5988.12
clat (usec): min=12, max=857413, avg=272915.89, stdev=164670.96
lat (msec): min=7, max=865, avg=277.26, stdev=166.41
clat percentiles (msec):
| 1.00th=[ 65], 5.00th=[ 90], 10.00th=[ 113], 20.00th=[ 144],
| 30.00th=[ 165], 40.00th=[ 182], 50.00th=[ 199], 60.00th=[ 245],
| 70.00th=[ 338], 80.00th=[ 430], 90.00th=[ 542], 95.00th=[ 609],
| 99.00th=[ 701], 99.50th=[ 726], 99.90th=[ 802], 99.95th=[ 818],
| 99.99th=[ 844]
bw ( MiB/s): min= 546, max= 4130, per=99.67%, avg=1845.22, stdev=111.80, samples=952
iops : min= 546, max= 4130, avg=1844.27, stdev=111.79, samples=952
lat (usec) : 20=0.01%
lat (msec) : 10=0.01%, 20=0.01%, 50=0.12%, 100=7.14%, 250=53.67%
lat (msec) : 500=26.36%, 750=12.84%, 1000=0.31%
cpu : usr=2.96%, sys=19.69%, ctx=720107, majf=0, minf=449817
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued rwts: total=0,110596,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
WRITE: bw=1851MiB/s (1941MB/s), 1851MiB/s-1851MiB/s (1941MB/s-1941MB/s), io=109GiB (117GB), run=60013-60013msec
5.3. Kiểm tra IOPS ghi.
Lệnh này thực hiện ghi ngẫu nhiên với kích thước khối nhỏ hơn (4 KB) và độ sâu hàng đợi tương tự (64). Điều này mô phỏng việc ghi nhiều file nhỏ.
fio --name=write_iops --directory=$TEST_DIR --size=10G \
--time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 --numjobs=8 \
--verify=0 --bs=4K --iodepth=64 --rw=randwrite --group_reporting=1
Các tùy chọn chính trong lệnh:
--rw=randwrite
: Chỉ định ghi ngẫu nhiên.--bs=4K
: Đặt kích thước khối thành 4 Kilobyte.
Output.
write_iops: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
...
fio-3.28
Starting 8 processes
write_iops: Laying out IO file (1 file / 10240MiB)
write_iops: Laying out IO file (1 file / 10240MiB)
write_iops: Laying out IO file (1 file / 10240MiB)
write_iops: Laying out IO file (1 file / 10240MiB)
write_iops: Laying out IO file (1 file / 10240MiB)
write_iops: Laying out IO file (1 file / 10240MiB)
write_iops: Laying out IO file (1 file / 10240MiB)
Jobs: 8 (f=8): [w(8)][100.0%][w=173MiB/s][w=44.4k IOPS][eta 00m:00s]
write_iops: (groupid=0, jobs=8): err= 0: pid=2454376: Mon Jul 1 10:33:12 2024
write: IOPS=39.6k, BW=155MiB/s (162MB/s)(9293MiB/60002msec); 0 zone resets
slat (usec): min=6, max=86586, avg=198.91, stdev=727.48
clat (usec): min=7, max=190125, avg=12717.27, stdev=16969.40
lat (usec): min=1423, max=191253, avg=12916.59, stdev=17209.13
clat percentiles (msec):
| 1.00th=[ 4], 5.00th=[ 4], 10.00th=[ 5], 20.00th=[ 6],
| 30.00th=[ 7], 40.00th=[ 7], 50.00th=[ 7], 60.00th=[ 8],
| 70.00th=[ 9], 80.00th=[ 12], 90.00th=[ 27], 95.00th=[ 51],
| 99.00th=[ 90], 99.50th=[ 101], 99.90th=[ 124], 99.95th=[ 133],
| 99.99th=[ 148]
bw ( KiB/s): min=41530, max=215544, per=100.00%, avg=158773.82, stdev=3826.95, samples=952
iops : min=10379, max=53888, avg=39692.79, stdev=956.74, samples=952
lat (usec) : 10=0.01%, 20=0.01%
lat (msec) : 2=0.01%, 4=5.52%, 10=72.04%, 20=8.02%, 50=9.33%
lat (msec) : 100=4.60%, 250=0.50%
cpu : usr=1.53%, sys=52.01%, ctx=296958, majf=0, minf=11537
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued rwts: total=0,2378470,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
WRITE: bw=155MiB/s (162MB/s), 155MiB/s-155MiB/s (162MB/s-162MB/s), io=9293MiB (9744MB), run=60002-60002msec
Phân tích bài test về IOPS và throughput ghi.
Với tùy chọn --numjobs=8
trong lệnh fio
, 8 công việc sẽ được thực hiện đồng thời, không phải lần lượt. Mỗi công việc sẽ ghi dữ liệu vào một file riêng biệt với kích thước mỗi file là 10GB và mỗi lần ghi là 1MB, cho đến khi đạt đủ kích thước file yêu cầu.
Với cấu hình --size=10G
và --bs=1M
trong lệnh fio
, mỗi công việc (job) sẽ ghi dữ liệu vào một file với tổng kích thước là 10GB, và mỗi lần ghi (I/O operation) sẽ ghi 1MB dữ liệu. Với --numjobs=8
, có tổng cộng 8 công việc này được thực hiện đồng thời, mỗi công việc ghi vào một file riêng biệt cho đến khi đạt kích thước file là 10GB.
Sự khác biệt về IOPS (Số Phép Đọc/Ghi Mỗi Giây) giữa hai bài test có thể được giải thích qua kích thước khối (bs
) được sử dụng trong mỗi bài test và bản chất của các phép ghi (tuần tự so với ngẫu nhiên).
- Bài test throughput ghi:
- Kích thước:
1M
(1 MiB)Phép ghi: Tuần tự (--rw=write
)Kết quả: Băng thông cao (BW=1851MiB/s
) và IOPS thấp (IOPS=1842
)
- Kích thước:
- Bài test IOPS ghi:
- Kích thước khối:
4K
(4 KiB) - Phép ghi: Ngẫu nhiên (
--rw=randwrite
) - Kết quả: Băng thông thấp (
BW=155MiB/s
) và IOPS cao (IOPS=39.6k
)
- Kích thước khối:
Kết luận:
- Bài Test Thông Lượng Ghi được tối ưu hóa cho ghi tuần tự, sử dụng kích thước khối lớn để tối đa hóa lượng dữ liệu truyền mỗi phép ghi, dẫn đến băng thông cao nhưng IOPS thấp.
- Bài Test IOPS Ghi được tối ưu hóa cho ghi ngẫu nhiên, sử dụng kích thước khối nhỏ để tăng số lượng phép ghi mỗi giây, dẫn đến IOPS cao nhưng băng thông thấp.
Sự khác biệt về kích thước khối và bản chất của các phép ghi (tuần tự so với ngẫu nhiên) là lý do chính cho sự khác biệt về IOPS giữa hai bài test.
Đo hiệu suất đọc
Kiểm tra throughput đọc: Lệnh này thực hiện đọc tuần tự (tương tự như kiểm tra throughput ghi nhưng đọc dữ liệu) với các thông số tương tự.
fio --name=read_throughput --directory=$TEST_DIR --numjobs=8 \
--size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio \
--direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
--group_reporting=1
- Các tùy chọn chính trong lệnh:
--rw=read
: Chỉ định thao tác đọc.
Output.
read_throughput: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=libaio, iodepth=64
...
fio-3.28
Starting 8 processes
read_throughput: Laying out IO file (1 file / 10240MiB)
read_throughput: Laying out IO file (1 file / 10240MiB)
read_throughput: Laying out IO file (1 file / 10240MiB)
read_throughput: Laying out IO file (1 file / 10240MiB)
read_throughput: Laying out IO file (1 file / 10240MiB)
read_throughput: Laying out IO file (1 file / 10240MiB)
read_throughput: Laying out IO file (1 file / 10240MiB)
read_throughput: Laying out IO file (1 file / 10240MiB)
Jobs: 8 (f=8): [R(8)][100.0%][r=11.0GiB/s][r=11.3k IOPS][eta 00m:00s]
read_throughput: (groupid=0, jobs=8): err= 0: pid=3496531: Mon Jul 1 13:15:47 2024
read: IOPS=11.2k, BW=10.9GiB/s (11.7GB/s)(656GiB/60001msec)
slat (usec): min=328, max=31414, avg=711.91, stdev=90.28
clat (usec): min=2, max=130803, avg=45004.79, stdev=2051.50
lat (usec): min=499, max=132768, avg=45717.35, stdev=2075.70
clat percentiles (msec):
| 1.00th=[ 42], 5.00th=[ 43], 10.00th=[ 43], 20.00th=[ 44],
| 30.00th=[ 45], 40.00th=[ 45], 50.00th=[ 46], 60.00th=[ 46],
| 70.00th=[ 46], 80.00th=[ 46], 90.00th=[ 47], 95.00th=[ 47],
| 99.00th=[ 48], 99.50th=[ 49], 99.90th=[ 62], 99.95th=[ 72],
| 99.99th=[ 110]
bw ( MiB/s): min=10293, max=11429, per=99.99%, avg=11202.07, stdev=22.26, samples=960
iops : min=10292, max=11426, avg=11200.10, stdev=22.26, samples=960
lat (usec) : 4=0.01%, 10=0.01%, 750=0.01%, 1000=0.01%
lat (msec) : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.02%, 50=99.81%
lat (msec) : 100=0.22%, 250=0.01%
cpu : usr=0.33%, sys=99.56%, ctx=1556, majf=0, minf=33404
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued rwts: total=671717,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
READ: bw=10.9GiB/s (11.7GB/s), 10.9GiB/s-10.9GiB/s (11.7GB/s-11.7GB/s), io=656GiB (705GB), run=60001-60001msec
Kiểm tra IOPS đọc: Lệnh này thực hiện đọc ngẫu nhiên với các thông số tương tự như kiểm tra IOPS ghi ngẫu nhiên.
sudo fio --name=read_iops --directory=$TEST_DIR --size=10G \
--time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 \
--verify=0 --bs=4K --iodepth=64 --rw=randread --group_reporting=1
- Các tùy chọn chính trong lệnh:
--rw=randread
: Chỉ định đọc ngẫu nhiên.
Ví dụ về output read.
read_iops: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.28
Starting 1 process
read_iops: Laying out IO file (1 file / 10240MiB)
Jobs: 1 (f=1): [r(1)][100.0%][r=183MiB/s][r=46.8k IOPS][eta 00m:00s]
read_iops: (groupid=0, jobs=1): err= 0: pid=3565937: Mon Jul 1 13:17:38 2024
read: IOPS=49.7k, BW=194MiB/s (204MB/s)(11.4GiB/60001msec)
slat (nsec): min=1912, max=2141.9k, avg=19457.58, stdev=12344.74
clat (nsec): min=1036, max=3835.0k, avg=1267802.02, stdev=235237.94
lat (usec): min=4, max=3887, avg=1287.33, stdev=238.66
clat percentiles (usec):
| 1.00th=[ 379], 5.00th=[ 685], 10.00th=[ 1004], 20.00th=[ 1205],
| 30.00th=[ 1254], 40.00th=[ 1287], 50.00th=[ 1319], 60.00th=[ 1352],
| 70.00th=[ 1385], 80.00th=[ 1418], 90.00th=[ 1467], 95.00th=[ 1500],
| 99.00th=[ 1565], 99.50th=[ 1598], 99.90th=[ 1729], 99.95th=[ 1893],
| 99.99th=[ 2474]
bw ( KiB/s): min=172504, max=601760, per=100.00%, avg=198878.20, stdev=49796.23, samples=120
iops : min=43126, max=150440, avg=49719.51, stdev=12449.04, samples=120
lat (usec) : 2=0.01%, 10=0.01%, 50=0.01%, 100=0.01%, 250=0.03%
lat (usec) : 500=2.58%, 750=3.27%, 1000=3.98%
lat (msec) : 2=90.11%, 4=0.03%
cpu : usr=3.16%, sys=96.83%, ctx=138, majf=0, minf=68
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
issued rwts: total=2982146,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
READ: bw=194MiB/s (204MB/s), 194MiB/s-194MiB/s (204MB/s-204MB/s), io=11.4GiB (12.2GB), run=60001-60001msec
Output thông báo này cung cấp thông tin về kết quả của một công việc đọc (READ) được thực hiện bởi công cụ fio
, một công cụ đánh giá hiệu suất I/O. Dưới đây là phân tích chi tiết của từng phần:
- Run status group 0 (all jobs): Điều này chỉ ra rằng thông tin được cung cấp áp dụng cho tất cả các công việc I/O trong nhóm 0. Trong
fio
, các công việc có thể được tổ chức thành các nhóm để dễ dàng quản lý và phân tích. - READ: Phần này cho biết thông tin về hoạt động đọc:
- bw=194MiB/s (204MB/s), 194MiB/s-194MiB/s (204MB/s-204MB/s): Băng thông trung bình cho hoạt động đọc là 194 MiB/s (tương đương 204 MB/s khi quy đổi). Giá trị này được thể hiện hai lần, một lần dưới dạng MiB (Mebibyte) và một lần dưới dạng MB (Megabyte), với 1 MiB = 1024^2 bytes và 1 MB = 10^6 bytes. Sự lặp lại của giá trị chỉ ra rằng băng thông không thay đổi trong suốt quá trình đọc.
- io=11.4GiB (12.2GB): Tổng lượng dữ liệu đã đọc là 11.4 GiB (hoặc 12.2 GB khi quy đổi). GiB (Gibibyte) là một đơn vị đo lường dựa trên hệ nhị phân, trong khi GB (Gigabyte) dựa trên hệ thập phân. Sự chênh lệch giữa hai đơn vị này giúp hiểu rõ hơn về lượng dữ liệu được xử lý.
- run=60001-60001msec: Thời gian thực hiện hoạt động đọc là 60001 mili giây (tức là khoảng 60.001 giây hoặc 60 giây và 1 mili giây). Điều này chỉ ra rằng quá trình đọc diễn ra trong khoảng thời gian chính xác là 60 giây, với một mili giây bổ sung có thể do độ trễ trong việc bắt đầu hoặc kết thúc.
Tóm lại, thông báo này cho biết trong khoảng thời gian 60 giây, công cụ fio
đã thực hiện một công việc đọc từ hệ thống lưu trữ với băng thông trung bình là 194 MiB/s, xử lý tổng cộng 11.4 GiB dữ liệu.
Dọn dẹp
Sau khi hoàn tất các bài kiểm tra, bạn nên dọn dẹp thư mục tạm thời và các file test được tạo ra:
sudo rm $TEST_DIR/write* $TEST_DIR/read*
Lưu ý:
- Các thông số trong các lệnh benchmark có thể được điều chỉnh theo nhu cầu cụ thể của bạn.
- Nên thực hiện các bài kiểm tra benchmark nhiều lần để có kết quả chính xác hơn.
- Bạn có thể tham khảo tài liệu chính thức của fio để biết thêm thông tin chi tiết về các tùy chọn và cách sử dụng: https://fio.readthedocs.io/
Tổng kết.
FIO là một công cụ mạnh mẽ và linh hoạt để benchmark hiệu suất lưu trữ. Nó có thể được sử dụng để mô phỏng nhiều loại khối lượng công việc khác nhau và cung cấp kết quả benchmark chính xác. Nếu bạn cần benchmark hiệu suất lưu trữ của hệ thống Linux của mình, FIO là một công cụ tuyệt vời để sử dụng.
Tài liệu tham khảo https://vineetcic.medium.com/disk-benchmarking-using-fio-c71e0ce0d47c