Вопрос или проблема
Я работаю над старыми скриптами, связанными с cpusets, и переношу их на openSUSE. Скрипты отлично работали с openSUSE 15.5, но теперь с 15.6 они не работают, потому что ожидаемые ими файлы /dev/cpuset
отсутствуют. На самом деле, файлы присутствуют, но они потеряли префикс cpuset.
в своих именах.
Например, для cpuset с именем sys
, скрипты должны манипулировать /dev/cpuset/sys/cpuset.cpus
, но фактический файл, кажется, называется /dev/cpuset/sys/cpus
. Этот шаблон продолжается для всех тринадцати файлов, которые в openSUSE 15.5 (и более старых системах) имели имена, начинающиеся с cpuset.
; те же файлы есть, но без префикса cpuset.
.
Изучая страницу справки docs.kernel.org, я обнаружил, что документируется именование cpuset.*
. Есть идеи, откуда взялись файлы без префикса cpuset.
?
Больше информации: вот полный каталог /dev/cpuset/sys
(где sys
— имя cpuset) на машине с openSUSE Leap 15.5:
devuser@product:/dev/cpuset/sys> ls -al
total 0
drwxr-xr-x 2 root root 0 Feb 18 14:07 .
dr-xr-xr-x 3 root root 0 Feb 18 14:03 ..
-rw-r--r-- 1 root root 0 Feb 18 14:07 cgroup.clone_children
-rw-r--r-- 1 root root 0 Feb 18 14:07 cgroup.procs
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.cpu_exclusive
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.cpus
-r--r--r-- 1 root root 0 Feb 18 14:07 cpuset.effective_cpus
-r--r--r-- 1 root root 0 Feb 18 14:07 cpuset.effective_mems
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.mem_exclusive
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.mem_hardwall
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.memory_migrate
-r--r--r-- 1 root root 0 Feb 18 14:07 cpuset.memory_pressure
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.memory_spread_page
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.memory_spread_slab
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.mems
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.sched_load_balance
-rw-r--r-- 1 root root 0 Feb 18 14:07 cpuset.sched_relax_domain_level
-rw-r--r-- 1 root root 0 Feb 18 14:07 notify_on_release
-rw-r--r-- 1 root root 0 Feb 18 14:07 tasks
devuser@product:/dev/cpuset/sys>
А вот тот же каталог на машине с openSUSE 15.6:
devuser@product:/dev/cpuset/sys> ls -al
total 0
drwxr-xr-x 2 root root 0 Feb 18 11:25 .
dr-xr-xr-x 5 root root 0 Feb 18 11:25 ..
-rw-r--r-- 1 root root 0 Feb 18 11:29 cgroup.clone_children
-rw-r--r-- 1 root root 0 Feb 18 11:29 cgroup.procs
-rw-r--r-- 1 root root 0 Feb 18 11:29 cpu_exclusive
-rw-r--r-- 1 root root 0 Feb 18 11:29 cpus
-r--r--r-- 1 root root 0 Feb 18 11:29 effective_cpus
-r--r--r-- 1 root root 0 Feb 18 11:29 effective_mems
-rw-r--r-- 1 root root 0 Feb 18 11:29 mem_exclusive
-rw-r--r-- 1 root root 0 Feb 18 11:29 mem_hardwall
-rw-r--r-- 1 root root 0 Feb 18 11:29 memory_migrate
-r--r--r-- 1 root root 0 Feb 18 11:29 memory_pressure
-rw-r--r-- 1 root root 0 Feb 18 11:29 memory_spread_page
-rw-r--r-- 1 root root 0 Feb 18 11:29 memory_spread_slab
-rw-r--r-- 1 root root 0 Feb 18 11:29 mems
-rw-r--r-- 1 root root 0 Feb 18 11:29 notify_on_release
-rw-r--r-- 1 root root 0 Feb 18 11:29 sched_load_balance
-rw-r--r-- 1 root root 0 Feb 18 11:29 sched_relax_domain_level
-rw-r--r-- 1 root root 0 Feb 18 12:41 tasks
devuser@product:/dev/cpuset/sys>
Таким образом, тот же самый набор файлов, за исключением того, что в Leap 15.5 на тринадцати файлах есть префикс cpuset.
, а в Leap 15.6 те же файлы, но без cpuset.
.
Редактирование: вот как я создал каталог cpuset на системе Leap 15.6. На только что перезагруженной системе:
devuser@product:~> ls /dev/cpuset
ls: cannot access '/dev/cpuset': No such file or directory
devuser@product:~> sudo mkdir /dev/cpuset
[sudo] password for root:
devuser@product:~> sudo mount -t cpuset none /dev/cpuset
devuser@product:~> sudo mkdir /dev/cpuset/sys
devuser@product:~> ls /dev/cpuset/sys
cgroup.clone_children mem_exclusive mems
cgroup.procs mem_hardwall notify_on_release
cpu_exclusive memory_migrate sched_load_balance
cpus memory_pressure sched_relax_domain_level
effective_cpus memory_spread_page tasks
effective_mems memory_spread_slab
devuser@product:~>
ОП также сообщает о следующих строках в /proc/mounts
:
cgroup2 /sys/fs/cgroup cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot 0 0
none /dev/cpuset cgroup rw,relatime,cpuset,noprefix,release_agent=/sbin/cpuset_release_agent 0 0
Последняя строка соответствует монтированию в /dev/cpuset
. Она настроена так, чтобы отображать только записи cpuset из cgroup. noprefix
почти наверняка является причиной изменения ОП.
Чтобы отменить это, попробуйте:
# umount /dev/cpuset
# mount -t cgroup -o cpuset,release_agent=/sbin/cpuset_release_agent none /dev/cpuset
Я признаюсь, что не знаю, что делает “release_agent=”.
Чтобы отменить это навсегда… может быть сложно, поскольку /dev/
монтируется и управляется странно. Но вы можете попробовать добавить релевантную строку в /etc/fstab
none /dev/cpuset cgroup cpuset,release_agent=/sbin/cpuset_release_agent 0 0
Ответ или решение
Столкнувшись с изменением поведения файловой системы в контексте управления процессорными наборами (cpusets) на openSUSE, важно тщательно понять теоретические основы, сопровождающие изменения, а также способы их применения в практических сценариях. Вопрос касается отсутствия префикса cpuset.
в именах файлов в директории /dev/cpuset
, который присутствовал в openSUSE 15.5, но отсутствует в версии 15.6.
Теория
Теоретически, cpusets являются одной из подсистем cgroups v1, которые позволяют сегментировать ресурсы процессора и памяти между различными задачами или группами процессов. В традиционной архитектуре cgroups, как описано в официальной документации ядра Linux, файлы управления cpusets обычно начинаются с префикса cpuset.
(например, cpuset.cpus
). Это помогает идентифицировать их как часть подсистемы cpusets.
Изменение в версии openSUSE 15.6, вероятно, связано с управлением примонтированной файловой системой. Как видно из представленных строк в /proc/mounts
, параметр noprefix
в строке монтирования в точке /dev/cpuset
убирает указанный префикс из имен файлов. Это изменение конфигурации может быть введено для унификации именования или по другим соображениям совместимости.
Пример
На примере вашего использования, в openSUSE 15.5, при создании cpuset с именем sys
, вы могли ожидать файл /dev/cpuset/sys/cpuset.cpus
. В новой версии (15.6) вы обнаружили, что префикс пропал, и файл теперь именуется просто как /dev/cpuset/sys/cpus
. Это свидетельствует о новых правилах монтирования, представленных системой.
В ваших скриптах это может проявляться в ошибках доступа к файлам, так как они ожидают прежних имен с префиксом.
Применение
Чтобы исправить эту проблему, необходимо временно демонтировать и замонтировать файловую систему cgroup
без использования параметра noprefix
. Как показано в вашем примере:
# umount /dev/cpuset
# mount -t cgroup -o cpuset,release_agent=/sbin/cpuset_release_agent none /dev/cpuset
Постоянное решение можно попытаться реализовать через изменение конфигурации /etc/fstab
, добавив туда строку монтирования без noprefix
, чтобы это имело эффект при каждом запуске системы:
none /dev/cpuset cgroup cpuset,release_agent=/sbin/cpuset_release_agent 0 0
Кроме этого, важно отметить, что файл release_agent
(в данном случае /sbin/cpuset_release_agent
) используется для указания программы, которая будет вызвана при завершении существования cgroup. Однако изменение этой конфигурации не связано с изменениями в именах файлов.
Подводя итог, вы можете выполнить следующие действия для корректировки сценариев: обновить скрипты для имплементации текущих путей к файлам или изменить настройку монтирования, чтобы восстановить историческое поведение. Это обеспечит совместимость вашего кода в стабильной и последовательной среде openSUSE. Если вы располагаете дополнительными вопросами о работе с cgroups или испытываете сложность с доработкой скриптовых решений, возможно, целесообразно обратиться к сообществу пользователей openSUSE или к профессиональной технической поддержке.