วิธีการเปิดใช้งานและใช้ตัวกำหนดตารางเวลาของ BFQ


16

ฉันเพิ่งติดตั้ง Linux เคอร์เนลเวอร์ชัน 4.12 บน Ubuntu 17.04 โดยใช้ ukuu (ยูทิลิตี้เคอร์เนล Ubuntu Kernel Update https://doc.ubuntu-fr.org/ubuntu_kernel_upgrade_utility )

สิ่งนี้คือเมื่อฉันตรวจสอบ I / O schedulers ที่มีอยู่ฉันไม่สามารถหา BFQ หรือ Kyber I / O scheduler ได้:

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

ดังนั้นวิธีการใช้หนึ่งใน schedulers ใหม่ในรุ่น Linux นี้?

คำตอบ:


22

ฉันไม่ได้อยู่ใน Ubuntu แต่สิ่งที่ฉันทำใน Fedora อาจช่วยคุณได้

BFQ เป็นตัวกำหนดตารางเวลา blk-mq (Multi-Queue Block IO Queing Mechanism) ดังนั้นคุณต้องเปิดใช้ blk-mq ตอนบูตเครื่องแก้ไขไฟล์ / etc / default / grub scsi_mod.use_blk_mq=1ของคุณและเพิ่มของคุณGRUB_CMDLINE_LINUXนี่คือไฟล์ด้วงของฉัน ตัวอย่าง:

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"

หลังจากนั้นคุณต้องอัพเดตด้วงของคุณ บน Fedora เราจะต้องใช้sudo grub2-mkconfig -o /path/to/grub.cfgซึ่งแตกต่างกันไปขึ้นอยู่กับวิธีการบูต บน Ubuntu คุณสามารถเรียกใช้:

sudo update-grub

รีบูทและถ้าคุณได้รับสิ่งนี้:

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

เคอร์เนลของคุณอาจถูกคอมไพล์ด้วยBFQ เป็นโมดูลและนี่อาจเป็นกรณีสำหรับ Kyber

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

คุณสามารถเพิ่มได้ในเวลาบูตโดยการเพิ่มไฟล์ที่มี/etc/modules-load.d/bfq.confbfq

เป็นสิ่งสำคัญที่จะต้องทราบว่าการเปิดใช้งาน blk_mq ทำให้ไม่สามารถใช้ตัวกำหนดเวลาที่ไม่ใช่ blk_mq ดังนั้นคุณจะสูญเสีย noop cfq และกำหนดเวลาที่ไม่ใช่ mq

เห็นได้ชัดว่า blk_mq ระบบการตั้งเวลาไม่รองรับการใช้ธงลิฟต์ในด้วงกฎ udev สามารถใช้แทนได้พร้อมโบนัสในการเสนอการควบคุมที่ละเอียดยิ่งขึ้น

สร้าง/etc/udev/rules.d/60-scheduler.rulesถ้าไม่มีอยู่และเพิ่ม:

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

เป็นแหลมที่นี่ถ้าจำเป็นคุณสามารถแยกแยะความแตกต่างระหว่างการหมุน (HDDs) และไม่ใช่การหมุน (SSDs) อุปกรณ์ใน udev ATTR{queue/rotational}กฎการใช้แอตทริบิวต์ โปรดทราบว่า Paolo Valente ผู้พัฒนา BFQ ชี้ไปที่ LinuxCon Europe ว่า BFQ สามารถเป็นทางเลือกที่ดีกว่าnoopหรือdeadlineschedulers ในแง่ของการรับประกันความล่าช้าน้อยสิ่งที่ทำให้คำแนะนำที่ดีในการใช้สำหรับ SSD ด้วยเช่นกัน

การเปรียบเทียบของเปาโล: https://www.youtube.com/watch?v=1cjZeaCXIyM&feature=youtu.be

บันทึกและรีโหลดและทริกเกอร์udev rules:

sudo udevadm control --reload
sudo udevadm trigger

3
ฉันแค่ต้องการทราบว่า: อย่าทำสิ่งนี้บนคอมพิวเตอร์ที่มี Linux <4.15 ที่คุณคาดหวังว่าจะสามารถระงับการใช้งานได้ <4.15 จะหยุด IO ทั้งหมดในการทำงานต่อเนื่องจากไม่มีการแก้ไข "safe SCSI quiescing"
Ivan Kozik

คุณอาจมีปัญหาเกี่ยวกับเคอร์เนล 4.14 ซึ่งการเปิดใช้งาน blk-mq ดูเหมือนว่าจะให้เคอร์เนล "โอ๊ะ" ในตอนเริ่มต้นของการโหลดเคอร์เนลในบางระบบ (ไม่ใช่การหยุดเต็มตื่นตระหนก คุณอาจพลาดถ้าคุณไม่ได้มองหามัน แต่ถ้าคุณหวาดระแวงอาจเป็นสัญญาณว่ามีบางอย่างเสีย
ซีอาร์

1
ฉันขอแนะนำให้ใช้กฎ udev ที่แม่นยำยิ่งขึ้นเล็กน้อย เมื่อฉันลองแสดงที่นี่ udev พยายามตั้งตัวกำหนดตารางเวลาสำหรับอุปกรณ์บางอย่างที่มีชื่อตรงกับรูปแบบนั้น แต่ไม่ใช่อุปกรณ์บล็อก SCSI ที่สามารถใช้ตัวกำหนดตารางเวลาของ BFQ ได้ กฎที่ฉันได้รับคือ: ACTION=="add|change", SUBSYSTEM=="block", DRIVERS=="sd|sr", ATTR{queue/scheduler}!="bfq", ATTR{queue/scheduler}="bfq"หลีกเลี่ยงการจับคู่รูปแบบกับชื่อของอุปกรณ์ซึ่งทำให้การจับคู่แม่นยำยิ่งขึ้น มันจะไม่ตรงกับอุปกรณ์พาร์ทิชันเพราะพวกเขาไม่มีแอตทริบิวต์ "คิว / กำหนดการ"
Dan Moulding

3
สิ่งสำคัญที่ควรทราบคือเมล็ด 4.15-4.16 ประสบปัญหาข้อบกพร่องที่ค่อนข้างรุนแรงซึ่งการอัพเดตชุดรูปแบบพาร์ติชันของไดรฟ์ในขณะที่ใช้ BFQ สามารถนำไปสู่การล็อค I / O ที่สมบูรณ์ Cf .: lkml.org/lkml/2017/12/1/80
Glutanimate

1

หากต้องการขยายคำตอบ RomuloPBenedettiที่ยอดเยี่ยม:

คุณสามารถทดสอบว่า bfq scheduler พร้อมใช้งานบนอุปกรณ์เฉพาะหรือไม่โดยใช้PROGRAM=="/bin/grep -E -q '(^|[[:space:]])bfq($|[[:space:]])' '$sys$devpath/queue/scheduler'"ใน udev rule สิ่งนี้จะแทนที่อย่างมีประสิทธิภาพDRIVERS=="sd|sr"และไม่ยิงหากใครลืมscsi_mod.use_blk_mq=1

Trivia:

  • PROGRAM- ดำเนินการโปรแกรมเพื่อตรวจสอบว่ามีการแข่งขัน; คีย์เป็นจริงถ้าโปรแกรมส่งคืนสำเร็จ หากไม่ได้กำหนดพา ธ สัมบูรณ์โปรแกรมคาดว่าจะอยู่ใน / lib / udev
  • $sys- จุดเมานต์ sysfs ( /sys)
  • $devpath - การเบี่ยงเบนของอุปกรณ์ (/ devices / pci / ... )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.