cpuset включен, /sys/fs/cgroup/cpuset/cpuset.cpus не найден

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

Мой контроллер 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

  1. Cgroup v1: В этой версии использование cpuset позволяет администраторам явно задавать диапазоны ЦПУ и памяти для процессов в пределах группы ресурсов. В этой модели присутствует файл /sys/fs/cgroup/cpuset/cpuset.cpus, в котором перечисляются доступные ЦПУ.

  2. Cgroup v2: В этой версии подход к управлению ресурсами стал более интегрированным. В ней нет отдельного контроллера cpuset, и управление ресурсами осуществляется через другие контроллеры, такие как cpu, memory и другие. Вместо этого в cgroup v2 используется файл /sys/fs/cgroup/cpuset.cpus.effective, который показывает, какие ЦПУ доступны для использования, но его нельзя изменять напрямую.

Проверка текущей версии cgroup

Для проверки используемой версии cgroup вы можете выполнить команду:

mount -t cgroup2

Если система отображает cgroup v2, это подтверждает, что функциональность контроллера cpuset не имеет того же доступа, как в v1.

Выводы

  1. Отсутствие файла /sys/fs/cgroup/cpuset/cpuset.cpus:

    • Это нормальная ситуация для систем, использующих cgroup v2, так как поддержка контроллера cpuset не отделена, а интегрирована в другие ресурсоемкие контроллеры.
  2. Использование файлов в cgroup v2:

    • Вместо изменения файлов, как в v1, вам необходимо использовать другие механизмы для задания ограничений на использование ЦПУ и выделение памяти через создание подгрупп и включение контроллеров в дереве cgroup.
  3. Дальнейшие действия:

    • Чтобы управлять доступными ЦПУ, создавая подгруппы и настраивая их через другие доступные контроллеры, вам следует обратиться к документации, касающейся cgroup v2 и управляющих команд, таких как systemd, если вы используете его для управления службами.

Заключение

При работе с cgroup v2 важно адаптироваться к нововведениям системы управления ресурсами. Переход от v1 к v2 привнес изменения, которые потенциально упрощают управление ресурсами в Linux, но требуют нового подхода к контролю и мониторингу. Если у вас есть дополнительные вопросы или нужна помощь в настройке, не стесняйтесь обращаться за поддержкой.

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

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