Решение проблемы с подвисаниями конфигуратора 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]
После настройки подвисания должны исчезнуть, отзывчивость повыситься.