Pull to refresh

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

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

Лирика


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

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

Решение?

cgroups

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

Дальше всё просто:
sudo -s
mkdir -p ~/cg/io
mkdir -p ~/cg/cpu
mount -t cgroup -oblkio none ~/cg/io
mount -t cgroup -ocpu none ~/cg/cpu
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.write_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) — и он больше не будет съедать все доступные ресурсы, тормозить и бибикать.

Значения, кстати, можно менять на ходу.
Tags:
Hubs:
Total votes 64: ↑51 and ↓13 +38
Views 8.2K
Comments 19
Comments Comments 19

Posts