вторник, 20 мая 2014 г.

Включение планировщика DEADLINE для SSD дисков

По-умолчанию в большинстве дистрибутивов Linux сейчас используется планировщик ввода/вывода CFQ. Он показывает неплохие результаты для смешанной нагрузки, но для SSD дисков есть вариант получше. Для последних оптимальным будет deadline или noop. Раньше я использовал конструкцию вида

echo deadline > /sys/block/sda/queue/scheduler
echo deadline > /sys/block/sdc/queue/scheduler

но сегодня в процессе репетиции восстановления сервера из резервной копии я наткнулся на ошибку при загрузке копии сервера (связана с различием в конфигурации). Чтобы каждый раз не указывать планировщик для нужных дисков я решил доверить это дело UDEV.

Сначала проверим текущие настройки планировщиков

# cat /sys/block/sd*/queue/scheduler
noop anticipatory deadline [cfq]
noop anticipatory deadline [cfq]
noop anticipatory deadline [cfq]
noop anticipatory deadline [cfq]

В данный момент для всех дисков (2 SSD и 2 HDD) установлен планировщик CFQ. Теперь добавим правило UDEV, которое будет изменять планировщик на DEADLINE для всех non-rotational устройств.

# cat > /etc/udev/rules.d/65-ssd-deadline.rules <<_EOF_
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
_EOF_
# udevadm control --reload-rules
# udevadm trigger --subsystem-match='block'

Снова проверим настройки планировщиков

# cat /sys/block/sd*/queue/scheduler
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory deadline [cfq]
noop anticipatory deadline [cfq]

В этот раз для двух первых дисков настройки изменились - это как раз SSD диски. Для обычных HDD дисков остался CFQ.

2 комментария:

  1. А что вы не поправили ваш скриптик (http://blog.tataranovich.com/2013/01/ncq.html) что бы он делал тоже самое

    #!/bin/bash

    for _blkdev in `ls -1d /sys/block/*`
    do
    # Check if block device has support for NOOP IO scheduler
    if [ -e "$_blkdev/queue/scheduler" ]; then
    if `grep -q noop "$_blkdev/queue/scheduler"`; then
    if [ ! -e "$_blkdev/device/queue_depth" ]; then
    continue
    fi
    if [ `cat "$_blkdev/queue/rotational"` -eq 0 ]; then
    echo -n "Selecting DEADLINE I/O scheduler for SSD $_blkdev: "
    echo deadline >"$_blkdev/queue/scheduler" 2>/dev/null && echo OK || echo FAIL
    else
    if [ `cat "$_blkdev/device/queue_depth"` -gt 1 ]; then
    echo -n "Selecting NOOP I/O scheduler for HDD $_blkdev: "
    echo noop >"$_blkdev/queue/scheduler" 2>/dev/null && echo OK || echo FAIL
    else
    continue
    fi
    fi
    else
    continue
    fi
    fi
    done

    Хотя в udev есть плюс что на горячем подключении должен сработать

    ОтветитьУдалить
    Ответы
    1. Исправлять его не вижу смысла, а вот поставить ссылку на альтернативное решение стоит. Спасибо за замечание.

      Удалить