diamond АШ Tlg

Решение проблемы с подвисаниями конфигуратора 1С на Linux

Настраиваем планировщик ввода-вывода для лечения подвисаний во время массовых файловых операций.

Описание проблемы

Если вы недавно перешли на Linux, то со временем можете заметить, что система иногда подвисает, когда идёт массовое обращение к диску на чтение или запись. В это время бывает даже нельзя прочитать содержимое каталога, особенно когда что-то сохраняете в конфигураторе 1С или делаете реструктуризацию файловой базы. Связано это может быть с планировщиком ввода-вывода.

Дело в том, что если дистрибутив использует 'ванильное' ядро Linux, то в нём будут отсутствовать некоторые интересные планировщики дискового ввода-вывода.

В сухом остатке в ядре типичного дистрибутива мы имеем поддержку только планировщиков none и mq-deadline. Первый является самым примитивным и в своей работе опирается на возможности самого диска и в первую очередь его запредельную скорость. None всегда автоматически назначается NVME-дискам, виртуальным дискам, и с высокой вероятностью на SSD-диски. Второй планировщик ориентирован на повышение привилегии для операций чтения и рекомендуется для определенных сценариев на виртуальных машинах, и может назначаться на SSD и остальные более медленные диски, если они есть.

Очевидно, раз вы, как разработчик 1С, ощутили тормоза, то что-то пошло не так и ваш NVME-диск оказался вовсе не так быстр, как Samsung EVO (как рассчитывали дистроделы), либо объём дисковых операций превзошёл все ожидания. В последние годы в РФ сказывается наводнение маркетплейсов китайскими брендами вычислительной техники, в которых установлены сравнительно медленные, зато дешёвые nvme и ssd диски. Вечно этому 1С что-то не так 🙃.

Решение

Описанную выше проблему можно смягчить, включив планировщик BFQ. Сначала посмотрим, какие вообще есть планировщики в ядре (вместо nvme0n1 введите имя вашего диска):

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

В квадратных скобках видим [none] - значит система для указаного диска выбрала его. Также видно, что доступен планировщик 'mq-deadline'. Других планировщиков у меня в списке нет, у вас может быть ещё.

Если планировщик bfq отсутствует в ядре, то есть следующие варианты его подключения:

  • Установите ядро zen-kernel. В Arch это ядро входит в официальный репозитарий и устанавливается командой sudo pacman -S linux-zen linux-zen-headers
  • В большинстве дистрибутивов, например в Ubuntu, планировщик bfq поставляется в виде модуля ядра. Подключите его, создав файл с именем /etc/modules-load.d/bfq.conf и вписав в него bfq

После настройки и перезагрузки компьютера вы должны увидеть:

$ cat /sys/block/nvme0n1/queue/scheduler
    [none] mq-deadline bfq

Но радоваться рано, планировщик bfq не в квадратных скобках, а значит диску он не назначен. Сделаем настройку, чтобы выбирался bfq, для этого любым редактором создаем файл /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}="bfq"

После перезагрузки системы убеждаемся, что нужный планировщик работает:

$ cat /sys/block/nvme0n1/queue/scheduler
none mq-deadline [bfq]

После настройки подвисания должны исчезнуть, отзывчивость повыситься.