Вопрос или проблема
Мой контроллер cpuset
включен, но я не нахожу соответствующего файла, хочу узнать почему, любая помощь будет очень appreciated ^_^
ОС
┌──[[email protected]]-[~]
└─$hostnamectl
Статическое имя хоста: liruilongs.github.io
Имя иконки: computer-vm
Шасси: vm 🖴
Идентификатор машины: 7deac2815b304f9795f9e0a8b0ae7765
Идентификатор загрузки: 4789d089b50042d88e660a1c511c92ab
Виртуализация: vmware
Операционная система: Rocky Linux 9.3 (Blue Onyx)
Имя ОС CPE: cpe:/o:rocky:rocky:9::baseos
Ядро: Linux 5.14.0-362.18.1.el9_3.0.1.x86_64
Архитектура: x86-64
Поставщик аппаратного обеспечения: VMware, Inc.
Модель аппаратного обеспечения: VMware Virtual Platform
Версия прошивки: 6.00
┌──[[email protected]]-[~]
└─$
cpuset
включить
┌──[[email protected]]-[~]
└─$ls /sys/fs/cgroup/
cgroup.controllers cgroup.threads init.scope sys-fs-fuse-connections.mount
cgroup.max.depth cpu.stat io.stat sys-kernel-config.mount
cgroup.max.descendants cpuset.cpus.effective memory.numa_stat sys-kernel-debug.mount
cgroup.procs cpuset.mems.effective memory.reclaim sys-kernel-tracing.mount
cgroup.stat dev-hugepages.mount memory.stat system.slice
cgroup.subtree_control dev-mqueue.mount misc.capacity user.slice
┌──[[email protected]]-[~]
└─$cat /proc/filesystems | grep cpuset
nodev cpuset
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/cpuset/cpuset.cpus
cat: /sys/fs/cgroup/cpuset/cpuset.cpus: Нет такого файла или директории
Это связано с тем, что разные версии cgroup
имеют разные соответствующие ограничения. Контроллер cpuset
не поддерживается напрямую в версии v2. Контроллер cpuset
является функцией в cgroup v1
, которая позволяет администраторам назначать специальные CPU
ядра и узлы памяти процессам в cgroup
. В cgroup v2
функция cpuset
интегрирована в унифицированное управление ресурсами, и отдельный контроллер cpuset
больше не предоставляется.
Настройте как демонстрацию с привязкой CPU
Cgroup V1
Начиная с Linux 4.6
, API cpuset
был отмечен как устаревший, и рекомендуется использовать унифицированный cgroup v2 API
, основанный на файловой системе. В версии cgroup v1. Несколько ЦП могут быть назначены для выполнения задач процессов следующим образом
В настоящее время используется экспериментальная среда
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$hostnamectl
Статическое имя хоста: vms99.liruilongs.github.io
Имя иконки: computer-vm
Шасси: vm
Идентификатор машины: ea70bf6266cb413c84266d4153276342
Идентификатор загрузки: 28c693c2b1fc4d45935d6daf6296cece
Виртуализация: vmware
Операционная система: Rocky Linux 8.9 (Green Obsidian)
Имя ОС CPE: cpe:/o:rocky:rocky:8:GA
Ядро: Linux 4.18.0-513.9.1.el8_9.x86_64
Архитектура: x86-64
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$
Определите версию Cgroup
┌──[[email protected]]-[~]
└─$mount -l | grep cgroup
tmpfs на /sys/fs/cgroup тип tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup на /sys/fs/cgroup/systemd тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup на /sys/fs/cgroup/freezer тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup на /sys/fs/cgroup/cpuset тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup на /sys/fs/cgroup/pids тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup на /sys/fs/cgroup/cpu,cpuacct тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpu,cpuacct)
cgroup на /sys/fs/cgroup/hugetlb тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup на /sys/fs/cgroup/perf_event тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup на /sys/fs/cgroup/devices тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
cgroup на /sys/fs/cgroup/net_cls,net_prio тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_cls,net_prio)
cgroup на /sys/fs/cgroup/memory тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup на /sys/fs/cgroup/blkio тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup на /sys/fs/cgroup/rdma тип cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,rdma)
Версия cgroup v1 выделяет каждое CPU
ядро многоядерной системы для задачи процесса через контроллер cpuset
. cpuset находится в директории /sys/fs/cgroup
.
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$ls /sys/fs/cgroup/cpuset
cgroup.clone_children cpuset.mem_exclusive cpuset.mems
cgroup.procs cpuset.mem_hardwall cpuset.sched_load_balance
cgroup.sane_behavior cpuset.memory_migrate cpuset.sched_relax_domain_level
cpuset.cpu_exclusive cpuset.memory_pressure notify_on_release
cpuset.cpus cpuset.memory_pressure_enabled release_agent
cpuset.effective_cpus cpuset.memory_spread_page tasks
cpuset.effective_mems cpuset.memory_spread_slab
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$
Контрольные файлы в /sys/fs/cgroup могут быть прочитаны и изменены вручную
- Файл
cpuset.cpus
перечисляет ядра CPU, которые могут использоваться процессами в cgroup. 0-5 означает, что ядра CPU от 0 до 5 доступны. - Файл
cpuset.mems
перечисляет узлы памяти, которые могут использоваться процессами в cgroup. На системах без включенной NUMA фактически существует только одна область памяти, поэтому вы обычно увидите только 0 в файле cpuset.mems.
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$cat cpuset.cpus
0-5
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$cat cpuset.mems
0
Каждый запущенный процесс будет иметь файл cpuset
в директории /proc
, который перечисляет директорию cgroup
, к которой привязан процесс. Значение по умолчанию – /(корневая директория cgroup)
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$cat /proc/1/cpuset
/
Настройте сервис CPU
affinity через контроллер cpuset
. Здесь мы используем httpd в качестве демонстрации.
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$systemctl enable --now httpd
Создана символьная ссылка /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
Просмотр текущей привязки
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$pgrep httpd
37923
37924
37925
37926
37927
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$egrep Cpu /proc/3792?/status
/proc/37923/status:Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
/proc/37923/status:Cpus_allowed_list: 0-127
/proc/37924/status:Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
/proc/37924/status:Cpus_allowed_list: 0-127
/proc/37925/status:Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
/proc/37925/status:Cpus_allowed_list: 0-127
/proc/37926/status:Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
/proc/37926/status:Cpus_allowed_list: 0-127
/proc/37927/status:Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
/proc/37927/status:Cpus_allowed_list: 0-127
┌──[[email protected]]-[/sys/fs/cgroup/cpuset]
└─$
Поле Cpus_allowed
показывает какие ядра CPU процессу разрешено использовать
, и обычно отображается как серия ffffffff (в данном случае каждое ffffffff представляет собой маску из 32 ядер CPU, так как ffffffff – это 32 единицы в двоичном представлении). Так как у вас четыре ffffffff, это обычно означает, что ваша система поддерживает до 128 ядер CPU (32 * 4 = 128), и все они разрешены для процесса.
Поле Cpus_allowed_list
предоставляет более удобочитаемый список, показывающий диапазон ядер CPU
, к которым процессу разрешен доступ. В этом случае 0-127 означает, что процесс может выполняться на любом ядре CPU от 0 до 127.
Следующее изменяет привязку процесса 40604
┌──[[email protected]]-[~]
└─$systemctl restart httpd
┌──[[email protected]]-[~]
└─$pgrep httpd
40604
40607
40608
40609
40610
Подтвердите текущую привязку
┌──[[email protected]]-[~]
└─$egrep Cpu /proc/40604/status
Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list: 0-127
Создайте cgroup
┌──[[email protected]]-[~]
└─$mkdir -p /sys/fs/cgroup/cpuset/cpuset0
Настройте cpuset
, здесь настраиваем CPU, чтобы разрешить ему работать на CPU, соответствующем 0,1
┌──[[email protected]]-[~]
└─$echo 0-1 > /sys/fs/cgroup/cpuset/cpuset0/cpuset.cpus
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/cpuset/cpuset0/cpuset.cpus
0-1
Добавьте процесс в cgroup
, здесь файл задач, и версия Cgroup v2 отличается
┌──[[email protected]]-[~]
└─$echo 40604 > /sys/fs/cgroup/cpuset/cpuset0/tasks
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/cpuset/cpuset0/tasks
40604
Проверьте конфигурацию
┌──[[email protected]]-[~]
└─$cat /proc/40604/status | grep Cpu
Cpus_allowed: 00000000,00000000,00000000,00000003
Cpus_allowed_list: 0-1
┌──[[email protected]]-[~]
└─$printf "%032x\n" $((2**0+2**1))
00000000000000000000000000000003
Cgroup V2
Экспериментальная среда
┌──[[email protected]]-[~]
└─$hostnamectl
Статическое имя хоста: liruilongs.github.io
Красивое имя хоста: VM-16-15-centos
Имя иконки: computer-vm
Шасси: vm 🖴
Идентификатор машины: 613a0293049a4b07973b2510b3318f11
Идентификатор загрузки: e548e77ef4f04d5f80c87ef18f6000c0
Виртуализация: kvm
Операционная система: CentOS Stream 9
Имя ОС CPE: cpe:/o:centos:centos:9
Ядро: Linux 5.14.0-437.el9.x86_64
Архитектура: x86-64
Поставщик аппаратного обеспечения: Tencent Cloud
Модель аппаратного обеспечения: CVM
Версия прошивки: seabios-1.9.1-qemu-project.org
┌──[[email protected]]-[~]
└─$
Подтвердите версию Cgroup
, используемую текущей системой. Текущая версия – cgroup v2
.
┌──[[email protected]]-[/sys/fs/cgroup]
└─$mount | grep cgroup
cgroup2 на /sys/fs/cgroup тип cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
┌──[[email protected]]-[/sys/fs/cgroup]
└─$which systemd-cgtop
/usr/bin/systemd-cgtop
В cgroup v2 вы можете просмотреть ресурсы CPU и памяти, в данный момент доступные для cgroup через файлы только для чтения, такие как cpuset.cpus.effective
и cpuset.mems.effective
, но эти файлы являются только для чтения
и не могут быть изменены непосредственно для установки распределения ядер CPU или узлов памяти.
┌──[[email protected]]-[~]
└─$ls /sys/fs/cgroup/cpu*
/sys/fs/cgroup/cpuset.cpus.effective /sys/fs/cgroup/cpuset.mems.effective
/sys/fs/cgroup/cpuset.cpus.isolated /sys/fs/cgroup/cpu.stat
┌──[[email protected]]-[/sys/fs/cgroup/demogroup]
└─$ll /sys/fs/cgroup/cpuset.cpus.effective
-r--r--r-- 1 root root 0 May 4 16:48 /sys/fs/cgroup/cpuset.cpus.effective
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/cpuset.cpus.effective
0-1
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/cpuset.mems.effective
0
Чтобы контролировать привязку CPU приложений в cgroup v2, вам нужно включить конкретный контроллер CPU и создать выделенную контрольную группу. Рекомендуется создать как минимум два уровня подконтрольных групп в корневой контрольной группе /sys/fs/cgroup/
Проверьте, что контроллеры cpu
и cpuset
предоставляются в файле /sys/fs/cgroup/cgroup.controllers
:
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/cgroup.controllers
cpuset cpu io memory hugetlb pids rdma misc
Контроллеры cpu
и cpuset
включены для прямых детей
корневой контрольной группы /sys/fs/cgroup/
. Подгруппа – это место, где вы можете указать иерархию Cgroup для процессов и применить контрольные проверки к каждому процессу на основе критериев. Пользователи могут прочитать содержимое файла cgroup.subtree_control
на любом уровне, чтобы узнать, какие контроллеры в подгруппе
доступны для включения. По умолчанию файл /sys/fs/cgroup/cgroup.subtree_control
в корневой контрольной группе содержит контроллеры memory
и pids
.
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/cgroup.subtree_control
memory pids
┌──[[email protected]]-[~]
└─$echo "+cpu" >> /sys/fs/cgroup/cgroup.subtree_control
┌──[[email protected]]-[~]
└─$echo "+cpuset" >> /sys/fs/cgroup/cgroup.subtree_control
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/cgroup.subtree_control
cpuset cpu memory pids
┌──[[email protected]]-[~]
└─$
Создайте директорию /sys/fs/cgroup/Example/
, которая определяет подгруппу. Кроме того, предыдущий шаг включает контроллеры cpu
и cpuset
для этой подгруппы.
┌──[[email protected]]-[~]
└─$mkdir /sys/fs/cgroup/Example/
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/Example/cgroup.controllers
cpuset cpu memory pids
Когда вы создаете директорию /sys/fs/cgroup/Example/
, некоторые файлы интерфейса cgroups-v2
и файлы, специфические для контроллера cpu
и cpuset
, также автоматически создаются в директории. Директория /sys/fs/cgroup/Example/
также содержит файлы, специфичные для контроллеров memory
и pids
.
┌──[[email protected]]-[~]
└─$ls /sys/fs/cgroup/Example/
cgroup.controllers cpuset.cpus.exclusive memory.oom.group
cgroup.events cpuset.cpus.exclusive.effective memory.peak
cgroup.freeze cpuset.cpus.partition memory.reclaim
cgroup.kill cpuset.mems memory.stat
cgroup.max.depth cpuset.mems.effective memory.swap.current
cgroup.max.descendants cpu.stat memory.swap.events
cgroup.procs cpu.weight memory.swap.high
cgroup.stat cpu.weight.nice memory.swap.max
cgroup.subtree_control memory.current memory.swap.peak
cgroup.threads memory.events memory.zswap.current
cgroup.type memory.events.local memory.zswap.max
cpu.idle memory.high pids.current
cpu.max memory.low pids.events
cpu.max.burst memory.max pids.max
cpuset.cpus memory.min pids.peak
cpuset.cpus.effective memory.numa_stat
┌──[[email protected]]-[~]
└─$
Включите контроллеры, относящиеся к CPU, в /sys/fs/cgroup/Example/
, чтобы получить только контроллеры, относящиеся к CPU:
──[[email protected]]-[~]
└─$echo "+cpu" >> /sys/fs/cgroup/Example/cgroup.subtree_control
┌──[[email protected]]-[~]
└─$echo "+cpuset" >> /sys/fs/cgroup/Example/cgroup.subtree_control
Создайте директорию /sys/fs/cgroup/Example/tasks/
. Директория /sys/fs/cgroup/Example/tasks/
определяет подгруппу и файлы, касающиеся только контроллеров cpu
и cpuset
.
┌──[[email protected]]-[~]
└─$mkdir /sys/fs/cgroup/Example/tasks/
┌──[[email protected]]-[~]
└─$cat /sys/fs/cgroup/Example/tasks/cgroup.controllers
cpuset cpu
┌──[[email protected]]-[~]
└─$
Настройте привязку CPU
┌──[[email protected]]-[~]
└─$echo "1" > /sys/fs/cgroup/Example/tasks/cpuset.cpus
┌──[[email protected]]-[~]
└─$
Пройдите тест сервиса httpd
┌──[[email protected]]-[~]
└─$systemctl enable --now httpd
┌──[[email protected]]-[~]
└─$pgrep httpd
879
1096
1098
1105
1106
11313
┌──[[email protected]]-[~]
└─$cat /proc/1105/status | grep Cpu
Cpus_allowed: 3
Cpus_allowed_list: 0-1
Добавьте PID сервиса в подгруппу Example/tasks
:
┌──[[email protected]]-[~]
└─$echo "1105" > /sys/fs/cgroup/Example/tasks/cgroup.procs
Проверьте конфигурацию
┌──[[email protected]]-[~]
└─$cat /proc/1105/status | grep Cpu
Cpus_allowed: 2
Cpus_allowed_list: 1
┌──[[email protected]]-[~]
└─$
┌──[[email protected]]-[~]
└─$printf "%032x\n" $((2**1))
00000000000000000000000000000002
Ответ или решение
Ситуация с отсутствием файла /sys/fs/cgroup/cpuset/cpuset.cpus
, несмотря на включенный контроллер cpuset
, может вызывать путаницу среди администраторов и разработчиков. Давайте разберемся в данной проблеме более подробно, учитывая версию ядра Linux и систему управления группами ресурсов (cgroup).
Причины отсутствия cpuset.cpus
Вы используете систему, работающую на основе cgroup версии 2, поскольку ваша версия ядра — 5.14.0. В этой версии контроллер cpuset
интегрирован в унифицированную систему управления ресурсами, и файлы, такие как cpuset.cpus
, более не предоставляются в привычном виде.
Разница между cgroup v1 и v2
-
Cgroup v1: В этой версии использование
cpuset
позволяет администраторам явно задавать диапазоны ЦПУ и памяти для процессов в пределах группы ресурсов. В этой модели присутствует файл/sys/fs/cgroup/cpuset/cpuset.cpus
, в котором перечисляются доступные ЦПУ. -
Cgroup v2: В этой версии подход к управлению ресурсами стал более интегрированным. В ней нет отдельного контроллера
cpuset
, и управление ресурсами осуществляется через другие контроллеры, такие какcpu
,memory
и другие. Вместо этого в cgroup v2 используется файл/sys/fs/cgroup/cpuset.cpus.effective
, который показывает, какие ЦПУ доступны для использования, но его нельзя изменять напрямую.
Проверка текущей версии cgroup
Для проверки используемой версии cgroup вы можете выполнить команду:
mount -t cgroup2
Если система отображает cgroup v2, это подтверждает, что функциональность контроллера cpuset
не имеет того же доступа, как в v1.
Выводы
-
Отсутствие файла
/sys/fs/cgroup/cpuset/cpuset.cpus
:- Это нормальная ситуация для систем, использующих cgroup v2, так как поддержка контроллера
cpuset
не отделена, а интегрирована в другие ресурсоемкие контроллеры.
- Это нормальная ситуация для систем, использующих cgroup v2, так как поддержка контроллера
-
Использование файлов в cgroup v2:
- Вместо изменения файлов, как в v1, вам необходимо использовать другие механизмы для задания ограничений на использование ЦПУ и выделение памяти через создание подгрупп и включение контроллеров в дереве cgroup.
-
Дальнейшие действия:
- Чтобы управлять доступными ЦПУ, создавая подгруппы и настраивая их через другие доступные контроллеры, вам следует обратиться к документации, касающейся cgroup v2 и управляющих команд, таких как
systemd
, если вы используете его для управления службами.
- Чтобы управлять доступными ЦПУ, создавая подгруппы и настраивая их через другие доступные контроллеры, вам следует обратиться к документации, касающейся cgroup v2 и управляющих команд, таких как
Заключение
При работе с cgroup v2 важно адаптироваться к нововведениям системы управления ресурсами. Переход от v1 к v2 привнес изменения, которые потенциально упрощают управление ресурсами в Linux, но требуют нового подхода к контролю и мониторингу. Если у вас есть дополнительные вопросы или нужна помощь в настройке, не стесняйтесь обращаться за поддержкой.