Làm thế nào để kích hoạt và sử dụng bộ lập lịch BFQ?


16

Tôi chỉ cần cài đặt Linux kernel phiên bản 4.12 trên Ubuntu 17.04 sử dụng ukuu (Ubuntu Kernel Update Utility https://doc.ubuntu-fr.org/ubuntu_kernel_upgrade_utility ).

Vấn đề là, khi tôi kiểm tra các bộ lập lịch I / O có sẵn, tôi dường như không thể tìm thấy BFQ cũng như bộ lập lịch Kyber I / O:

cat /sys/class/block/sda/queue/scheduler
> noop deadline [cfq]

Vậy làm thế nào để sử dụng một trong những bộ lập lịch mới trong phiên bản Linux này?

Câu trả lời:


22

Tôi không ở Ubuntu, nhưng những gì tôi đã làm ở Fedora có thể giúp bạn.

BFQ là một trình lập lịch blk-mq (Cơ chế xếp hàng IO Khối đa hàng đợi), vì vậy bạn cần bật blk-mq khi khởi động, chỉnh sửa tệp / etc / default / grub scsi_mod.use_blk_mq=1của bạn và thêm vào GRUB_CMDLINE_LINUX, đây là tệp grub của tôi, như một ví dụ:

GRUB_TIMEOUT=3
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=false
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="quiet vt.global_cursor_default=0 scsi_mod.use_blk_mq=1"
GRUB_DISABLE_RECOVERY="true"

Sau đó, bạn phải cập nhật grub của bạn. Trên Fedora, chúng tôi phải sử dụng sudo grub2-mkconfig -o /path/to/grub.cfg, tùy thuộc vào phương thức khởi động . Trên Ubuntu, bạn chỉ cần chạy:

sudo update-grub

Khởi động lại và nếu bạn nhận được điều này:

cat /sys/block/sda/queue/scheduler
[mq-deadline] none

Có lẽ kernel của bạn đã được biên dịch với BFQ dưới dạng một mô-đun và đây cũng có thể là trường hợp của Kyber.

sudo modprobe bfq
sudo cat /sys/block/sda/queue/scheduler
[mq-deadline] bfq none

Bạn có thể thêm nó vào lúc khởi động bằng cách thêm một /etc/modules-load.d/bfq.conftệp chứa bfq.

Điều quan trọng cần lưu ý là việc bật blk_mq không thể sử dụng bộ lập lịch không blk_mq, vì vậy bạn sẽ mất noop cfq và thời hạn không mq

Rõ ràng hệ thống lập lịch blk_mq không hỗ trợ cờ thang máy trong grub, các quy tắc udev có thể được sử dụng thay thế, với phần thưởng là cung cấp một điều khiển chi tiết hơn.

Tạo /etc/udev/rules.d/60-scheduler.rulesnếu nó không tồn tại và thêm:

ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/scheduler}="bfq"

Như được chỉ ra ở đây nếu cần, bạn có thể phân biệt giữa các thiết bị quay (HDD) và không quay (SSD) trong các quy tắc udev bằng cách sử dụng thuộc tính ATTR{queue/rotational}. Hãy nhận biết rằng Paolo Valente, nhà phát triển BFQ, chỉ trong LinuxCon châu Âu rằng BFQ có thể là một lựa chọn tốt hơn so với noophoặc deadlineschedulers về guaranties độ trễ thấp, những gì làm cho một lời khuyên tốt để sử dụng nó cho ổ SSD quá.

So sánh của Paolo: https://www.youtube.com/watch?v=1cjZeaCXIyM&feature=youtu.be

Lưu nó, và tải lại và kích hoạt udev rules:

sudo udevadm control --reload
sudo udevadm trigger

3
Tôi chỉ muốn lưu ý: không làm điều này trên các máy tính có Linux <4.15 mà bạn mong đợi có thể tạm ngưng ram; <4.15 sẽ treo tất cả IO trong sơ yếu lý lịch vì chúng thiếu các bản sửa lỗi "cách ly SCSI an toàn".
Ivan Kozik

Bạn cũng có thể gặp sự cố trên kernel 4.14 khi cho phép blk-mq dường như cung cấp kernel "oops" ngay khi bắt đầu tải kernel trên một số hệ thống (nó không phải là sự hoảng loạn hoàn toàn, chỉ là sự vô hiệu trong null kernel). Bạn có thể bỏ lỡ nó nếu bạn không tìm kiếm nó nhưng nếu bạn bị hoang tưởng thì đó có thể là dấu hiệu cho thấy có gì đó bị hỏng.
CR.

1
Tôi đề nghị sử dụng quy tắc udev chính xác hơn một chút. Khi tôi thử cái được hiển thị ở đây, udev đã cố gắng đặt bộ lập lịch cho một số thiết bị có tên khớp với mẫu đó, nhưng không phải là thiết bị chặn SCSI có thể sử dụng bộ lập lịch BFQ. Quy tắc tôi đã kết thúc là: ACTION=="add|change", SUBSYSTEM=="block", DRIVERS=="sd|sr", ATTR{queue/scheduler}!="bfq", ATTR{queue/scheduler}="bfq"Nó tránh khớp mẫu với tên của các thiết bị, giúp cho việc khớp chính xác hơn. Nó sẽ không khớp với các thiết bị phân vùng vì chúng không có thuộc tính "queue / calendaruler".
Dan

3
Ngoài ra, điều quan trọng cần lưu ý là các hạt 4.15-4.16 bị lỗi khá nghiêm trọng khi cập nhật sơ đồ phân vùng của ổ đĩa trong khi sử dụng BFQ có thể dẫn đến khóa I / O hoàn chỉnh. Cf.: Lkml.org/lkml/2017/12/1/80
Glutimate

1

Để mở rộng câu trả lời tuyệt vời của RomuloPBenedetti :

Bạn có thể kiểm tra, nếu bộ lập lịch bfq thực sự có sẵn trên thiết bị cụ thể bằng cách sử dụng PROGRAM=="/bin/grep -E -q '(^|[[:space:]])bfq($|[[:space:]])' '$sys$devpath/queue/scheduler'"quy tắc udev. Điều này sẽ có hiệu quả thay thế DRIVERS=="sd|sr"và chỉ không bắn nếu quênscsi_mod.use_blk_mq=1

Câu đố:

  • PROGRAM- Thực hiện một chương trình để xác định xem có khớp không; chìa khóa là đúng nếu chương trình trở lại thành công; Nếu không có đường dẫn tuyệt đối nào được đưa ra, chương trình dự kiến ​​sẽ tồn tại trong / lib / udev.
  • $sys- Điểm gắn kết sysfs ( /sys).
  • $devpath - Độ lệch của thiết bị (/ thiết bị / pci / ...).
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.