Полезный метод в любое время, когда вы хотите ограничить использование ресурсов процессом.

Мне нравится использовать KDE, и частью этой среды рабочего стола является программа под названием baloo. Я не использую его много, но это удобно, когда я делаю. Но программа может быть огромным пожирателем дисковых ресурсов. Наконец-то я нашел надежное исправление для этого, и оно не только поможет вам, если вы используете baloo, но и может помочь вам с некоторыми другими программами.

Одна из вещей, которая так усложняет написание программного обеспечения для Linux, заключается в том, что существует бесконечное количество способов настройки системы Linux. Представьте себе, что вам нужно создать электрический прибор, который может использовать любую из дюжины вилок, и никакие две вилки не могут иметь одинаковое напряжение. Некоторые разработчики более успешно справляются с этими различиями, чем другие. Возьмем, к примеру, baloo, программу поиска файлов для среды рабочего стола KDE. Это должна быть довольно простая программа. Он следит за вашей файловой системой, и такие программы, как Dolphin или KRunner, могут попросить его найти файлы с определенными именами или содержимым. Просто, верно?

Но есть проблема. Для выполнения своей работы baloo необходимо создать большую базу данных. Чтобы построить эту базу данных, она должна пройтись по всему вашему жесткому диску, что, конечно же, требует времени. Я предполагаю, что разработчик baloo думал, что это самая важная вещь в мире, поэтому исторически baloo потреблял много ресурсов при создании базы данных. Однако со временем некоторые вещи были изменены, чтобы сделать программу более удобной.

Лучшим изменением было пометить дисковый ввод-вывод программы как «бездействующий», что означает, что она будет обращаться к жесткому диску только тогда, когда больше ничего не происходит. Это было большим улучшением. Но, к сожалению, это работает только с определенными планировщиками ввода-вывода. Если вы используете один из них, отлично. Если вы этого не сделаете, ваша система станет непригодной для использования, так как baloo потребляет 100% пропускной способности вашего жесткого диска, пока это не будет сделано.

Введите контрольную группу

Ответ оказался переносом всех процессов baloo в cgroup. Контрольная группа — это набор процессов, для которых вы можете установить ограничения. Например, вы можете захотеть ограничить набор процессов определенным количеством процессорного времени или, в нашем случае, дисковым вводом-выводом. Как я уже говорил ранее, в системе Linux есть много способов сделать что-то, и cgroup не является исключением. Существует две версии cgroup, но версия 2 пока не очень распространена, поэтому в этой статье речь пойдет о версии 1. Посмотрите на /sys/fs/cgroup/blkio с помощью команды ls. Если он есть, у вас есть все, что вам нужно, чтобы сделать эту работу. Если это не так, возможно, вам придется смонтировать файловую систему cgroup.

Идея состоит в том, чтобы создать подкаталог в каталоге blkio. Это создаст пустую cgroup. Есть элементы (файлы), которые вы можете установить, чтобы наложить ограничения на любые процессы, находящиеся в контрольной группе. Для нас мы хотим использовать blkio.throttle.read_bps_device и blkio.throttle.write_bps_device, хотя вы, вероятно, могли бы использовать и другие методы. Если вы используете планировщик bfq, вы, вероятно, могли бы использовать его, чтобы сделать дисковый ввод-вывод менее важным, например, без установки определенного ограничения.

После того, как вы настроили cgroup, вы можете записать PID процессов baloo в файл cgroup.procs, чтобы добавить программу в cgroup. Любые программы, которые порождаются этими процессами, также автоматически попадают в контрольную группу.

Основные шаги

Ограничения будут представлять собой строку в форме или основной номер устройства, второстепенный номер устройства (который, кажется, всегда равен 0 в моей системе, поэтому я думаю, что вы можете повлиять только на все устройство, а не на конкретный раздел) и ограничение в байтах . Например, если ваш жесткий диск является основным устройством 8:1 (cat /proc/partitions сообщит вам об этом), ваша строка будет выглядеть так:

"8:0 1048676"

Это предотвратит запись или чтение любой программы в контрольной группе с жесткого диска со скоростью более 1 МБ/с. Между прочим, у этого есть некоторые ограничения, так как иногда ядро ​​​​не может сказать, откуда произошло чтение или запись, но, похоже, это хорошо работает с baloo и, вероятно, будет работать и с другими программами.

Итак, основные шаги (как root):

mkdir /sys/fs/cgroup/blkio/baloo
cd /sys/fs/cgroup/blkio/baloo
# note these lines probably wrap on your screen. They should not wrap in real life
echo "8:0 1048676" >blkio.throttle.read_bps_device
echo "8:0 1048676" >blkio.throttle.write_bps_device
# add any other devices here
# Now add baloo processes
pgrep baloo   # assume you get 7790 and 7919
# must do one at a time
echo 7790 >cgroup.proces
echo 7919 >cgroup.proces

Это, конечно, замедлит baloo, поэтому вы можете увеличить лимит. Каждый раз делать это мучительно, поэтому попробуйте этот скрипт (следите за переносом строк или скачайте его отсюда):

#!/bin/bash
#baloo-nice by Al Williams
RLIMIT=1048576   # bps limit (read)
WLIMIT=1048576   # bps limit (write)
DEVICES="8 252 253 259"
SEARCH=baloo
if [ ! -d /sys/fs/cgroup/blkio/baloo ]
then
  mkdir /sys/fs/cgroup/blkio/baloo    
fi
for I in $DEVICES
do
  echo "$I:0 $RLIMIT" >/sys/fs/cgroup/blkio/baloo/blkio.throttle.read_bps_device
  echo "$I:0 $WLIMIT" >/sys/fs/cgroup/blkio/baloo/blkio.throttle.write_bps_device
done
for I in `pgrep $SEARCH`
do
  echo $I >/sys/fs/cgroup/blkio/baloo/cgroup.procs
done
exit 0

Просто не забудьте изменить его в соответствии с вашими настройками и запустить его как root. Вы можете задаться вопросом, почему у меня так много дисков. Существует массив RAID и объем кэш-памяти NVME, а также задействованные виртуальные диски. Мне может не понадобиться все это, но имело смысл просто ограничить их все.

Подробнее Чтение

Если вы хотите узнать больше о cgroups, документы ядра — хорошее место для начала. Если вам нужен официальный инструмент, найдите cgexec, который является частью cgroup-tools в Ubuntu и подобных дистрибутивах. Однако, поскольку вы не запускаете baloo напрямую, вам нужно найти, где его добавить.

Я надеюсь, что это заставит балу работать на вас. Еще один совет: если хотите, вы можете легко создать задание cron (или модуль systemd, если хотите), чтобы установить лимит ночью и сбросить их днем. Вы также можете привязать его к своей заставке. Что-то думать о.