Файлы в /dev/cpuset переименованы?

Вопрос или проблема

Я работаю над старыми скриптами, связанными с 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 или к профессиональной технической поддержке.

Оцените материал
Добавить комментарий

Капча загружается...