namespaces
Типы: pid (процессы), net (сеть/интерфейсы), mnt (монтирования), user (UID),
uts (hostname), ipc, cgroup.
Изоляция (namespaces) и лимиты ресурсов (cgroups) — фундамент контейнеров и systemd.
lsns
namespaces (изоляция)
systemd-cgls
дерево cgroups
systemd-cgtop
потребление ресурсов по cgroup
sudo nsenter -t PID -a bash
войти во все namespaces процесса
sudo systemctl set-property nginx.service MemoryMax=512M CPUQuota=50% TasksMax=100
systemctl show nginx.service -p MemoryCurrent -p MemoryMax
Контейнеры (Docker) — обычные процессы Linux, которых ядро держит двумя механизмами:
Этим же пользуется systemd (каждая служба — в своей cgroup).
Типы: pid (процессы), net (сеть/интерфейсы), mnt (монтирования), user (UID),
uts (hostname), ipc, cgroup.
CPUQuota=50% — половина одного ядра; MemoryMax= — жёсткий потолок: при превышении
OOM случается внутри группы этой службы (см. oom-killer);
TasksMax= — лимит числа процессов.
systemd раскладывает процессы по дереву групп. Службы лежат в срезе (slice)
system.slice, сеансы пользователей — в user.slice; группе служб можно
дать свой срез строкой Slice=shop.slice в юните. Чей процесс — видно в
строке CGroup у systemctl status и в ps -o unit:
В образе тренажёра у system.slice и user.slice включён контроллер cpu
(cat /sys/fs/cgroup/system.slice/cgroup.subtree_control). Когда процессор
нужен нескольким группам, ядро сначала делит его между группами по весу
CPUWeight (по умолчанию 100), а уже внутри группы — между процессами по
приоритету nice. Опыт на одном процессоре, по два
stress-ng --cpu 1:
| Где процессы | Доли процессора |
|---|---|
две службы, CPUWeight=100 и CPUWeight=900 |
9.7 % и 88.7 % |
две службы, в одной nice -n 19 |
49.1 % и 49.1 % |
одна служба, у одного процесса nice -n 19 |
96.6 % и 1.4 % |
nice действует только между соседями по группе. Чтобы одна служба уступала
другой, ей понижают вес или ставят потолок:
Служба упёрлась в MemoryMax своей cgroup — ядро убило её (cgroup-OOM, не глобальный).
systemctl show svc -p MemoryMax -p MemoryCurrent; подними лимит или почини утечку
(см. oom-killer).
Ограничь через systemd: CPUQuota=, IOWeight=/IOReadBandwidthMax=. Это cgroups,
а не ulimit (тот — на процесс/пользователя, иные вещи).
Так задумано (namespaces изолируют). Чтобы «заглянуть внутрь» — nsenter -t PID -a
в нужные namespaces процесса.
systemd-cgtop (как top, но по cgroup/службам) — сразу видно, какая служба грузит.
Есть неточность? Сообщить об ошибке в статье