CpuSet

Ответить
admin
Администратор
Сообщения: 226
Зарегистрирован: 05 янв 2011, 04:19

CpuSet

Сообщение admin »

1. Предпочтительный — использовать ключи Quadlet

Код: Выделить всё

[Container]
Image=...

CPUs=4
CPusetCpus=0-3
CPUShares=1024
Это соответствует параметрам podman run --cpus, --cpuset-cpus и --cpu-shares. Quadlet поддерживает передачу большинства таких параметров напрямую.

Например:

Код: Выделить всё

[Container]
Image=docker.io/library/nginx:latest
ContainerName=nginx

CPUs=2
CPusetCpus=4-5
2. Если какого-то параметра нет — через PodmanArgs

Код: Выделить всё

[Container]
Image=...

PodmanArgs=--cpus=2 --cpuset-cpus=4-5
PodmanArgs позволяет передать любые аргументы podman run, если для них нет отдельного ключа Quadlet.

Если твоя задача — закрепить контейнер за определёнными ядрами, то достаточно:

Код: Выделить всё

[Container]
CPusetCpus=0-7
Если же нужно ограничить производительность (например, использовать не более двух ядер независимо от их номеров), используй:

Код: Выделить всё

[Container]
CPUs=2
Оба параметра можно комбинировать:

Код: Выделить всё

[Container]
CPUs=2
CPusetCpus=4-7
В этом случае контейнер сможет использовать не более двух CPU, причём только из набора ядер 4–7.


Ошибка

OCI runtime error: crun: controller `cpuset` is not available

означает, что в твоей cgroup-конфигурации контроллер cpuset не доступен контейнеру. Обычно это встречается при:

rootless Podman;
systemd не делегирует cpuset;
cgroup v2 без включенного контроллера cpuset в родительской cgroup.

Проверь:

Код: Выделить всё

cat /sys/fs/cgroup/cgroup.controllers
Если там нет cpuset, то ядро или systemd его не предоставляют.

Если cpuset есть:

Код: Выделить всё

cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/cgroup.controllers
Включить делегирование cpuset для пользователя

На современных systemd нужно добавить в сервис пользователя:

Код: Выделить всё

[Service]
Delegate=cpu cpuset memory pids
и убедиться, что в дереве cgroup включён контроллер:

Код: Выделить всё

cat /sys/fs/cgroup/cgroup.subtree_control
должно содержать:

+cpuset

Но это уже настройка хоста и не всегда возможна.

Покажи вывод:

Код: Выделить всё

podman info | grep -A20 cgroup
cat /sys/fs/cgroup/cgroup.controllers
cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/cgroup.controllers
и скажи, контейнер запускается rootless или через sudo/systemd system service. Тогда можно точно определить причину.
podman info | grep -A20 cgroup
cat /sys/fs/cgroup/cgroup.controllers
cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/cgroup.controllers
cgroupControllers:
- cpu
- memory
- pids
cgroupManager: systemd
cgroupVersion: v2
conmon:
package: conmon-2.2.1-3.el10.x86_64
path: /usr/bin/conmon
version: 'conmon version 2.2.1, commit: '
cpuUtilization:
idlePercent: 76.35
systemPercent: 2.62
userPercent: 21.03
cpus: 8
databaseBackend: sqlite
distribution:
distribution: centos
version: "10"
eventLogger: journald
freeLocks: 2046
hostname: localhost.localdomain
idMappings:
gidmap:
- container_id: 0
host_id: 1000
cpuset cpu io memory hugetlb pids rdma misc dmem
cpu memory pids

По выводу видно, в чём проблема.

На хосте есть:
cpuset cpu io memory hugetlb pids rdma misc dmem
Но в пользовательской cgroup (user.slice) доступны только:
cpu memory pids
То есть systemd не делегировал контроллер cpuset пользовательскому менеджеру, поэтому rootless Podman не может использовать --cpuset-cpus.

Это не проблема Podman или crun — это ограничение конфигурации systemd.

Если нужен rootless

Проверь:
systemctl --user show -p Delegate
systemctl --user show -p DelegateControllers
Скорее всего увидишь, что cpuset отсутствует.

На системах с systemd 252+ можно включить делегирование через drop-in для user@.service.

Создай:

Код: Выделить всё

/etc/systemd/system/user@.service.d/delegate.conf
с содержимым:
[Service]
Delegate=cpu cpuset io memory pids
Затем:

Код: Выделить всё

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo loginctl terminate-user $USER
или перелогинься.

После этого проверь:

Код: Выделить всё

cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/cgroup.controllers
Если увидишь:
cpuset cpu memory pids
то CPusetCpus= в Quadlet заработает.
Ответить