iostat là một công cụ có sẵn trên Linux để đo lường các thông số I/O và hiển thị chúng dưới dạng bảng thống kê. Để sử dụng iostat, bạn có thể làm theo các bước sau:
Mở terminal và chạy lệnh sau để cài đặt iostat (nếu chưa có trên hệ thống):
sudo apt-get update
sudo apt-get install sysstat
Chạy lệnh sau để hiển thị thống kê iostat:
iostat -x
Lệnh này sẽ hiển thị tất cả các ổ đĩa trên hệ thống cùng các thông số I/O, throughput và latency của chúng. Kết quả sẽ được cập nhật theo thời gian thực.
Ngoài ra, bạn có thể sử dụng các tham số để định dạng kết quả hiển thị của iostat, ví dụ:
- Tham số -c: hiển thị các thông số CPU
- Tham số -d: chỉ hiển thị các thông số ổ đĩa đã chọn
- Tham số -k: hiển thị kết quả theo đơn vị KB/s
Ví dụ: lệnh sau sẽ hiển thị thông số I/O, throughput và latency của tất cả các ổ đĩa cùng các thông số CPU trong đơn vị KB/s:
iostat -x -c -k
Lưu ý rằng các thông số I/O, throughput và latency có thể thay đổi tùy thuộc vào từng ổ đĩa và từng thời điểm khác nhau, do đó việc đánh giá hiệu suất hệ thống nên được thực hiện dựa trên nhiều lần đo lường và so sánh.
Để đo được kết quả I/O tối đa thì cần thực hiện các thao tác I/O trên đĩa một cách liên tục và cân đối. Tuy nhiên, việc đọc và ghi file trong quá trình đo I/O có thể ảnh hưởng đến kết quả đo, đặc biệt nếu file đọc/ghi quá lớn hoặc quá nhỏ, hoặc các tiến trình khác đang sử dụng đĩa trong khi đo.
Để tránh ảnh hưởng của các tiến trình khác, người dùng có thể chạy các thao tác I/O đơn giản như sao chép file hoặc tạo file mới. Tuy nhiên, cần lưu ý rằng kết quả đo I/O có thể khác nhau tùy thuộc vào cấu hình của hệ thống và tác động của các tiến trình khác trên hệ thống. Do đó, việc đo I/O tối đa cần được thực hiện kỹ càng và cân nhắc để đảm bảo tính chính xác của kết quả đo.
$ iostat -x -c -k
Linux 5.4.0-144-generic (kvm) 05/13/2023 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3.59 0.00 1.49 0.01 0.00 94.91
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz aqu-sz %util
sda 0.02 0.80 0.00 0.66 0.76 38.17 20.67 519.99 1.67 7.48 0.63 25.16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.16
Các tham số trong bảng trên được giải thích như sau:
- Device: tên thiết bị lưu trữ (ở đây là sda)
- r/s: số lần đọc (read) trên thiết bị trong mỗi giây
- rkB/s: số lượng dữ liệu (kB) đọc từ thiết bị trong mỗi giây
- rrqm/s: số lần yêu cầu đọc được đưa vào hàng đợi I/O request trên thiết bị trong mỗi giây (request read merge)
- %rrqm: tỷ lệ yêu cầu đọc được đưa vào hàng đợi I/O request trên thiết bị trong mỗi giây (request read merge)
- r_await: thời gian chờ trung bình của các yêu cầu đọc (read) trong hàng đợi (await for read)
- rareq-sz: kích thước trung bình của các yêu cầu đọc (read) trên thiết bị (read request size)
- w/s: số lần ghi (write) trên thiết bị trong mỗi giây
- wkB/s: số lượng dữ liệu (kB) ghi vào thiết bị trong mỗi giây
- wrqm/s: số lần yêu cầu ghi được đưa vào hàng đợi I/O request trên thiết bị trong mỗi giây (request write merge)
- %wrqm: tỷ lệ yêu cầu ghi được đưa vào hàng đợi I/O request trên thiết bị trong mỗi giây (request write merge)
- w_await: thời gian chờ trung bình của các yêu cầu ghi (write) trong hàng đợi (await for write)
- wareq-sz: kích thước trung bình của các yêu cầu ghi (write) trên thiết bị (write request size)
- d/s: số lần xóa (delete) trên thiết bị trong mỗi giây
- dkB/s: số lượng dữ liệu (kB) được xóa khỏi thiết bị trong mỗi giây
- drqm/s: số lần yêu cầu xóa được đưa vào hàng đợi I/O request trên thiết bị trong mỗi giây (request delete merge)
- %drqm: tỷ lệ yêu cầu xóa được đưa vào hàng đợi I/O request trên thiết bị trong mỗi giây (request delete merge)
- d_await: thời gian chờ trung bình của các yêu cầu xóa (delete) trong hàng đợi (await for delete)
- dareq-sz: kích thước trung bình của các yêu cầu xóa (delete) trên thiết bị (delete request size)
- aqu-sz: độ sâu hàng đợi I/O request trên thiết bị (avgqu-sz)
- %util: tỷ lệ sử dụng tài nguyên của thiết bị (device utilization)
Dựa trên đầu ra của lệnh iostat trong ví dụ trên, ta có thể tính toán các thông số như sau:
- I/O (IOps):
- Đối với đĩa sda: r/s (reads per second) + w/s (writes per second) = 0.02 + 20.67 = 20.69 IOps
- Throughput (MB/s):
- Đối với đĩa sda: (rkB/s (read kilobytes per second) + wkB/s (write kilobytes per second)) / 1024 = (0.80 + 519.99) / 1024 = 0.509 MB/s
- Latency (ms):
- Đối với đĩa sda:
- R-latency (read latency) = r_await (average time spent by the system waiting for read requests to complete) = 0.76 ms
- W-latency (write latency) = w_await (average time spent by the system waiting for write requests to complete) = 7.48 ms
- T-latency (total latency) = aqu-sz (average queue size) / throughput = 0.00 / 0.509 = 0.00 ms
- Đối với đĩa sda:
Lưu ý rằng thông số latency trong ví dụ trên là ước tính dựa trên thông số khác, và có thể không chính xác hoàn toàn. Thông số latency thực tế còn phụ thuộc vào nhiều yếu tố khác như loại ổ đĩa, dung lượng sử dụng, tải công việc, v.v.
Bạn có thể tùy chỉnh đơn vị đo trong báo cáo iostat. Có hai tùy chọn có sẵn để chọn đơn vị đó là:
-k: Hiển thị thống kê tính bằng kilobyte trên giây
$ iostat -k
Linux 5.4.0-144-generic (kvm) 05/13/2023 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3.60 0.00 1.49 0.01 0.00 94.90
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
sda 20.81 0.89 529.87 0.00 3797665 2258443468 0
sdb 0.72 1.40 13.51 0.00 5956893 57592756 0
sdc 0.16 6.63 4.29 0.00 28251761 18283264 0
-m: Hiển thị thống kê tính bằng megabyte trên giây
$ iostat -m
Linux 5.4.0-144-generic (kvm) 05/13/2023 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3.60 0.00 1.49 0.01 0.00 94.90
Device tps MB_read/s MB_wrtn/s MB_dscd/s MB_read MB_wrtn MB_dscd
sda 20.81 0.00 0.52 0.00 3708 2205516 0
sdb 0.72 0.00 0.01 0.00 5817 56243 0
sdc 0.16 0.01 0.00 0.00 27589 17854 0
Bạn có thể hiển thị dữ liệu dạng JSON bằng cách sử dụng tham số -o JSON
$ iostat -o JSON
{"sysstat": {
"hosts": [
{
"nodename": "kvm",
"sysname": "Linux",
"release": "5.4.0-144-generic",
"machine": "x86_64",
"number-of-cpus": 24,
"date": "05/13/2023",
"statistics": [
{
"avg-cpu": {"user": 3.60, "nice": 0.00, "system": 1.49, "iowait": 0.01, "steal": 0.00, "idle": 94.90},
"disk": [
{"disk_device": "sda", "tps": 20.82, "kB_read/s": 0.89, "kB_wrtn/s": 529.87, "kB_dscd/s": 0.00, "kB_read": 3797665, "kB_wrtn": 2258507876, "kB_dscd": 0},
{"disk_device": "sdb", "tps": 0.72, "kB_read/s": 1.40, "kB_wrtn/s": 13.51, "kB_dscd/s": 0.00, "kB_read": 5956893, "kB_wrtn": 57593976, "kB_dscd": 0},
{"disk_device": "sdc", "tps": 0.16, "kB_read/s": 6.63, "kB_wrtn/s": 4.29, "kB_dscd/s": 0.00, "kB_read": 28251761, "kB_wrtn": 18283264, "kB_dscd": 0}
]
}
]
}
]
}}
Khi sử dụng tham số -h cùng với lệnh iostat, nó sẽ hiển thị đầu ra theo định dạng dễ đọc hơn. Các giá trị sẽ được chuyển đổi sang đơn vị đo lường phù hợp như KB/s, MB/s, GB/s, vv để dễ dàng đọc và hiểu. Ví dụ, thay vì hiển thị giá trị đọc ghi trên ổ đĩa dưới dạng số khô khan như bytes/s hoặc sectors/s, nó sẽ hiển thị dưới dạng KB/s hoặc MB/s giúp cho người dùng dễ dàng đọc và hiểu hơn.
$ iostat -h
Linux 5.4.0-144-generic (kvm) 05/13/2023 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
3.6% 0.0% 1.5% 0.0% 0.0% 94.9%
tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd Device
20.82 0.9k 529.9k 0.0k 3.6G 2.1T 0.0k sda
0.72 1.4k 13.5k 0.0k 5.7G 54.9G 0.0k sdb
0.16 6.6k 4.3k 0.0k 26.9G 17.4G 0.0k sdc
Khi sử dụng tham số -d thì nó chỉ báo cáo sử dụng thiết bị được hiển thị trong đầu ra, không hiển thị thông tin khác như số lượng I/O hoặc thời gian phản hồi. Thông tin chi tiết của từng thiết bị bao gồm: số lần đọc/ghi, số lần truy cập ngẫu nhiên và tuần tự, số truy cập được sắp xếp lại, tổng số lần truy cập và tổng số dung lượng được truyền và nhận.
$ iostat -d
Linux 5.4.0-144-generic (kvm) 05/13/2023 _x86_64_ (24 CPU)
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
sda 20.82 0.89 529.86 0.00 3797665 2258570364 0
sdb 0.72 1.40 13.51 0.00 5956893 57594668 0
sdc 0.16 6.63 4.29 0.00 28251761 18283264 0
Dưới đây là bảng so sánh giữa các nền tảng lưu trữ bằng số liệu, dựa trên các thông số về storage, I/O, throughput và latency, và đánh giá bằng số sao ★ (tối đa 5 sao) trong điều kiện tốt nhất.
Loại ổ cứng/ Hệ thống lưu trữ | I/O (IOPS) | Thông lượng (throughput MB/s) | Độ trễ (Latency) | Đánh giá ★ |
---|---|---|---|---|
HDD 5.400 vòng | 60 – 80 | 80 – 160 | 5 – 8ms | ★☆☆☆☆☆☆☆☆☆ |
SAS 7.200 vòng | 120 – 180 | 200 – 250 | 3 – 5ms | ★★☆☆☆☆☆☆☆☆ |
SAS 10.000 vòng | 140 – 200 | 200 – 320 | 2 – 4ms | ★★★☆☆☆☆☆☆☆ |
SAS 15.000 vòng | 175 – 250 | 300 – 400 | 2 – 3ms | ★★★★☆☆☆☆☆☆ |
SSD SATA2 | 4.000 – 10.000 | 150 – 250 | 0.1 – 0.5ms | ★★★★☆☆☆☆☆☆ |
SSD SATA3 | 4.000 – 10.000 | 400 – 550 | 0.05 – 0.1ms | ★★★★★☆☆☆☆☆ |
NVMe Gen1 | 30.000 – 40.000 | 1.500 – 1.900 | 0.02 – 0.05ms | ★★★★★★☆☆☆☆ |
NVMe Gen2 | 50.000 – 70.000 | 2.500 – 3.500 | 0.02 – 0.03ms | ★★★★★★★☆☆☆ |
NVMe Gen3 | 70.000 – 80.000 | 3.500 – 5.000 | 0.02 – 0.03ms | ★★★★★★★★☆☆ |
NVMe Gen4 | 750.000+ | 7.000+ | < 0.02ms | ★★★★★★★★★☆ |
NVMe Gen5 | 1.000.000+ | 14.000+ | < 0.01ms | ★★★★★★★★★★ |
NVMe Gen6 | 1.500.000+ | 22.000+ | < 0.01ms | ★★★★★★★★★★ |
Ceph | 100.000+ | 5.000+ | 0.1 – 2ms | ★★★★★★★☆☆☆ |
S2D | 50.000+ | 2.000+ | 1 – 10ms | ★★★★★★☆☆☆☆ |
Virtuozzo | 100.000+ | 2.000+ | 0.2 – 0.5ms | ★★★★★★★★☆☆ |
SAN | 100.000+ | 5.000+ | 0.1 – 1ms | ★★★★★★★☆☆☆ |
3D XPoint | 500.000+ | 2.500+ | < 0.01ms | ★★★★★★★★★★ |
OpenZFS | 100.000+ | 2.000+ | 0.1 – 1ms | ★★★★★★★★☆☆ |
FreeNAS | 100,000+ | 2,000+ | 0.1 – 1ms | ★★★★★★★★☆☆ |
Unraid | 50,000+ | 1,500+ | 0.2 – 1ms | ★★★★★★★☆☆☆ |
Proxmox VE Storage | 200,000+ | 4,000+ | 0.05 – 0.5ms | ★★★★★★★★★☆ |
Lưu ý rằng bảng này chỉ mang tính chất tham khảo và các số liệu có thể thay đổi tùy thuộc vào nhiều yếu tố khác nhau, bao gồm cấu hình phần cứng, phần mềm, tải động, và cách thức đo lường.