Đã bao giờ sao chép hoặc di chuyển hàng chục hoặc hàng trăm gigabyte dữ liệu? Nếu bạn đã làm vậy, bạn chắc chắn nhận thấy rằng hệ thống trở nên kém phản hồi hơn nhiều 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 ionice
lệnh.
Mức độ ưu tiên I / O là gì?
I / O là viết tắt của input / output. Có nhiều loại thiết bị I / O, nhưng trong trường hợp này là về 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 gán một lớp lập lịch và số ưu tiên (hoặc giá trị “đẹp”). Điều này áp dụng trên Linux cho các hệ thống tệp như ext4. Các hệ thống tệp khác, chẳng hạn như ZFS, có thể triển khai các phương pháp hơi khác để lập lịch hoạt động đọc / ghi trên đĩa. Ngoài ra, bộ lập lịch CFQ phải được kích hoạt để nó hoạt động. Bạn có thể kiểm tra với
cat /sys/block/*/queue/scheduler
Quy trình có giá trị “tốt đẹp” cao có mức độ ưu tiên thấp hơn. Logic đằng sau điều này là con số càng cao thì quy trình càng "tốt" đối với các quy trình khác.
Mức độ ưu tiên của I / O hoạt động như thế nào?
Một thiết bị lưu trữ rõ ràng có một số 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, chúng sẽ nhận được một phần IOPS. Nếu chúng có cùng mức độ ưu tiên, chúng sẽ nhận được khoảng 50% IOPS mỗi bên.
Nhưng IOPS có vẻ trừu tượng và phức tạp. Vì đơn giản, bạn có thể nghĩ về kết quả cuối cùng:tốc độ đọc / ghi. Giả sử đĩa của bạn có thể ghi tối đa 100MB / s. Quy trình A bắt đầu thao tác ghi. Nó ghi vào đĩa với 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 khoảng 50MB / s, đưa tốc độ ghi của tiến trình A về cùng một giá trị, 50MB / s. Bây giờ, nếu bạn gán giá trị I / O tốt hơn cho quá trình B, nó sẽ ghi với 20MB / s và để cho quá trình A ghi với 80MB / s. Khi quá trình A hoàn tất, quá trình B sẽ bắt đầu ghi với 100MB / s.
Ví dụ này rất hữu ích để hiểu điều gì đó có thể khiến một số người nhầm lẫn. Nếu một quy trình có mức độ ưu tiên rất thấp (giá trị tốt cao), điều đó không có nghĩa là nó sẽ luôn viết chậm. Nếu đó là quá 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à để chúng sử dụng nhiều băng thông đĩa hơn. Đối với thao tác sao chép / ghi sẽ mất hàng giờ để hoàn thành, bạn nên đặt mức độ ưu tiên thấp 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 ionice Command
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
Không hoạt động (lớp 3):Các tiến trình trong lớp này chỉ đọc / ghi khi không có chương trình nào khác cần quyền truy cập đĩa. Điều này có nghĩa là quá trình đọc / ghi ở tốc độ tối đa khi nó không có sự cạnh tranh. Khi một chương trình khác cần thời gian đĩa, tiến trình trong lớp nhàn rỗi 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 5MB / s, sau đó quay trở lại 100MB / s khi chương trình khác truy cập xong vào đĩa. Đây là lớp hoàn hảo cho các công việc kéo dài 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 chỉ định cho lớp này.
Lệnh ví dụ:
ionice -c 3 cp /home/user/largefile /Backups
Nỗ lực tốt nhất (lớp 2):Có giá trị ưu tiên / đẹp 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. Sử dụng lớp này khi bạn muốn tinh chỉnh thời gian đĩa cho hai hoặc nhiều quá trình.
Ví dụ:bạn muốn quá trình sao lưu của mình hoàn tất nhanh hơn và gán giá trị đẹp cho nó là 0. Bạn cũng đang chuyển sáu bộ phim sang một đĩa khác nhưng không vội, vì vậy bạn chỉ định giá trị này là 7.
Lệnh ví dụ:
ionice -c 2 -n 0 backup_command
Thời gian thực (lớp 1):Chỉ nên được sử dụng nếu điều quan trọng là quy trình phải viết càng sớm càng tốt, không bị gián đoạn bởi bất kỳ chương trình nào khác. Hầu hết người dùng sẽ không bao giờ cần đến điều này và nên tránh điều này, trừ những trường hợp đặc biệt. Cũng hỗ trợ các giá trị đẹp từ 0 đến 7. Chỉ root mới có thể sử dụng lớp này, có nghĩa là bạn có thể sẽ đặt tiền tố lệnh bằng sudo. Lưu ý rằng một tiến trình trong lớp thời gian thực với mức độ ưu tiên 0 có thể bỏ đói các tiến trình khác về tài nguyên. Về mặt thực tế, điều đó có nghĩa là một chương trình khác có thể phải đợi 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. Sử dụng cẩn thận, chỉ khi bạn chắc chắn rằng bạn cần điều này. Nếu một quá trình quan trọng trong lớp 2 hoặc 3 cần quyền truy cập đĩa, hệ thống của bạn có thể bị đóng băng cho đến khi quá trình thời gian thực được ghi xong.
Lệnh ví dụ:
sudo ionice -c 1 -n 7 bash
Các ví dụ hữu ích về ionice
Trong ví dụ cuối cùng, thay vì chạy lệnh sao chép / di chuyển, một trình bao đã được khởi chạy (Bash). Bây giờ mọi lệnh tiếp theo bạn nhập vào trình bao đó sẽ kế thừa lớp lập lịch I / O và mức độ ưu tiên. Bạn cũng có thể thực hiện việc này trên giao diện đồ họa.
ionice -c 3 pcmanfm
Lệnh cuối cùng sẽ khởi chạy trình khám phá tệp trên môi trường máy tính để bàn LXDE. Thay thế “pcmanfm” bằng tên của trình khám phá tệp của màn hình cụ thể của bạn. Bây giờ tất cả các hoạt động trên đĩa mà bạn bắt đầu ở đó sẽ được thực hiện với lớp lập lịch I / O nhàn rỗi.
Trong các tình huống khác, thao tác sao chép / di chuyển có thể đã được kích hoạt. 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 lớp ưu tiên của chương trình đang chạy với id quy trình 4910. Bạn có thể tìm PID (ID quy trình) bằng trình quản lý tác vụ của mình hoặc bằng một lệnh như pgrep
.
Kết luận
ionice có thể hữu ích trên máy tính để bàn mà bạn không muốn bị trễ khi sao chép / di chuyển các tệp lớn. Nhưng hãy nhớ rằng điều này cũng có thể hữu ích hơn trên các máy chủ. Bạn chắc chắn không muốn một trang web mà bạn có thể lưu trữ ở đó bị tụt hậu đối với khách truy cập trong khi bạn thực hiện sao lưu đầy đủ.