Cách quản lý mức độ ưu tiên của tiến trình I/O trong Linux

Bạn đã từng sao chép hoặc di chuyển hàng chục hoặc hàng trăm gigabyte dữ liệu chưa? Nếu đã thực hiện việc này, bạn chắc chắn nhận thấy rằng hệ thống trở nên ít đáp ứng hơn trong thời gian đó. Trên Linux, bạn có thể tránh điều này với sự trợ giúp của lệnh ionice.

Mức ưu tiên I/O là gì?

I/O là 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 trong trường hợp này, đó là các thiết bị lưu trữ.

Mỗi tiến trình muốn đọc hoặc ghi dữ liệu vào một thiết bị như vậy được chỉ định một scheduling class và số ưu tiên (hay giá trị “nice”). Điều này áp dụng trên Linux đối với các hệ thống file như ext4. Các hệ thống file khác, chẳng hạn như ZFS, có thể thực hiện các phương pháp hơi khác nhau để lên lịch cho các hoạt động đọc/ghi trên ổ đĩa. Ngoài ra, trình lập lịch CFQ nên được kích hoạt để làm việc này. Bạn có thể kiểm tra với:

cat /sys/block/*/queue/scheduler

Một tiến trình với giá trị “nice” cao có mức độ ưu tiên thấp hơn.

Mứ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 giới hạn mà nó có thể thực hiện mỗi giây (IOPS). Vì vậy, khi hai tiến trình muốn đọc/ghi cùng một lúc, mỗi tiến trình sẽ nhận được một phần IOPS. Nếu chúng có cùng mức độ ưu tiên, mỗi tiến trình sẽ nhận được khoảng 50% IOPS.

Mức ưu tiên I/O

Nhưng IOPS có vẻ trừu tượng và phức tạp. Để đơn giản, bạn chỉ cần nghĩ về kết quả cuối cùng: Tốc độ đọc/ghi. Giả sử ổ đĩa có thể ghi với tốc độ tối đa 100MB/s. Tiến trình A bắt đầu một thao tác ghi. Nó ghi vào ổ đĩa với tốc độ 100MB/s. Tiến trình B xuất hiện và muốn ghi vào cùng một ổ đĩa. Nó sẽ ghi với tốc độ khoảng 50MB/s, đồng thời đưa tốc độ ghi của tiến trình A về cùng giá trị, 50MB/s. Bây giờ, nếu bạn gán cho tiến trình B một giá trị nice I/O cao hơn, nó sẽ ghi với tốc độ 20MB/s và để cho tiến trình A ghi với tốc độ 80MB/s. Khi tiến trình A hoàn thành, tiến trình B sẽ bắt đầu ghi với tốc độ 100MB/s.

Ví dụ này rất hữu ích để hiểu điều gì đó có thể gây nhầm lẫn cho một số người. Nếu một tiến trình có mức độ ưu tiên rất thấp (giá trị nice cao), thì không có nghĩa là tiến trình đó sẽ ghi chậm mọi lúc. Nếu đó là tiến trình duy nhất sử 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 thoát ra và cho phép những tiến trình đó sử dụng nhiều băng thông ổ đĩa hơn. Đối với một hoạt động sao chép/ghi có thể mất hàng giờ để hoàn thành, việc gán cho nó một mức ưu tiên thấp là ý tưởng hay, nếu bạn muốn sử dụng máy tính của mình trong thời gian đó.

Cách sử 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 scheduling class ionice

Idle (class 3): Các tiến trình trong class (lớp) này chỉ đọc/ghi khi không có chương trình nào khác cần truy cập ổ đĩa. Điều này có nghĩa là quá trình đọc/ghi chỉ ở tốc độ tối đa khi nó không bị cạnh tranh. Khi một chương trình khác cần ổ đĩa, tiến trình trong class Idle sẽ chỉ đọc/ghi với bất kỳ tài nguyên nào còn lại. Từ 100MB/s, nó có thể tạm thời ghi với tốc độ 5MB/s, sau đó quay lại 100MB/s khi chương trình khác hoàn thành việc truy cập vào ổ đĩa. Đây là class hoàn hảo cho các công việc dài hạn mà bạn không muốn làm chậm hệ thống của mình. Không có mức ưu tiên nào cần phải chỉ định cho class này.

Lệnh ví dụ:

ionice -c 3 cp /home/user/largefile /Backups

Best-effort (class 2): Có mức ưu tiên/giá trị nice trong khoảng từ 0 đến 7. Hãy nhớ rằng, số thấp hơn có nghĩa là mức độ ưu tiên cao hơn. Hãy sử dụng class này khi bạn muốn tinh chỉnh thời gian truy cập ổ đĩa cho hai hoặc nhiều tiến trình.

Ví dụ, bạn muốn quá trình sao lưu của mình hoàn thành nhanh hơn và gán cho nó giá trị nice là 0. Đồng thời, bạn cũng đang chuyển 6 bộ phim sang ổ đĩa khác nhưng không vội, vậy hãy chỉ định giá trị nice cho tiến trình này là 7.

Lệnh ví dụ:

ionice -c 2 -n 0 backup_command

Best-effort (class 2)

Realtime (class 1): Chỉ nên sử dụng nếu việc tiến trình nên được ghi càng sớm càng tốt và không bị gián đoạn bởi bất kỳ chương trình nào khác rất quan trọng. Hầu hết người dùng sẽ không bao giờ cần điều này và nên tránh sử dụng, trừ trường hợp đặc biệt. Class này cũng hỗ trợ các giá trị nice trong khoảng từ 0 đến 7. Chỉ root mới có thể sử dụng class này. Điều đó có nghĩa là bạn sẽ phải thêm tiền tố sudo vào lệnh.

Lưu ý rằng một tiến trình trong class Realtime có mức độ ưu tiên 0 có thể ngăn cản các tiến trình tài nguyên khác. Về mặt thực tế, điều đó có nghĩa là chương trình khác có thể phải chờ vài phút hoặc thậm chí hàng giờ để hoàn thành việc ghi/đọc một vài megabyte dữ liệu. Hãy sử dụng class này cẩn thận, chỉ khi bạn chắc chắn mình cần đến nó. Nếu một tiến trình quan trọng trong class 2 hoặc 3 cần truy cập ổ đĩa, hệ thống của bạn có thể đóng băng cho đến khi tiến trình trong class Realtime được ghi xong.

Lệnh ví dụ:

sudo ionice -c 1 -n 7 bash

Những ví dụ ionice hữu ích

Trong ví dụ cuối cùng, thay vì chạy lệnh sao chép/di chuyển, shell đã được khởi chạy (Bash). Bây giờ, mỗi lệnh tiếp theo bạn nhập vào shell đó sẽ kế thừa scheduling class I/O và mức độ ưu tiên. Bạn cũng có thể làm điều này trên một giao diện đồ họa.

ionice -c 3 pcmanfm

Lệnh cuối cùng sẽ khởi chạy một file explorer trên môi trường desktop LXDE. Thay thế “pcmanfm” bằng tên của file explorer trong desktop cụ thể của bạn. Bây giờ, tất cả các hoạt động ổ đĩa bắt đầu ở đó sẽ được thực hiện với scheduling class I/O Idle.

Trong các tình huống khác, thao tác sao chép/di chuyển có thể đã hoạt động. Trong trường hợp này, bạn có thể sử dụng ionice theo một cách khác.

ionice -c 3 -p 4910

Điều này thay đổi class ư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 thấy PID (Process ID - ID tiến trình) với trình quản lý tác vụ của mình hoặc bằng một lệnh chẳng hạn như pgrep.

Những ví dụ ionice hữu ích

Lệnh ionice có thể hữu ích trên các desktop mà bạn không muốn bị lag trong khi sao chép/di chuyển các file lớn. Nhưng hãy nhớ rằng ionice cũng có thể hữu ích hơn nữa trên các máy chủ. Bạn chắc chắn không muốn một trang web mà mình host làm khách truy cập gặp phải hiện tượng lag, trong khi thực hiện sao lưu toàn bộ, đúng không?

Chúc bạn thực hiện thành công!

Thứ Ba, 10/09/2019 16:04
52 👨 66