Bạn có bao giờ copy hoặc di chuyển hàng chục hay hàng trăm gigabyte dữ liệu? Nếu có, bạn chắc chắn nhận ra hệ thống trở nên kém phản hồi hơn trong thời gian đó. Trên Linux bạn có thể tránh điều này nhờ lệnh ionice.
Độ ưu tiên I/O là gì?
I/O viết tắt của input/output (đầu vào/đầu ra). Có nhiều loại thiết bị I/O, nhưng ở đây nói về thiết bị lưu trữ.
Mỗi tiến trình muốn đọc hoặc ghi dữ liệu vào thiết bị như vậy được gán một lớp lập lịch (scheduling class) và số ưu tiên (hoặc giá trị "nice"). Điều này áp dụng trên Linux cho hệ thống file như ext4. Hệ thống file khác, như ZFS, có thể triển khai phương pháp lập lịch đọc/ghi trên đĩa hơi khác. Ngoài ra, bộ lập lịch CFQ nên được kích hoạt để việc này hoạt động. Bạn có thể kiểm tra bằng
cat /sys/block/*/queue/scheduler
Một tiến trình với giá trị "nice" cao có độ ưu tiên thấp. Logic đằng sau là: số càng cao, tiến trình càng "thiện cảm" (nice) với các tiến trình khác.
Độ ưu tiên I/O hoạt động như thế nào?
Một thiết bị lưu trữ rõ ràng có số lượng hoạt động I/O có thể thực hiện mỗi giây (IOPS) giới hạn. Vì vậy khi hai tiến trình muốn đọc/ghi cùng lúc, mỗi cái được phân chia IOPS. Nếu chúng có cùng độ ưu tiên, mỗi cái được khoảng 50% IOPS.

Nhưng IOPS có thể trừu tượng và phức tạp. Để đơn giản, bạn có thể chỉ nghĩ về kết quả cuối: tốc độ đọc/ghi. Giả sử đĩa của bạn ghi tối đa 100MB/s. Tiến trình A bắt đầu ghi. Nó ghi với 100MB/s. Tiến trình B đến và cũng muốn ghi vào cùng đĩa. Nó sẽ ghi khoảng 50MB/s, làm tốc độ ghi của tiến trình A giảm xuống cùng giá trị, 50MB/s. Bây giờ, nếu bạn gán cho tiến trình B giá trị nice I/O cao hơn, nó sẽ ghi 20MB/s và để tiến trình A ghi 80MB/s. Khi tiến trình A xong, tiến trình B sẽ bắt đầu ghi 100MB/s.
Ví dụ này hữu ích để hiểu điều có thể khiến một số người nhầm lẫn. Nếu một tiến trình có độ ưu tiên rất thấp (giá trị nice cao), không nghĩa là nó sẽ ghi chậm luôn. Nếu nó là tiến trình duy nhất dùng đĩa, nó sẽ đọc/ghi với tốc độ tối đa. Nhưng khi các tiến trình khác cần đĩa, nó sẽ tạm thời nhường chỗ và cho chúng dùng nhiều băng thông đĩa hơn. Đối với thao tác copy/ghi mất nhiều giờ, đây là ý tưởng tốt để cho nó ưu tiên thấp nếu bạn muốn dùng máy tính trong lúc đó.
Cách dùng lệnh ionice
Cú pháp chung của lệnh là:
ionice -c scheduling_class -n priority_nice_value command
Các lớp lập lịch ionice
Idle (lớp 3): Tiến trình trong lớp này chỉ đọc/ghi khi không chương trình nào khác cần truy cập đĩa. Nghĩa là tiến trình đọc/ghi tốc độ tối đa khi không có cạnh tranh. Khi chương trình khác cần thời gian đĩa, tiến trình ở lớp idle sẽ chỉ đọc/ghi với tài nguyên còn lại. Từ 100MB/s nó có thể tạm thời ghi 5MB/s, rồi quay lại 100MB/s khi chương trình kia xong truy cập đĩa. Đây là lớp hoàn hảo cho công việc chạy lâu mà bạn không muốn làm chậm hệ thống. Không cần chỉ định độ ưu tiên cho lớp này.
Ví dụ lệnh:
ionice -c 3 cp /home/user/largefile /Backups
Best-effort (lớp 2): Chấp nhận giá trị ưu tiên/nice từ 0 đến 7. Nhớ là số càng thấp nghĩa là ưu tiên càng cao. Dùng lớp này khi bạn muốn tinh chỉnh thời gian đĩa cho hai hoặc nhiều tiến trình.
Ví dụ, bạn muốn backup kết thúc nhanh hơn và gán giá trị nice 0. Bạn cũng di chuyển sáu phim sang đĩa khác nhưng không gấp, nên gán giá trị nice 7.
Ví dụ lệnh:
ionice -c 2 -n 0 backup_command

Realtime (lớp 1): Chỉ dùng khi thật sự cần thiết tiến trình ghi càng sớm càng tốt, không bị gián đoạn bởi chương trình khác. Hầu hết người dùng sẽ không bao giờ cần và nên tránh, trừ trường hợp đặc biệt. Cũng hỗ trợ giá trị nice 0-7. Chỉ root mới dùng được lớp này, nghĩa là bạn sẽ thêm sudo trước lệnh. Lưu ý tiến trình ở lớp realtime với ưu tiên 0 có thể làm các tiến trình khác đói tài nguyên. Về mặt thực tế, nghĩa là chương trình khác có thể phải chờ phút thậm chí giờ để đọc/ghi vài megabyte. Dùng cẩn thận, chỉ khi bạn chắc chắn cần. Nếu tiến trình quan trọng ở lớp 2 hoặc 3 cần truy cập đĩa, hệ thống có thể đóng băng cho đến khi tiến trình realtime xong ghi.
Ví dụ lệnh:
sudo ionice -c 1 -n 7 bash
Các ví dụ ionice hữu ích
Trong ví dụ cuối, thay vì chạy lệnh copy/di chuyển, một shell đã được khởi chạy (Bash). Bây giờ mọi lệnh tiếp theo bạn gõ trong shell đó sẽ kế thừa lớp lập lịch I/O và độ ưu tiên. Bạn cũng có thể làm trên giao diện đồ họa.
ionice -c 3 pcmanfm
Lệnh cuối sẽ khởi chạy trình quản lý file trên môi trường LXDE. Thay "pcmanfm" bằng tên trình quản lý file của desktop cụ thể. Bây giờ mọi thao tác đĩa bạn bắt đầu ở đó sẽ thực hiện với lớp lập lịch I/O idle.
Trong tình huống khác, thao tác copy/di chuyển có thể đã đang hoạt động. Trong trường hợp này bạn có thể dùng ionice theo cách khác.
ionice -c 3 -p 4910
Điều này thay đổi lớp ưu tiên của chương trình đang chạy với ID tiến trình 4910. Bạn có thể tìm PID (process ID) với trình quản lý tác vụ hoặc lệnh như pgrep.

Kết luận
ionice có thể hữu ích trên desktop bạn không muốn bị lag khi copy/di chuyển file lớn. Nhưng hãy nhớ điều này có thể thậm chí hữu ích hơn trên server. Bạn chắc chắn không muốn website bạn host đó bị lag cho khách truy cập khi bạn làm backup đầy đủ.