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