Изоляция ЦП на AWS/GCP: ошибка монтирования ЦП

Изоляция ЦП на AWS/GCP: ошибка монтирования ЦП

У меня есть два экземпляра vCPU на 32 на AWS/GCP. Я пытаюсь настроить экранирование процессоров так, чтобы процессоры 0, 1 использовались системой, а процессоры 2-31 были экранированы и использовались только явно потоками пользовательского пространства.

Системная информация:

Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:    22.04
Codename:   jammy
$ cat /proc/filesystems | grep cpuset
nodev   cpuset

Однако при попытке запустить cset shieldя получаю ошибку, связанную с монтированием:

mount: /cpusets: none already mounted on /run/credentials/systemd-sysusers.service.
cset: **> mount of cpuset filesystem failed, do you have permission?

Я немного покопался в коде cset, и похоже, что неудачный вызов — это один из

$ sudo mount -t cpuset cpuset /cpusets
mount: /cpusets: cpuset already mounted or mount point busy.

/cpusets— это недавно созданная папка, и $ cat /proc/mounts | grep cpusetона пуста, поэтому cpuset, похоже, нигде не смонтирован.

Возможно, имеет значение:

$ cat /proc/mounts | grep cgroup
cgroup2 /sys/fs/cgroup cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot 0 0

Я предполагаю, что AWS/GCP использует cpuset для гипервизора или что-то в этом роде. Возможно ли изолировать cpus на AWS/GCP? Как это сделать?

решение1

Вы используете systemd, который уже смонтировал v2 ("unified") cgroups, так что это не вы управляете контрольными группами - это systemd. Сообщите ему сделать это черезCPUAffinity= и соответствующие параметры в разделе [Manager]файла/etc/systemd/system.conf.d/50-my-cpuset-options.conf. Затем вы можете использовать CPUAffinity=(пустое значение для сброса, непустое значение для добавления) для тех конкретных файлов unit.service, которые вы хотите исключить из глобального значения по умолчанию.

Вы даже можете использовать API systemd для временного (до перезагрузки) изменения параметров ресурсов в уже запущенных службах с помощью команды systemctl --runtime set-property example.service ExampleOption=Value. Используйте это для подтверждения полученных настроек cgroup и измерения того, как это влияет на производительность вашей системы. Я полагаю, что вместо глобальных значений по умолчанию вы увидите заметно более высокую надежность системы в условиях перегрузки, если вместо того, чтобы нарушать способность планировщика использовать 100% ЦП, вы улучшите его полные возможности. Более точно сопоставляйте свои приоритеты с помощью Nice=и IOSchedulingClass=для тех конкретных низкоприоритетных асинхронных фоновых задач, которые вы хотите запустить, но не хотите, чтобы они влияли на остальную часть системы, но оставьте кувалду сродства неиспользованной.


Теоретически, такие коммунальные услуги, какcsetможно было бы обновить, чтобы вместо этого взаимодействовать с такими системными менеджерами cgroup2 и предлагать фактически те же абстракции, что и раньше, одновременно изменяя в фоновом режиме systemds system.sliceи значения по умолчанию для единиц, ноэто обсуждение звучиткак будто этого до сих пор никто не делал. И с тех пор каквсеобъемлющий гигантский кусок Cпредлагает гораздо более богатый, хорошо документированный и, возможно, более универсальный контроль над всеми полезными вещами, которым научилось ядро, в этом больше нет необходимости.

решение2

Как уже упоминалось, systemd создает собственные иерархии cgroup2, которые, исходя из моих потребностей, не очень хорошо сочетаются с cset.

Я добавил следующее в значение GRUB_CMDLINE_LINUX_DEFAULT в /etc/default/grub, чтобы отключить это поведение в Ubuntu 22.10.

После того, как вы закончите, строка будет выглядеть примерно так:

GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=false <your_other_params>"

После того, как вы закончите, вам нужно будет запустить как root:

update-grub
grub-install

и затем перезагрузите. После перезагрузки мне удалось успешно экранировать CCX на моем процессоре Ryzen с помощью CSET, а также перенести все пользовательские и системные задачи

Вот еще ссылки на эту проблему, с которыми я столкнулся, если вам нужна дополнительная информация: https://github.com/systemd/systemd/issues/13477#issuecomment-528113009 https://github.com/lxc/lxd/issues/10441

Связанный контент