روشها و الگوریتمهای مختلفی برای زمانبندی I/O وجود دارد. روشهایی که تاکنون در هسته لینوکس برای زمانبندی I/O استفاده میشد شامل CFQ، NOOP و Deadline بود. با ظهور دستگاههای ذخیرهسازی جدید که قادر به انجام صدها و هزاران درخواست I/O در ثانیه میباشند، نیاز به روشهای زمانبندی جدید که قادر به استفاده از این پتانسیل عظیم باشد بیش از پیش حس میشد. یکی از بهبودهایی که از کرنل نسخه 3.13 وارد هسته لینوکس شد multiqueue block layer بود که منجر به افزایش کارایی سیستم در استفاده از دستگاههای ذخیره سازی با کارایی بالا میشود. منتها این مکانیزم به خودی خود بدون وجود الگوریتمهای زمانبندی که از این مکانیزم استفاده کنند فایده چندانی نداشت. ولی سرانجام در کرنل نسخه 4.12 دو زمانبند جدید که از این مکانیزم استفاده میکنند وارد هسته لینوکس شد. این الگوریتمها به ترتیب BFQ و Kyber میباشند. زمانبند BFQ مکانیزمی است که بیشتر برای استفاده در دیسکهای سخت HDD استفاده میشود که منجر به بهبود زمان تاخیر برنامههای تعاملی و بهبود کارایی سیستم میشود. الگوریتم Kyber هم بدلیل پیچیدگی کمتر نسبت به BFQ برای دیسکهای SSD و سریعتر استفاده میشود.
به تازگی کرنل 4.12 وارد مخازن آرچ شد و کاربران آرچ امکان استفاده از این مکانیزمهای جدید رو پیدا کردند. این زمانبندها در حالت عادی فعال نیستند و برای فعال شدن آنها باید کارهای زیر را انجام بدید. توصیه میکنم که اگر سیستم شما از HDD استفاده میکند از BFQ استفاده کنید و برای SSD ترجیحا از Kyber و یا از روشهای فعلی موجود استفاده کنید.
در حالت عادی زمانبند CFQ در آرچ استفاده میشود که برای دیدن زمانبند مورد استفاده در دیسک مورد نظر خود از دستور زیر استفاده کنید در اینجا دیسک sda رو چک میکنیم:
$ cat /sys/block/sda/queue/scheduler noop deadline [cfq] |
برای استفاده از زمانبندهای چند صفی (multiqueue) ابتدا بایستی پارامترهای scsi_mod.use_blk_mq=1 dm_mod.use_blk_mq=1 را به پارامترهای بوت کرنل اضافه کنیم برای اینکار با فرض استفاده از GRUB به عنوان boot loader مورد استفاده اعمال زیر را انجام دهید:
ابتدا فایل etc/default/grub/ را با ویرایشگر مورد نظر خود باز کرده و پارامترهای گفته شده را به مقادیر موجود در جلوی گزینه GRUB_CMDLINE_LINUX_DEFAULT اضافه کنید یعنی به این صورت:
GRUB_CMDLINE_LINUX_DEFAULT="scsi_mod.use_blk_mq=1 dm_mod.use_blk_mq=1" |
سپس با دستور زیر فایل تنظیمات گراب را بروزرسانی کنید:
$ sudo grub-mkconfig -o /boot/grub/grub.cfg |
در مرحله بعد برای استفاده از زمانبند BFQ برای تمامی دیسکهای سیستم یک rule جدید برای udev ایجاد میکنیم. به این منظور ابتدا دستور زیر را برای ایجاد rule جدید اجرا کنید:
$ sudo nano /etc/udev/rules.d/10-bfq.rules |
سپس محتویات زیر را درون این فایل قرار دهید:
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="bfq" |
در مرحله بعد سیستم خود را ریبوت کرده و بعد از بالا آمدن سیستم چک کنید که زمانبند BFQ برای دیسک شما مورد استفاده قرار گرفته باشد:
$ cat /sys/block/sda/queue/scheduler mq-deadline kyber [bfq] none |
همانطور که میبینید زمانبند bfq برای دیسک sda سیستم مورد استفاده قرار گرفته است. برای استفاده از Kyber هم به همین شیوه عمل میشود منتها در rule ایجاد شده برای udev به جای bfq گزینه kyber رو قرار بدید:
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="kyber" |
لینکهای مرتبط