Bagaimana cara mengaktifkan dan menggunakan penjadwal BFQ?

16

Saya baru saja menginstal kernel Linux versi 4.12 pada Ubuntu 17.04 menggunakan ukuu (Utilitas Pembaruan Kernel Ubuntu https://doc.ubuntu-fr.org/ubuntu_kernel_upgrade_utility ).

Masalahnya adalah, ketika saya memeriksa penjadwal I / O yang tersedia, saya tidak bisa menemukan BFQ atau penjadwal I / O Kyber:

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

Jadi bagaimana cara menggunakan salah satu penjadwal baru di versi Linux ini?

Sidahmed
sumber

Jawaban:

22

Saya tidak di Ubuntu, tetapi apa yang saya lakukan di Fedora dapat membantu Anda.

BFQ adalah scheduler blk-mq (Multi-Queue Block IO Queuing Mechanism), jadi Anda perlu mengaktifkan blk-mq saat boot, edit file / etc / default / grub Anda dan tambahkan scsi_mod.use_blk_mq=1ke file GRUB_CMDLINE_LINUXini, ini file grub saya, karena sebuah contoh:

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"

Setelah itu, Anda harus memperbarui grub Anda. Pada Fedora kita harus menggunakan sudo grub2-mkconfig -o /path/to/grub.cfg, yang bervariasi tergantung pada metode boot . Di Ubuntu, Anda cukup menjalankan:

sudo update-grub

Reboot, dan jika Anda mendapatkan ini:

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

Mungkin kernel Anda dikompilasi dengan BFQ sebagai modul , dan ini juga berlaku untuk Kyber.

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

Anda dapat menambahkannya saat boot dengan menambahkan /etc/modules-load.d/bfq.conffile yang berisi bfq.

Penting untuk dicatat bahwa mengaktifkan blk_mq mengubahnya menjadi mustahil untuk menggunakan penjadwal non blk_mq, sehingga Anda akan kehilangan noop cfq dan batas waktu non mq

Rupanya sistem penjadwalan blk_mq tidak mendukung flag elevator di grub, aturan udev dapat digunakan sebagai gantinya, dengan bonus menawarkan kontrol yang lebih berbutir.

Buat /etc/udev/rules.d/60-scheduler.rulesjika tidak ada dan tambahkan:

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

Seperti yang ditunjukkan di sini jika diperlukan, Anda dapat membedakan antara perangkat rotasi (HDD) dan non-rotasi (SSD) dalam aturan udev menggunakan atribut ATTR{queue/rotational}. Ketahuilah bahwa Paolo Valente, pengembang BFQ, menunjuk di LinuxCon Eropa bahwa BFQ bisa menjadi pilihan yang lebih baik daripada penjadwal noopatau deadlinedalam hal jaminan latensi rendah, apa yang membuat saran yang baik untuk menggunakannya untuk SSD juga.

Perbandingan Paolo: https://www.youtube.com/watch?v=1cjZeaCXIyM&feature=youtu.be

Simpan, dan muat ulang dan picu udev rules:

sudo udevadm control --reload
sudo udevadm trigger
RomuloPBenedetti
sumber
3
Saya hanya ingin mencatat: jangan lakukan ini pada komputer dengan Linux <4.15 yang Anda harapkan dapat diskors-to-ram; <4.15 akan menggantung semua IO pada resume karena mereka tidak memiliki perbaikan "aman SCSI quiescing".
Ivan Kozik
Anda mungkin juga memiliki masalah pada kernel 4.14 di mana mengaktifkan blk-mq tampaknya memberikan kernel "oops" tepat di awal memuat kernel pada beberapa sistem (itu bukan kepanikan henti penuh, hanya null dereference di dalam kernel). Anda mungkin melewatkannya jika Anda tidak mencarinya tetapi jika Anda paranoid itu bisa menjadi pertanda bahwa ada sesuatu yang rusak.
CR.
1
Saya sarankan menggunakan aturan udev yang sedikit lebih akurat. Ketika saya mencoba yang ditunjukkan di sini, udev mencoba mengatur penjadwal untuk beberapa perangkat yang namanya cocok dengan pola itu, tetapi bukan perangkat blok SCSI yang dapat menggunakan penjadwal BFQ. Aturan yang saya akhiri adalah: ACTION=="add|change", SUBSYSTEM=="block", DRIVERS=="sd|sr", ATTR{queue/scheduler}!="bfq", ATTR{queue/scheduler}="bfq"Ini menghindari pencocokan pola dengan nama perangkat, yang membuat pencocokan lebih akurat. Itu tidak akan cocok dengan perangkat partisi karena mereka tidak memiliki atribut "antrian / penjadwal".
Dan Moulding
3
Juga penting untuk dicatat adalah bahwa kernel 4.15-4.16 menderita bug yang cukup parah di mana memperbarui skema partisi drive saat menggunakan BFQ dapat menyebabkan penguncian I / O yang lengkap. Cf .: lkml.org/lkml/2017/12/1/80
Glutanimate
1

Untuk memperpanjang jawaban RomuloPBenedetti yang luar biasa :

Anda dapat menguji, apakah penjadwal bfq sebenarnya tersedia di perangkat tertentu dengan menggunakan PROGRAM=="/bin/grep -E -q '(^|[[:space:]])bfq($|[[:space:]])' '$sys$devpath/queue/scheduler'"aturan udev. Ini akan secara efektif menggantikan DRIVERS=="sd|sr"dan tidak memecat jika ada yang lupascsi_mod.use_blk_mq=1

Hal sepele:

  • PROGRAM- Menjalankan program untuk menentukan apakah ada kecocokan; kuncinya adalah benar jika program berhasil kembali; Jika tidak ada path absolut yang diberikan, program diharapkan untuk hidup di / lib / udev.
  • $sys- Titik pemasangan sysfs ( /sys).
  • $devpath - Devpath perangkat (/ devices / pci / ...).
Arano-kai
sumber