Hướng dẫn kiểm tra tốc độ ổ cứng SSD

Khi khách hàng đăng ký VPS và họ có nhu cầu kiểm tra lại thông tin tin ổ cứng sao cho chính xác đúng với bên mua thì lại rất khó khăn. Đa phần mọi người sẽ sử dụng câu lệnh:

“dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync”

Đây là câu lệnh có sẵn trên hầu hết các hệ điều hành linux. Câu lệnh sẽ ghi 16000 lần với block size 64k để tạo ra file 1GB. Kết quả có thể rất thấp, ví dụ 30MB/s. Hãy cùng phân tích cách hoạt động của câu lệnh trên:

Đây là 1 tính trình độc lập(single-threaded), thực hiện ghi tuần tự(sequential-write). Đối với các dịch vụ webserver: nginx, apache… database: Mysql, MongoDB, MSSQL server … dữ liệu ít khi nào được ghi tuần tự trong 1 thời gian dài. Kết quả phía trên là vô nghĩa.

Dữ liệu được ghi khá nhỏ 1GB. Tốc độ ghi file dữ liệu có thể tăng lên bằng cách sử dụng tính năng write-back trên RAID server. Khi ghi xuống lệnh sẽ ghi trực tiếp lên NVRAM(cache) của card RAID trước, sau đó thông báo cho VPS quá trình ghi hoàn tất. Thực tế, dữ liệu vẫn còn nằm trên NVRAM chưa ghi xuống ổ cứng hoàn toàn.
Thời gian thực thi quá ngắn, không đủ để đưa ra kết quả chính xác nhất.
Chưa kiểm tra kết quả ghi.

1. Kiểm tra tốc độ IOPS ổ cứng

Để kiểm tra kết quả chính xác nhất, sát với thực tế khi VPS/server chịu tải website database, chúng tôi đề xuất sử dụng công cụ fio kiểm tra tốc độ IOPS(Input/output per second) – tốc độ đọc ghi dữ liệu trong 1 giây, cách kiểm tra như sau:

Kiểm tra đọc ngẫu nhiên(random reads), ghi ngẫu nhiên(random writes) hoặc kết hợp cả 2. Dữ liệu database thường ghi ngẫu nhiên lên ổ cứng.

Test với block size 4k. Database và những chương trình thông thường đọc những gói tin nhỏ 4kb.
Các website thường có nhiều người truy cập cùng 1 lúc vì vậy nên đo lường tốc độ ổ cứng với đa tiến trình(multiple threads) cùng 1 thời điểm.

2. Kiểm tra tốc độ đọc/ghi

Cấu hình VPS kiểm tra

[bash]
RAM:2GB
CPU:2 core
ổ cứng: 10GB SSD
[/bash]

Thực thi câu lệnh bên dưới:

 

 

Thực thi câu lệnh bên dưới:

[bash]
cd /root
fio –randrepeat=1 –ioengine=libaio –direct=1 –gtod_reduce=1 –name=test –filename=test –bs=4k –iodepth=64 –size=4G –readwrite=randrw –rwmixread=75
[/bash]
Câu lệnh sẽ tạo ra file 4GB, mỗi mẫu tin 4KB sẽ đọc ghi với tỉ lệ 75%/25%(3 lần đọc, 1 lần ghi) với 64 tiến trình cùng 1 lúc. Tỉ lệ 3:1 như trên gần giống như cách đọc ghi của các phần mềm database hiện tại.

Kết quả sau khi kiểm tra xong:

test: (g=0): rw=randrw, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.15
Starting 1 process
test: Laying out IO file(s) (1 file(s) / 4096MB)
Jobs: 1 (f=1): [m(1)] [100.0% done] [62506KB/21105KB/0KB /s] [15.7K/5276/0 iops] [eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=12219: Tue Dec 13 11:07:08 2016
read : io=3070.4MB, bw=74548KB/s, iops=18636, runt= 42174msec
write: io=1025.8MB, bw=24904KB/s, iops=6226, runt= 42174msec
cpu : usr=14.97%, sys=54.08%, ctx=201990, majf=0, minf=30
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=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 : total=r=785996/w=262580/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
READ: io=3070.4MB, aggrb=74547KB/s, minb=74547KB/s, maxb=74547KB/s, mint=42174msec, maxt=42174msec
WRITE: io=1025.8MB, aggrb=24904KB/s, minb=24904KB/s, maxb=24904KB/s, mint=42174msec, maxt=42174msec

Disk stats (read/write):
vda: ios=785123/262319, merge=1/3, ticks=1571425/929520, in_queue=2500488, util=99.95%.

Theo như kết quả kiểm tra VPS sẽ là:

18636 IOPS read
6226 IOPS write
Thông thường ổ cứng non-SSD có tốc độ IOPS đọc/ghi ngẫu nhiên lần lượt là 500/200. Ngoài ra bạn có thể chỉ kiểm tra riêng tốc độ đọc ghi ngẫu nhiên với các câu lệnh bên dưới:

Đọc ngẫu nhiên:

[bash]
fio –randrepeat=1 –ioengine=libaio –direct=1 –gtod_reduce=1 –name=test –filename=test –bs=4k –iodepth=64 –size=4G –readwrite=randread
[/bash]

Ghi ngẫu nhiên:

[bash]
fio –randrepeat=1 –ioengine=libaio –direct=1 –gtod_reduce=1 –name=test –filename=test –bs=4k –iodepth=64 –size=4G –readwrite=randwrite
[/bash]

Leave a Reply