В последних версиях ядра Linux была проделана большая работа по решению проблемы работы дисковой подсистемы с новыми, быстрым блочным устройствам. С выходом Linux ядра версии 4.12 у пользователей появилась возможность использовать несколько новых планировщиков (I/O scheduler) для блочных устройств. Эти планировщики основаны на новом способе передачи запросов — multiqueue block layer (blk-mq).
В этой статье я не буду рассматривать особенности работы новых планировщиков, я лишь расскажу как их включить на Oracle Linux 7.6 с ядром UEK (Unbreakable Enterprise Kernel).
Исходные данные: ОС Oracle Linux 7.6 с ядром 3.10;
Задача: Установить ядра UEK и активация i/o планировщика mq-deadline или kyber
В блоге компании Selectel достаточно хорошо описаны новые планировщики, так что рекомендую всем ознакомиться с из статьей.
Так же на habr.ru недавно вышла статья «Последние изменения в IO-стеке Linux с точки зрения DBA», в ней тоже много полезной информации по IO-стеку в Linux и в частности про blk-mq.
Т.к. у нас установлено ядро 3.10, то новые планировщики нам недоступны. Нам необходимо более свежее Linux ядро, а именно 4.12 или новее. В расширенной сборке ядра Linux от Oracle — UEK (Unbreakable Enterprise Kernel) используется ядро версии 4.14, что вполне нас устроит.
1. Обновление Linux ядра до версии UEK
Проверим включен ли нужный нам репозитарий:
yum repolist
Вывод:
Loaded plugins: etckeeper, ulninfo repo id repo name status epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 13,235 ol7_UEKR5/x86_64 Latest Unbreakable Enterprise Kernel Release 5 for Oracle Linux 7Server (x86_64) 163 ol7_latest/x86_64 Oracle Linux 7Server Latest (x86_64) 13,094
Нужный нам репозитарий ol7_UEKR5 включен.
Смотрим ограничение на одновременную установку нескольких ядер:
cat /etc/yum.conf |grep 'installonly_limit'
Вывод:
installonly_limit=3
3 ядра нам может быть маловато, меняем на 10:
sed 's/installonly_limit=3/installonly_limit=10/g' /etc/yum.conf
Проверяем:
cat /etc/yum.conf |grep 'installonly_limit'
Вывод:
installonly_limit=10
Смотрим наличие ядра UEK:
yum list kernel-uek
Установка ядра UEK:
yum install kernel-uek
Проверим наличие нового ядра
ls -lh /boot | grep -E "config-[45].|initramfs-[45].|vmlinuz-[45].|System.map-[45]."
Вывод:
-rw-r--r-- 1 root root 180K Jun 15 07:20 config-4.14.35-1902.2.0.el7uek.x86_64 -rw------- 1 root root 21M Jun 18 15:11 initramfs-4.14.35-1902.2.0.el7uek.x86_64.img -rw------- 1 root root 13M Jun 18 15:13 initramfs-4.14.35-1902.2.0.el7uek.x86_64kdump.img -rw-r--r-- 1 root root 3.6M Jun 15 07:20 System.map-4.14.35-1902.2.0.el7uek.x86_64 -rwxr-xr-x 1 root root 7.2M Jun 15 07:20 vmlinuz-4.14.35-1902.2.0.el7uek.x86_64
Проверим наличие в ядре включенной опции CONFIG_BLK_WBT_MQ:
cat /boot/config-4.14.35-1902.2.0.el7uek.x86_64 | grep CONFIG_BLK_WBT_MQ
Должно показать:
CONFIG_BLK_WBT_MQ=y
Теперь поменяем I/O Scheduler, для этого в файле /etc/default/grub в параметр GRUB_CMDLINE_LINUX добавим:
scsi_mod.use_blk_mq=1 dm_mod.use_blk_mq=1
Например у меня строка GRUB_CMDLINE_LINUX стала такой:
GRUB_CMDLINE_LINUX="ipv6.disable=1 crashkernel=auto rd.lvm.lv=ol_myserver/root rd.lvm.lv=ol_myserver/swap rhgb quiet transparent_hugepage=never scsi_mod.use_blk_mq=1 dm_mod.use_blk_mq=1"
У Вас она будет другой, не копируйте мою! Но примерный вид опций Вы поняли какой.
Запишем изменения в загрузчик:
grub2-mkconfig -o /boot/grub2/grub.cfg
Теперь перезагрузим сервер:
reboot
При загрузке в GRUB у нас появится новое ядро, сервер должен загрузиться.
Проверим версию ядра:
uname -a
Вывод:
Linux myserver 4.14.35-1902.2.0.el7uek.x86_64 #2 SMP Fri Jun 14 21:15:44 PDT 2019 x86_64 x86_64 x86_64 GNU/Linux
Проверим наличие новых I/O Scheduler для диска /dev/sda:
cat /sys/block/sda/queue/scheduler
Вывод:
[mq-deadline] kyber none
Отлично! По-умолчанию активирован планировщик mq-deadline.
Теперь скорректируем некоторые параметры работы mq-deadline для SSD диска /dev/sda
ВНИМАНИЕ! Перед созданием файла /etc/udev/rules.d/60-schedulers.rules с опциями планировщика Вам нужно убедиться, что в каталоге /etc/udev/rules.d нет уже созданного ранее файла для других планировщиков, иначе в зависимости от последовательности применения файлов у Вас может быть не тот результат который Вы ожидаете. Так же Вам нужно убедиться, что Вы не задавали ранее тип планировщика через файл /etc/default/grub, где в строке GRUB_CMDLINE_LINUX можно указать опцию elevator=XXXXX
echo "ACTION==\"add|change\", KERNEL==\"sda\", ATTR{queue/rotational}=\"0\", ATTR{queue/scheduler}=\"mq-deadline\"" > /etc/udev/rules.d/60-schedulers.rules echo "ACTION==\"add|change\", KERNEL==\"sda\", ATTR{queue/iosched/fifo_batch}=\"1\"" >> /etc/udev/rules.d/60-schedulers.rules echo "ACTION==\"add|change\", KERNEL==\"sda\", ATTR{queue/iosched/read_expire}=\"100\"" >> /etc/udev/rules.d/60-schedulers.rules echo "ACTION==\"add|change\", KERNEL==\"sda\", ATTR{queue/iosched/writes_starved}=\"4\"" >> /etc/udev/rules.d/60-schedulers.rules
Обратите внимание, что в первой строке мы меняем 2 атрибута — /sys/block/sda/queue/rotational и /sys/block/sda/queue/scheduler
Изменение параметров строками ниже (queue/iosched/fifo_batch и т.д.) приведено в качестве примера, не копируйте мои значения если Вы не знаете их назначение.
Описание всех опций и их назначение для Deadline можно прочитать в официальной документации.
Применим параметры:
udevadm control --reload-rules udevadm trigger --type=devices --action=change
Для включения mq-deadline для всех постоянных SSD-дисков нужно поменять первую строку в /etc/udev/rules.d/60-schedulers.rules на
ACTION=="add|change", KERNEL=="sd[a-z]|mmcblk[0-9]*|nvme[0-9]*", ATTR{queue/rotational}="0", ATTR{queue/scheduler}="mq-deadline"
Если Вы хотите выбрать планировщик kyber для всех постоянных SSD-дисков, то выполните:
echo "ACTION==\"add|change\", KERNEL==\"sd[a-z]|mmcblk[0-9]*|nvme[0-9]*\", ATTR{queue/rotational}=\"0\", ATTR{queue/scheduler}=\"kyber\"" > /etc/udev/rules.d/60-schedulers.rules
Описание всех опций и их назначение для Kyber можно прочитать в официальной документации.
После внесения изменений не забываем выполнить пару команд udevadm и проверить активацию выбранного планировщика для диска(ов):
udevadm control --reload-rules udevadm trigger --type=devices --action=change cat /sys/block/sda/queue/scheduler
На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, PostgreSQL) на протяжении последних 24 лет.