локальная компиляция без лагов

в 6:52, , рубрики: cgroups, linux, Программирование, системное администрирование, метки: ,

Abstract: использование cgroups для ограничения прожорливости компилятора по процессору и диску.

Лирика

Дано:
программист 1шт,
ноутбук с ноутбучным диском на 5200 rpm — 1шт,
исходных файлов на хаскеле 300 шт
Файлы coffee-script (будущий JS) — 300 шт
время компиляции — 40 минут.

Задача: компилировать в бэкграунде не ставя всю систему в состояние «ад и погибель». Можно даже ценой увеличения времени сборки до 50-60 минут.

Решение?

cgroups

Допустим, у нас в ноутбуке примерная (на глазок) производительность диска — около 80 IOPS в пике. Мы решаем отдать на компиляцию 40 IOPS и 300% от всех процессоров (из доступных 4 ядер).

Дальше всё просто:

sudo -s
mkdir -p ~/cg/io
mkdir -p ~/cg/cpu
mount -t cgroup -oblkio none ~/cg/io
mount -t cgroup -ocpu none ~/cg/io
mkdir ~/cg/cpu/g1 (создаём группу)
stat /dev/sda

(получаем вывод, из которого нас интересует только Device type: 8,0, выделенное жирным — искомое)

Запускаем рядом второй шелл, из которого будет компиляция. Смотрим его PID:

echo $$

(получаем число)

Пишем в первом шелле:

echo (PID шелла для компиляции) >~/cg/g1/cpu/tasks
echo (PID шелла для компиляции) >~/cg/io/tasks

(это мы сказали, какие pid'ы и их потомки будем резать, туда можно записать больше одного процесса, но для целей компиляции достаточно просто шелла)
Дальше выставляем лимиты:

IO:

echo "8:0 20" > ~/cg/io/blkio.throttle.read_iops_device
echo "8:0 20" > ~/cg/io/blkio.throttle.read_iops_device

Для устройства 8:0 (см выше как его узнать) выставили максимум в 20 записей в секунду и 20 чтений.

CPU:

echo 300000 > ~/cg/cpu/g1/cpu.cfs_quota_us

Мы выставили квоту 300 000 µs (для каждого тика в 100 000 µs), то есть 300% CPU.

После этого мы можем смело запускать компиляцию в нашем шелле (чей PID мы записали в tasks) — и он больше не будет съедать все доступные ресурсы, тормозить и бибикать.

Значения, кстати, можно менять на ходу.

Автор: amarao

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js