1. Giám sát hoạt động I/O ổ đĩa theo thời gian thực
Để theo dõi hoạt động đọc/ghi (I/O) của các ổ đĩa trên hệ thống Linux một cách trực quan và tức thời, công cụ iotop là một lựa chọn hữu ích. Nó hiển thị thông tin tương tự như top, nhưng tập trung vào việc sử dụng I/O của từng tiến trình.
Cài đặt iotop
# Đối với hệ thống dựa trên RHEL/CentOS
sudo yum install iotop -y
# Đối với hệ thống dựa trên Debian/Ubuntu
sudo apt update
sudo apt install iotop -y
Sử dụng iotop
Sau khi cài đặt, bạn có thể chạy iotop với quyền root để xem hoạt động I/O:
sudo iotop
Kết quả hiển thị sẽ tương tự như sau:
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
Các cột quan trọng cần chú ý:
Total DISK READvàTotal DISK WRITE: Tổng tốc độ đọc và ghi của toàn bộ hệ thống.DISK READvàDISK WRITE: Tốc độ đọc và ghi của từng tiến trình cụ thể.COMMAND: Lệnh đang chạy gây ra hoạt động I/O.
2. Công cụ dd và các tùy chọn quan trọng
Lệnh dd là một tiện ích dòng lệnh mạnh mẽ trên Linux, được sử dụng để sao chép, chuyển đổi dữ liệu ở mức độ thấp và là công cụ lý tưởng để kiểm tra hiệu suất I/O của ổ đĩa.
Các tham số chính của dd:
if=input_file: Chỉ định tệp hoặc thiết bị nguồn (input file). Ví dụ:/dev/zero,/dev/urandom, hoặc đường dẫn đến một tệp.of=output_file: Chỉ định tệp hoặc thiết bị đích (output file). Ví dụ:/dev/null, đường dẫn đến một tệp, hoặc một ổ đĩa/dev/sdX.bs=bytes: Kích thước của mỗi khối dữ liệu (block size) được đọc và ghi. Việc sử dụng block size lớn hơn (ví dụ: 1M, 4M) thường cho kết quả tốc độ nhanh hơn vì giảm số lượng thao tác I/O.count=blocks: Số lượng khối dữ liệu cần sao chép. Tổng kích thước dữ liệu sẽ làbs * count.oflag=direct: Bỏ qua bộ đệm cache của hệ điều hành. Điều này rất quan trọng khi kiểm tra hiệu suất thực tế của ổ đĩa, vì nó ngăn dữ liệu bị lưu trữ tạm thời trong RAM.status=progress: Hiển thị tiến độ sao chép trong quá trình thực hiện lệnh, hữu ích cho các tác vụ kéo dài.
3. Các trường hợp sử dụng phổ biến của dd
Ngoài việc kiểm tra tốc độ, dd còn được dùng cho nhiều tác vụ quan trọng khác:
Sao lưu và khôi phục ổ đĩa hoặc phân vùng
- Sao lưu toàn bộ ổ đĩa
/dev/sdbsang một tệp ảnh:sudo dd if=/dev/sdb of=/duong/dan/backup/disk_sdb_full.img bs=4M status=progress - Khôi phục tệp ảnh vào ổ đĩa
/dev/sdb(thận trọng, thao tác này sẽ ghi đè toàn bộ dữ liệu hiện có):sudo dd if=/duong/dan/backup/disk_sdb_full.img of=/dev/sdb bs=4M status=progress
Xóa an toàn dữ liệu trên ổ đĩa
Để xóa dữ liệu một cách an toàn, bạn có thể ghi đè toàn bộ ổ đĩa bằng dữ liệu ngẫu nhiên từ /dev/urandom hoặc các byte rỗng từ /dev/zero.
- Sử dụng dữ liệu ngẫu nhiên (chậm nhưng an toàn hơn):
sudo dd if=/dev/urandom of=/dev/sdc bs=4K status=progress - Sử dụng byte rỗng (nhanh hơn, thích hợp cho việc xóa nhanh trước khi format):
sudo dd if=/dev/zero of=/dev/sdc bs=4K status=progress
4. Kiểm tra hiệu suất đọc/ghi ổ đĩa
Để đánh giá tốc độ thực tế của ổ đĩa, chúng ta sẽ sử dụng dd kết hợp với lệnh time để đo thời gian thực hiện.
Kiểm tra tốc độ ghi (Write Speed Test)
Chúng ta sẽ ghi một lượng lớn dữ liệu từ /dev/zero (nguồn cung cấp các byte rỗng, rất nhanh) vào một tệp trên ổ đĩa cần kiểm tra. Việc sử dụng oflag=direct sẽ đảm bảo dữ liệu được ghi trực tiếp xuống đĩa mà không qua bộ đệm của hệ điều hành, cho kết quả chính xác hơn về hiệu suất thực tế.
# Ghi 4GB dữ liệu (1M * 4096) vào tệp test_write.bin
# Đảm bảo bạn có đủ không gian trống trên thư mục /tmp hoặc một vị trí khác
time sudo dd if=/dev/zero of=/tmp/test_write.bin bs=1M count=4096 oflag=direct status=progress
Sau khi lệnh hoàn tất, kết quả sẽ hiển thị thời gian thực và tốc độ ghi trung bình:
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 12.3456 s, 347.9 MB/s
real 0m12.345s
user 0m0.001s
sys 0m1.123s
Trong ví dụ trên, tốc độ ghi trung bình là 347.9 MB/s.
Kiểm tra tốc độ đọc (Read Speed Test)
Để kiểm tra tốc độ đọc, chúng ta sẽ đọc tệp vừa tạo và chuyển hướng đầu ra đến /dev/null (một thiết bị ảo không ghi dữ liệu, rất nhanh). Điều này giúp đo tốc độ đọc của đĩa mà không bị ảnh hưởng bởi tốc độ ghi của đích đến.
# Đọc tệp test_write.bin và chuyển hướng ra /dev/null
time sudo dd if=/tmp/test_write.bin of=/dev/null bs=1M status=progress
Kết quả sẽ cho thấy tốc độ đọc trung bình:
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 8.7654 s, 490.0 MB/s
real 0m8.765s
user 0m0.001s
sys 0m0.876s
Trong ví dụ này, tốc độ đọc trung bình là 490.0 MB/s.
5. Làm mới và khôi phục khu vực ổ đĩa
Trong một số trường hợp, đặc biệt với các ổ đĩa cũ hoặc ổ đĩa đã lâu không sử dụng, các sector trên bề mặt đĩa có thể gặp vấn đề về từ tính hoặc phát sinh lỗi đọc. Lệnh dd có thể được sử dụng để "làm mới" các sector này hoặc kích hoạt cơ chế ánh xạ lại các sector lỗi của firmware ổ đĩa.
Bằng cách đọc và ghi lại dữ liệu trên cùng một ổ đĩa (if=/dev/sdX of=/dev/sdX), ổ đĩa sẽ cố gắng đọc từng sector và sau đó ghi lại nó. Quá trình này có thể giúp:
- Làm mới trạng thái từ tính của các sector.
- Kích hoạt firmware ổ đĩa ánh xạ lại các sector bị lỗi sang các sector dự phòng.
# Thay /dev/sdX bằng tên ổ đĩa bạn muốn làm mới (ví dụ: /dev/sda, /dev/sdb)
# Cảnh báo: Việc này có thể mất rất nhiều thời gian và cần được thực hiện cẩn thận.
# conv=sync,noerror giúp bỏ qua lỗi đọc và đồng bộ hóa dữ liệu.
sudo dd if=/dev/sdX of=/dev/sdX bs=4K conv=sync,noerror status=progress
Thao tác này tương đối an toàn vì nó không ghi dữ liệu mới mà chỉ đọc và ghi lại dữ liệu hiện có. Tuy nhiên, nếu ổ đĩa đang có dấu hiệu hỏng hóc nghiêm trọng, bạn nên sao lưu dữ liệu quan trọng trước khi thực hiện.