Man page - cgroups(7)
Packages contains this manual
- shm_overview(7)
- nss(5)
- proc_mtrr(5)
- intro(7)
- tcp(7)
- iso_8859-9(7)
- armscii-8(7)
- proc_kpagecount(5)
- initrd(4)
- mouse(4)
- proc_stat(5)
- x25(7)
- proc_interrupts(5)
- fifo(7)
- repertoiremap(5)
- icmp(7)
- futex(7)
- feature_test_macros(7)
- lp(4)
- bpf-helpers(7)
- epoll(7)
- proc_sys_dev(5)
- namespaces(7)
- proc_sysrq-trigger(5)
- proc_bus(5)
- cp1251(7)
- proc_pid_maps(5)
- proc_sys_vm(5)
- proc_pid_projid_map(5)
- st(4)
- proc_pid(5)
- issue(5)
- pid_namespaces(7)
- unicode(7)
- inode(7)
- hosts.equiv(5)
- iso-8859-13(7)
- proc_fb(5)
- proc_modules(5)
- proc_pid_autogroup(5)
- keyrings(7)
- sysvipc(7)
- proc_kmsg(5)
- cgroups(7)
- latin6(7)
- proc_pid_uid_map(5)
- unix(7)
- proc_pid_io(5)
- pts(4)
- packet(7)
- ld-linux.so(8)
- tzselect(8)
- iconv(1)
- proc_pid_syscall(5)
- proc_pid_net(5)
- proc_pid_pagemap(5)
- tty(4)
- proc_profile(5)
- standards(7)
- proc_pid_mounts(5)
- filesystems(5)
- iso-8859-15(7)
- locale(5)
- iso_8859_3(7)
- xattr(7)
- iso-8859-2(7)
- proc_uptime(5)
- persistent-keyring(7)
- credentials(7)
- proc_pid_timers(5)
- utmpx(5)
- vcsa(4)
- proc_pid_exe(5)
- proc_net(5)
- proc_timer_stats(5)
- ip(7)
- proc_pid_fd(5)
- ptmx(4)
- user_namespaces(7)
- resolv.conf(5)
- url(7)
- iso_8859_5(7)
- iso_8859-8(7)
- urn(7)
- process-keyring(7)
- proc_pid_auxv(5)
- proc_ksyms(5)
- proc_ide(5)
- veth(4)
- ldd(1)
- proc_swaps(5)
- landlock(7)
- proc_vmstat(5)
- system_data_types(7)
- cp1252(7)
- lirc(4)
- proc_kpageflags(5)
- random(7)
- precedence(7)
- cpuset(7)
- proc_pid_ns(5)
- acct(5)
- latin4(7)
- proc_pid_cgroup(5)
- proc_cpuinfo(5)
- iso_8859-2(7)
- proc_keys(5)
- charsets(7)
- pldd(1)
- proc_pid_stat(5)
- rtnetlink(7)
- netlink(7)
- ram(4)
- mem(4)
- iso-8859-6(7)
- proc_key-users(5)
- iso_8859_15(7)
- fanotify(7)
- proc_sys_net(5)
- sysfs(5)
- math_error(7)
- latin1(7)
- proc_pid_root(5)
- nptl(7)
- proc_cgroups(5)
- proc_iomem(5)
- proc_pid_statm(5)
- sem_overview(7)
- hier(7)
- full(4)
- proc_pid_status(5)
- proc_pid_cwd(5)
- proc_pid_cpuset(5)
- proc_scsi(5)
- uri(7)
- proc_diskstats(5)
- iso_8859_6(7)
- latin2(7)
- latin5(7)
- man-pages(7)
- ld.so(8)
- uts_namespaces(7)
- proc_pid_mountstats(5)
- intro(3)
- proc_pid_seccomp(5)
- proc_pid_wchan(5)
- attributes(7)
- symlink(7)
- mount_namespaces(7)
- charmap(5)
- tis-620(7)
- iso-8859-10(7)
- getent(1)
- proc_buddyinfo(5)
- ttytype(5)
- rtc(4)
- proc_malloc(5)
- suffixes(7)
- sln(8)
- signal(7)
- proc_sys_abi(5)
- signal-safety(7)
- time_namespaces(7)
- proc_pid_comm(5)
- raw(7)
- gai.conf(5)
- proc_crypto(5)
- locale(1)
- iso-8859-3(7)
- motd(5)
- proc_meminfo(5)
- iso-8859-8(7)
- protocols(5)
- proc_pid_map_files(5)
- pthreads(7)
- null(4)
- proc(5)
- zdump(8)
- socket(7)
- proc_sys_kernel(5)
- ddp(7)
- memusagestat(1)
- hd(4)
- iso-8859-14(7)
- shells(5)
- pipe(7)
- glob(7)
- proc_self(5)
- network_namespaces(7)
- utmp(5)
- proc_kcore(5)
- nsswitch.conf(5)
- sd(4)
- iso-8859-5(7)
- iso_8859_16(7)
- man(7)
- iso_8859-6(7)
- dir_colors(5)
- mq_overview(7)
- vsock(7)
- ascii(7)
- thread-keyring(7)
- fs(5)
- proc_pid_attr(5)
- proc_sys_debug(5)
- proc_sys(5)
- proc_pid_cmdline(5)
- pty(7)
- services(5)
- cgroup_namespaces(7)
- securetty(5)
- netdevice(7)
- iso_8859_13(7)
- host.conf(5)
- proc_pid_setgroups(5)
- proc_slabinfo(5)
- sock_diag(7)
- iso_8859-14(7)
- iso-8859-11(7)
- iso_8859_11(7)
- operator(7)
- regex(7)
- wavelan(4)
- proc_sys_fs(5)
- nologin(5)
- proc_pci(5)
- koi8-r(7)
- erofs(5)
- intro(2)
- utf8(7)
- proc_kallsyms(5)
- proc_sysvipc(5)
- queue(7)
- proc_sys_sunrpc(5)
- intro(5)
- latin8(7)
- mtrace(1)
- ipc_namespaces(7)
- dsp56k(4)
- iso_8859_4(7)
- proc_pid_smaps(5)
- proc_cmdline(5)
- rpc(5)
- proc_tty(5)
- proc_version(5)
- smartpqi(4)
- proc_pid_timerslack_ns(5)
- aio(7)
- session-keyring(7)
- resolver(5)
- slabinfo(5)
- wtmp(5)
- iso_8859_9(7)
- proc_locks(5)
- mailaddr(7)
- proc_pid_oom_score(5)
- kmem(4)
- iconvconfig(8)
- iso_8859-7(7)
- glibc(7)
- hostname(7)
- proc_thread-self(5)
- ipv6(7)
- iso_8859_7(7)
- proc_kpagecgroup(5)
- core(5)
- time(7)
- units(7)
- proc_dma(5)
- loop(4)
- address_families(7)
- zero(4)
- intro(4)
- procfs(5)
- iso_8859-4(7)
- vdso(7)
- tmpfs(5)
- iso-8859-16(7)
- iso_8859_10(7)
- user-session-keyring(7)
- libc(7)
- proc_fs(5)
- koi8-u(7)
- latin3(7)
- proc_tid_children(5)
- proc_pid_limits(5)
- proc_pid_coredump_filter(5)
- iso_8859-15(7)
- arp(7)
- urandom(4)
- iso_8859-10(7)
- hpsa(4)
- proc_pid_environ(5)
- boot(7)
- ftm(7)
- ld-linux(8)
- proc_driver(5)
- loop-control(4)
- iso_8859-16(7)
- proc_filesystems(5)
- tzfile(5)
- sprof(1)
- proc_pid_task(5)
- proc_pid_oom_score_adj(5)
- proc_mounts(5)
- iso-8859-4(7)
- iso_8859-1(7)
- utf-8(7)
- iso_8859-13(7)
- intro(6)
- proc_timer_list(5)
- rtld-audit(7)
- iso_8859-3(7)
- group(5)
- sched(7)
- proc_pid_clear_refs(5)
- hosts(5)
- iso_8859-11(7)
- numa(7)
- iso_8859_2(7)
- locale(7)
- iso-8859-1(7)
- fuse(4)
- proc_tid(5)
- proc_execdomains(5)
- proc_pid_mountinfo(5)
- intro(8)
- iso_8859_8(7)
- proc_loadavg(5)
- proc_pid_oom_adj(5)
- re_format(7)
- iso_8859_14(7)
- zic(8)
- bootparam(7)
- inotify(7)
- posixoptions(7)
- proc_partitions(5)
- iso-8859-9(7)
- proc_pid_mem(5)
- networks(5)
- proc_sys_user(5)
- udp(7)
- proc_zoneinfo(5)
- latin10(7)
- proc_pid_fdinfo(5)
- proc_pid_stack(5)
- memusage(1)
- spufs(7)
- pkeys(7)
- path_resolution(7)
- proc_ioports(5)
- intro(1)
- ldconfig(8)
- msr(4)
- svipc(7)
- port(4)
- proc_pid_personality(5)
- cciss(4)
- latin9(7)
- capabilities(7)
- localedef(1)
- vcs(4)
- iso_8859-5(7)
- elf(5)
- proc_sys_proc(5)
- console_codes(4)
- random(4)
- iso-8859-7(7)
- termcap(5)
- cpuid(4)
- environ(7)
- string_copying(7)
- proc_pid_gid_map(5)
- queue(3)
- termio(7)
- user-keyring(7)
- complex(7)
- latin7(7)
- proc_config.gz(5)
- udplite(7)
- kernel_lockdown(7)
- proc_devices(5)
- proc_apm(5)
- iso_8859_1(7)
- proc_pid_numa_maps(5)
apt-get install manpages
Available languages:
en fr sv ruManual
cgroups
NOMDESCRIPTION
Terminologie
Cgroups version 1 et version 2
CGROUPS VERSION 1
TĂąches (threads) versus processus
Montage de contrĂŽleurs version 1
Démontage des contrÎleurs version 1
ContrÎleurs de cgroups version 1
Création de cgroups et déplacement de processus
Suppression de cgroups
Notification de publication de cgroups version 1
Hiérarchies nommées de cgroups version 1
CGROUPS VERSION 2
Hiérarchie unifiée de cgroups version 2
Options de montage pour cgroups version 2
ContrÎleurs de cgroups version 2
ContrĂŽle de sous-arbres de cgroups version 2
RÚgle « pas de processus internes » pour cgroups version 2
Fichier cgroup.events de cgroups version 2
Notification de libération de cgroups version 2
Fichier cgroup.stat de cgroups version 2
Limitation du nombre de cgroups descendants
DĂLĂGATION DE CGROUPS Ă UN UTILISATEUR AVEC DES PRIVILĂGES MOINDRES
Délégation de cgroups version 2 : nsdelegate et espace de noms cgroup
RÚgles de confinement de délégation de cgroup
MODE THREAD DE CGROUPS VERSION 2
Threaded versus contrĂŽleurs de domaine
CrĂ©ation dâun sous-arbre threaded
Utilisation de sous-arbre threaded
RÚgles pour écrire dans cgroup.type et créer des sous-arbres threaded
Le type « domain threaded » de cgroup
Exceptions pour le cgroup racine
Le contrÎleur « cpu » de cgroups version 2 et les threads en temps réel
ERREURS
NOTES
Fichiers /proc
Fichiers /sys/kernel/cgroup
VOIR AUSSI
TRADUCTION
NOM
cgroups â Groupes de contrĂŽle de Linux
DESCRIPTION
Les groupes de contrĂŽle, habituellement appelĂ©s cgroups, sont une fonctionnalitĂ© du noyau Linux qui permet dâorganiser les processus en groupes hiĂ©rarchiques afin de limiter et de superviser leur utilisation de types divers de ressource. Lâinterface cgroup du noyau est fournie Ă travers un pseudo-systĂšme de fichiers appelĂ© cgroupfs. Le regroupement est implĂ©mentĂ© dans le code central cgroup du noyau, tandis que le suivi et les limites de ressources sont implĂ©mentĂ©s dans un ensemble de sous-systĂšmes de type par ressource (mĂ©moire, CPU, etc.).
Terminologie
Un cgroup est une collection de processus qui sont liĂ©s Ă un ensemble de limites ou de paramĂštres dĂ©finis Ă lâaide du systĂšme de fichiers cgroup.
Un sous-systĂšme est un composant du noyau qui modifie le comportement des processus dans un cgroup. Divers sous-systĂšmes ont Ă©tĂ© implĂ©mentĂ©s, rendant possible de faire des choses comme la limitation de temps CPU et de mĂ©moire disponibles pour un cgroup, la comptabilisation du temps CPU utilisĂ© dans un cgroup et le gel ou la reprise de lâexĂ©cution des processus dans un cgroup. Les sous-systĂšmes sont parfois connus comme contrĂŽleurs de ressource (ou simplement, contrĂŽleurs).
Les cgroups pour un contrĂŽleur sont agencĂ©s dans une hiĂ©rarchie . Celle-ci est dĂ©finie en crĂ©ant, supprimant et renommant des sous-rĂ©pertoires dans le systĂšme de fichiers cgroup. Ă chaque niveau de la hiĂ©rarchie, des attributs (par exemple, des limites) peuvent ĂȘtre dĂ©finis. Les limites, le contrĂŽle et la comptabilisation fournis par les cgroups ont gĂ©nĂ©ralement des effets partout dans la sous-hiĂ©rarchie du cgroup oĂč les attributs sont dĂ©finis. Par consĂ©quent, par exemple, les limites placĂ©es dans un cgroup dâun niveau supĂ©rieur dans la hiĂ©rarchie ne peuvent ĂȘtre franchies par des cgroups descendants.
Cgroups version 1 et version 2
La publication initiale de lâimplĂ©mentation des cgroups a Ă©tĂ© faite dans Linux 2.6.24. Au cours du temps, divers contrĂŽleurs de cgroup ont Ă©tĂ© ajoutĂ©s pour permettre la gestion de divers types de ressources. Cependant, le dĂ©veloppement de ces contrĂŽleurs nâa pas Ă©tĂ© coordonnĂ© en grande partie avec pour rĂ©sultat lâapparition de nombreuses incohĂ©rences entre les contrĂŽleurs et une complexitĂ© accrue de la gestion des hiĂ©rarchies de cgroup. Une description plus complĂšte de ces problĂšmes peut ĂȘtre trouvĂ©e dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v2.rst (ou Documentation/cgroup-v2.txt dans Linux version 4.17 et prĂ©cĂ©dentes).
Ă cause des problĂšmes avec lâimplĂ©mentation initiale des cgroups (cgroups version 1), des travaux ont commencĂ©, Ă partir de Linux 3.10, sur une nouvelle implĂ©mentation indĂ©pendante pour remĂ©dier Ă ces problĂšmes. Au dĂ©part marquĂ©e comme expĂ©rimentale, et dissimulĂ©e derriĂšre lâoption de montage -o __DEVEL__sane_behavior , la nouvelle version (cgroups version 2) est devenue finalement officielle avec la publication de Linux 4.5. Les diffĂ©rences entre les deux versions sont dĂ©crites dans le texte qui suit. Le fichier cgroup.sane_behavior , prĂ©sent dans cgroups version 1, est un vestige de cette option de montage. Le fichier indique toujours « 0 » et nâest conservĂ© que pour la rĂ©trocompatibilitĂ©.
Bien que cgroups version 2 soit destinĂ© Ă remplacer la version 1, lâancien systĂšme continue Ă exister (et pour des raisons de compatibilitĂ©, ne sera vraisemblablement pas supprimĂ©). Actuellement, cgroups version 2 implĂ©mente un sous-ensemble de contrĂŽleurs disponibles dans cgroups version 1. Les deux systĂšmes sont implĂ©mentĂ©s de façon que les contrĂŽleurs version 1 et 2 puissent ĂȘtre montĂ©s sur le mĂȘme systĂšme. Ainsi, par exemple, il est possible dâutiliser les contrĂŽleurs qui sont pris en charge par la version 2, tout en utilisant aussi des contrĂŽleurs version 1 lĂ oĂč la version 2 ne les prend pas encore en charge. La seule restriction ici est quâun contrĂŽleur ne peut pas ĂȘtre employĂ© simultanĂ©ment dans une hiĂ©rarchie de cgroups version 1 et dans une hiĂ©rarchie de cgroups version 2.
CGROUPS VERSION 1
Sous cgroups version 1, chaque contrĂŽleur peut ĂȘtre montĂ© pour un systĂšme de fichiers cgroup distinct qui fournit sa propre organisation hiĂ©rarchique des processus dans le systĂšme. Il est aussi possible de co-monter plusieurs (et mĂȘme tous) les contrĂŽleurs de cgroups version 1 pour le mĂȘme systĂšme de fichiers cgroup, ce qui signifie que les contrĂŽleurs co-montĂ©s gĂšrent la mĂȘme organisation hiĂ©rarchique des processus.
Pour chaque hiĂ©rarchie montĂ©e, lâarbre de rĂ©pertoires reflĂšte la hiĂ©rarchie de groupes de contrĂŽle. Chaque groupe de contrĂŽle est reprĂ©sentĂ© par un rĂ©pertoire, avec chaque cgroup de contrĂŽle enfant reprĂ©sentĂ© par un rĂ©pertoire enfant. Par exemple, /user/joe/1.session reprĂ©sente le groupe de contrĂŽle 1.session , qui est un enfant du cgroup joe , qui est un enfant de /user . Sous chaque rĂ©pertoire cgroup existe un ensemble de fichiers qui peuvent ĂȘtre lus ou Ă©crits, reflĂ©tant les limites de ressources et quelques propriĂ©tĂ©s gĂ©nĂ©rales du cgroup.
TĂąches (threads) versus processus
Dans cgroups version 1, une distinction est faite entre les processus et les tĂąches . De ce fait, un processus peut consister en plusieurs tĂąches (plus couramment appelĂ©es threads, du point de vue espace utilisateur, et appelĂ©es ainsi dans la suite de cette page de manuel). Dans cgroups version 1, il est possible de manipuler indĂ©pendamment lâappartenance de cgroup des threads dâun processus.
La capacitĂ© de cgroups version 1 de rĂ©partir les threads dans des cgroups diffĂ©rents cause des problĂšmes dans certains cas. Par exemple, cela nâa aucun sens pour le contrĂŽleur de mĂ©moire , puisque tous les threads dâun processus partagent un mĂȘme espace dâadressage. Ă cause de cela, la capacitĂ© de manipuler indĂ©pendamment lâappartenance de cgroup des threads dans un processus a Ă©tĂ© retirĂ©e dans lâimplĂ©mentation initiale de cgroups version 2, et ultĂ©rieurement restaurĂ©e dans une forme plus limitĂ©e (voir lâexplication sur le « mode threads » ci-aprĂšs).
Montage de contrĂŽleurs version 1
Lâutilisation de cgroups requiert un noyau construit avec lâoption CONFIG_CGROUP . De plus, chaque contrĂŽleur version 1 possĂšde une option de configuration associĂ©e qui doit ĂȘtre dĂ©finie pour utiliser ce contrĂŽleur.
Pour utiliser un contrĂŽleur version 1, il doit ĂȘtre montĂ© pour un systĂšme de fichiers de cgroup. Lâemplacement habituel de tels montages est sous le systĂšme de fichiers tmpfs (5) montĂ© dans /sys/fs/cgroup . Par consĂ©quent, un montage du contrĂŽleur cpu peut ĂȘtre rĂ©alisĂ© ainsi :
mount -t cgroup -o cpu none /sys/fs/cgroup/cpu
Il est possible de co-monter plusieurs contrĂŽleurs pour la mĂȘme hiĂ©rarchie. Ici par exemple, les contrĂŽleurs cpu et cpuacct sont co-montĂ©s pour une mĂȘme hiĂ©rarchie :
mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct
Le co-montage de contrĂŽleurs fait quâun processus est dans le mĂȘme cgroup pour tous les contrĂŽleurs co-montĂ©s. SĂ©parer le montage de contrĂŽleurs permet Ă un processus dâĂȘtre dans le cgroup /toto1 pour un contrĂŽleur tout en Ă©tant dans /toto2/toto3 pour un autre.
Il est possible de co-monter tous les contrĂŽleurs version 1 pour la mĂȘme hiĂ©rarchie :
mount -t cgroup -o all cgroup /sys/fs/cgroup
(Le mĂȘme rĂ©sultat peut ĂȘtre obtenu en omettant -o all , puisque câest le comportement par dĂ©faut si aucun contrĂŽleur nâest explicitement prĂ©cisĂ©.)
Il nâest pas possible de monter le mĂȘme contrĂŽleur pour plusieurs hiĂ©rarchies de cgroup. Par exemple, il nâest pas possible de monter Ă la fois les contrĂŽleurs cpu et cpuacct pour une mĂȘme hiĂ©rarchie et de monter le contrĂŽleur cpu seul pour une autre hiĂ©rarchie. Il est possible de crĂ©er plusieurs montages avec exactement le mĂȘme ensemble de contrĂŽleurs co-montĂ©s. Dans ce cas cependant, tout cela aboutit Ă ce que plusieurs points de montage fournissent une vue de la mĂȘme hiĂ©rarchie.
Remarquez que sur de nombreux systÚmes, les contrÎleurs version 1 sont automatiquement montés sous /sys/fs/cgroup . En particulier, systemd (1) crée automatiquement de tels montages.
Démontage des contrÎleurs version 1
Un systĂšme de fichiers cgroup montĂ© peut ĂȘtre dĂ©montĂ© en utilisant la commande umount (8) comme dans lâexemple suivant :
umount /sys/fs/cgroup/pids
Bien remarquer quâun systĂšme de fichiers de cgroup est dĂ©montĂ© seulement sâil nâest pas en cours dâutilisation, câest-Ă -dire quâil nâa pas de cgroups enfants. Si ce nâest pas le cas, le seul effet de umount (8) est de rendre le montage invisible. Par consĂ©quent, pour ĂȘtre sĂ»r que le montage est rĂ©ellement retirĂ©, les cgroups enfants doivent dâabord ĂȘtre retirĂ©s, ce qui Ă son tour ne peut ĂȘtre fait quâaprĂšs que tous les processus membres ont Ă©tĂ© dĂ©placĂ©s de ces cgroups vers le cgroup racine.
ContrÎleurs de cgroups version 1
Chacun de ces
contrÎleurs de cgroups version 1 est régi
par une option de configuration du noyau (liste
ci-aprÚs). De plus, la disponibilité de la
fonctionnalité des cgroups est régie par
lâoption de configuration
CONFIG_CGROUPS
du
noyau.
cpu
(depuis Linux 2.6.24 ;
CONFIG_CGROUP_SCHED
)
Un nombre minimal de « partages de CPU » peut ĂȘtre garanti quand un systĂšme est actif. Cela ne limite pas lâutilisation de CPU par un cgroup si les CPU ne sont pas actifs. Pour plus dâinformations, consultez Documentation/scheduler/sched-design-CFS.rst (ou Documentation/scheduler/sched-design-CFS.txt dans Linux 5.2 et les versions antĂ©rieures).
Dans Linux 3.2, ce contrĂŽleur a Ă©tĂ© Ă©tendu pour fournir un contrĂŽle de la « bande passante » du CPU. Si le noyau est configurĂ© avec CONFIG_CFS_BANDWIDTH , il est possible de dĂ©finir une limite haute du temps CPU allouĂ© aux processus dâun cgroup Ă chaque pĂ©riode de planification (dĂ©finie Ă lâaide dâun fichier dans le rĂ©pertoire de cgroup). La limite haute sâapplique mĂȘme sâil nâexiste aucune compĂ©tition pour le CPU. Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/scheduler/sched-bwc.rst (ou Documentation/scheduler/sched-bwc.txt dans Linux 5.2 et les versions antĂ©rieures).
cpuacct (depuis 2.6.24 ; CONFIG_CGROUP_CPUACCT )
Ce contrĂŽleur fournit la comptabilisation de lâutilisation du CPU par des groupes de processus.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/cpuacct.rst (ou Documentation/cgroup-v1/cpuacct.txt dans Linux 5.2 et les versions antĂ©rieures).
cpuset (depuis Linux 2.6.24 ; CONFIG_CPUSETS )
Ce cgroup peut ĂȘtre utilisĂ© pour lier les processus dans un cgroup Ă un ensemble spĂ©cifiĂ© de CPU ou de nĆuds NUMA.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/cpusets.rst (ou Documentation/cgroup-v1/cpusets.txt dans Linux 5.2 et les versions prĂ©cĂ©dentes).
memory (depuis Linux 2.6.25 ; CONFIG_MEMCG )
Le contrĂŽleur de mĂ©moire prend en charge le rapport et la limitation de la mĂ©moire du processus, de la mĂ©moire du noyau et de la partition dâĂ©change utilisĂ©es par les cgroups.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/memory.rst (ou Documentation/cgroup-v1/memory.txt dans Linux 5.2 et les versions antĂ©rieures).
devices (depuis Linux 2.6.26 ; CONFIG_CGROUP_DEVICE )
Ce contrĂŽleur prend en charge la dĂ©finition des processus qui pourront crĂ©er (mknod) des pĂ©riphĂ©riques et les ouvrir en lecture ou Ă©criture. Les politiques peuvent ĂȘtre prĂ©cisĂ©es dans des listes dâautorisations ou de refus. La hiĂ©rarchie est imposĂ©e, aussi des rĂšgles nouvelles ne doivent pas violer les rĂšgles existantes pour la cible ou pour des cgroups ancĂȘtres.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/devices.rst (ou Documentation/cgroup-v1/devices.txt dans Linux 5.2 et les versions antĂ©rieures).
freezer (depuis Linux 2.6.28 ; CONFIG_CGROUP_FREEZER )
Le cgroup freezer peut suspendre ou restaurer (reprendre) tous les processus dâun cgroup. Geler un cgroup /A fait que ses enfants, par exemple les processus dans /A/B , sont gelĂ©s.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/freezer-subsystem.rst (ou Documentation/cgroup-v1/freezer-subsystem.txt dans Linux 5.2 et les versions antĂ©rieures).
net_cls (depuis Linux 2.6.29 ; CONFIG_CGROUP_NET_CLASSID )
Ce contrĂŽleur place un identificateur de classe (classid), prĂ©cisĂ© pour le cgroup, sur des paquets rĂ©seau créés par un cgroup. Ces identificateurs peuvent ĂȘtre utilisĂ©s dans des rĂšgles de pare-feu, ainsi que pour canaliser le trafic en utilisant tc (8). Cela sâapplique aux paquets quittant le cgroup, pas au trafic y arrivant.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/net_cls.rst (ou Documentation/cgroup-v1/net_cls.txt dans Linux 5.2 et les versions antĂ©rieures).
blkio (depuis Linux 2.6.33 ; CONFIG_BLK_CGROUP )
Le cgroup blkio contrĂŽle et limite lâaccĂšs aux pĂ©riphĂ©riques en mode bloc indiquĂ©s en appliquant un contrĂŽle dâE/S sous forme de restrictions et de limites dâaccĂšs Ă lâencontre de nĆuds feuilles et de nĆuds intermĂ©diaires dans la hiĂ©rarchie de stockage.
Deux politiques sont possibles. La premiĂšre est une division du disque proportionnelle au poids basĂ©e sur la durĂ©e et implĂ©mentĂ©e avec CFQ (Completely Fair Queuing â file dâattente complĂštement Ă©quitable). Câest le cas pour les nĆuds feuilles utilisant CFQ. La seconde est une politique dâĂ©tranglement qui prĂ©cise les limites supĂ©rieures de taux dâE/S sur un pĂ©riphĂ©rique.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/blkio-controller.rst (ou Documentation/cgroup-v1/blkio-controller.txt dans Linux 5.2 et les versions antĂ©rieures).
perf_event (depuis Linux 2.6.39 ; CONFIG_CGROUP_PERF )
Ce contrĂŽleur permet Ă perf de superviser lâensemble des processus groupĂ©s dans un cgroup.
Plus dâinformations sont disponibles dans le fichier des sources du noyau.
net_prio (depuis Linux 3.3 ; CONFIG_CGROUP_NET_PRIO )
Ce contrÎleur permet de définir des priorités par interface réseau pour les cgroups.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/net_prio.rst (ou Documentation/cgroup-v1/net_prio.txt dans Linux 5.2 et les versions antĂ©rieures).
hugetlb (depuis Linux 3.5 ; CONFIG_CGROUP_HUGETLB )
Ce contrĂŽleur prend en charge la limitation de lâutilisation de trĂšs grandes pages par les cgroups.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/hugetlb.rst (ou Documentation/cgroup-v1/hugetlb.txt dans Linux 5.2 et les versions antĂ©rieures).
pids (depuis Linux 4.3 ; CONFIG_CGROUP_PIDS )
Ce contrĂŽleur permet de limiter le nombre de processus pouvant ĂȘtre créés dans un cgroup (et ses descendants).
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/pids.rst (ou Documentation/cgroup-v1/pids.txt dans Linux 5.2 et les versions antĂ©rieures).
rdma (depuis Linux 4.11 ; CONFIG_CGROUP_RDMA )
Le contrĂŽleur RDMA permet de limiter lâutilisation de ressources spĂ©cifiques Ă RDMA/IB.
Plus dâinformations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/rdma.rst (ou Documentation/cgroup-v1/rdma.txt dans Linux 5.2 et les versions antĂ©rieures).
Création de cgroups et déplacement de processus
Un systÚme de fichiers de cgroup contient initialement un seul cgroup racine, « / », auquel tous les processus appartiennent. Un nouveau cgroup est créé en créant un répertoire dans le systÚme de fichiers de cgroup :
mkdir /sys/fs/cgroup/cpu/cg1
Cette commande crée un nouveau cgroup vide.
Un processus peut ĂȘtre transfĂ©rĂ© dans ce cgroup en Ă©crivant son PID dans le fichier cgroup.procs du cgroup :
echo $$ > /sys/fs/cgroup/cpu/cg1/cgroup.procs
Un seul PID Ă la fois peut ĂȘtre Ă©crit dans ce fichier.
Ăcrire la valeur 0 dans un fichier cgroup.procs fait que le processus Ă©crivain est transfĂ©rĂ© dans le cgroup correspondant.
Quand un PID est écrit dans le fichier cgroup.procs , tous les threads du processus sont transférés ensemble dans le nouveau cgroup.
Dans une hiĂ©rarchie, un processus peut ĂȘtre membre dâun et un seul cgroup. Ăcrire un PID de processus dans un fichier cgroup.procs le retire automatiquement du cgroup auquel il appartenait prĂ©cĂ©demment.
Le fichier cgroup.procs peut ĂȘtre lu pour obtenir une liste des processus qui sont membres dâun cgroup. Lâabsence de doublons dans la liste renvoyĂ©e des PID nâest pas garantie et cette derniĂšre ne sera pas forcĂ©ment triĂ©e. Par exemple, un PID peut ĂȘtre recyclĂ© pendant la lecture de la liste.
Dans cgroups version 1, un thread individuel peut ĂȘtre transfĂ©rĂ© dans un autre cgroup en Ă©crivant son ID de thread (câest-Ă -dire lâID de thread du noyau renvoyĂ© par clone (2) et gettid (2)) dans le fichier tasks dâun rĂ©pertoire de cgroup. Ce fichier peut ĂȘtre lu pour dĂ©couvrir lâensemble des threads membres du cgroup.
Suppression de cgroups
Pour supprimer un cgroup, il doit tout dâabord nâavoir aucun cgroup enfant et ne contenir aucun processus (non zombie). Tant que câest le cas, on peut simplement supprimer le nom de chemin de rĂ©pertoire correspondant. Remarquez que les fichiers dans le rĂ©pertoire de cgroup ne peuvent et nâont pas besoin dâĂȘtre supprimĂ©s.
Notification de publication de cgroups version 1
Deux fichiers peuvent ĂȘtre utilisĂ©s pour dĂ©terminer si le noyau fournit des notifications quand un cgroup devient vide. Un cgroup est considĂ©rĂ© comme vide quand il ne contient ni cgroup enfant, ni processus membre.
Un fichier spĂ©cial dans le rĂ©pertoire racine de chaque hiĂ©rarchie de cgroup, release_agent , peut ĂȘtre utilisĂ© pour enregistrer le nom de chemin dâun programme pouvant ĂȘtre invoquĂ© quand un cgroup dans la hiĂ©rarchie devient vide. Le nom de chemin du cgroup nouvellement vide (relatif au point de montage du cgroup) est fourni comme seul argument de ligne de commande quand le programme release_agent est invoquĂ©. Le programme release_agent pourrait supprimer le rĂ©pertoire du cgroup ou, peut ĂȘtre, le repeupler avec un processus.
Par dĂ©faut, le fichier release_agent est vide, signifiant quâaucun agent de publication nâest invoquĂ©.
Le contenu du fichier release_agent peut ĂȘtre spĂ©cifiĂ© Ă lâaide dâune option de montage quand le systĂšme de fichiers de cgroup est monté :
mount -o release_agent=pathname ...
Que le programme release_agent soit invoquĂ© ou pas quand un cgroup particulier devient vide est dĂ©terminĂ© par la valeur inscrite dans le fichier notify_on_release dans le rĂ©pertoire de cgroup correspondant. Si ce fichier contient la valeur 0, alors le programme release_agent nâest pas invoquĂ©. Si cette valeur est 1, le programme release_agent est invoquĂ©. La valeur par dĂ©faut inscrite dans ce fichier dans le cgroup racine est 0. Au moment de la crĂ©ation dâun nouveau cgroup, la valeur dans ce fichier est hĂ©ritĂ©e du fichier correspondant dans le cgroup parent.
Hiérarchies nommées de cgroups version 1
Dans cgroups version 1, il est possible de monter une hiĂ©rarchie de cgroup qui nâa pas de contrĂŽleurs attachĂ©s.
mount -t cgroup -o none,name=un_nom none /un/point/de/montage
Plusieurs instances de telles hiĂ©rarchies peuvent ĂȘtre montĂ©es, chaque hiĂ©rarchie devant avoir un nom unique. Le seul but de telles hiĂ©rarchies est de suivre les processus (consultez les explications de notification de publication ci-dessous). La hiĂ©rarchie de cgroup name=systemd qui est utilisĂ©e par systemd (1) pour suivre les services et les sessions dâutilisateur en est un exemple.
Depuis Linux 5.0, lâoption dâamorçage cgroup_no_v1 du noyau (dĂ©crite ci-aprĂšs) peut ĂȘtre utilisĂ©e pour dĂ©sactiver les hiĂ©rarchies nommĂ©es de cgroups version 1, en spĂ©cifiant cgroup_no_v1=named .
CGROUPS VERSION 2
Dans cgroups version 2, tous les contrĂŽleurs montĂ©s rĂ©sident dans une seule hiĂ©rarchie unifiĂ©e. Alors que des contrĂŽleurs (diffĂ©rents) peuvent ĂȘtre montĂ©s simultanĂ©ment dans des hiĂ©rarchies version 1 ou 2, il nâest pas possible de monter le mĂȘme contrĂŽleur simultanĂ©ment dans les deux hiĂ©rarchies version 1 et version 2.
Les nouveaux comportements dans cgroups version 2 sont résumés ici et, dans quelques cas, développés dans les sous-sections suivantes.
|
- |
Les cgroups version 2 fournissent une hiérarchie unifiée pour laquelle tous les contrÎleurs sont montés. |
||
|
- |
Les processus « internes » ne sont pas autorisĂ©s. Ă lâexception du cgroup racine, les processus ne peuvent rĂ©sider que dans les nĆuds feuilles (les cgroups qui ne contiennent pas eux-mĂȘmes de cgroups enfants). Les dĂ©tails sont un peu plus subtils que ça et sont dĂ©crits ci-aprĂšs. |
||
|
- |
Les cgroups actifs doivent ĂȘtre indiquĂ©s Ă lâaide des fichiers cgroup.controllers et cgroup.subtree_control . |
||
|
- |
Le fichier tasks et le fichier cgroup.clone_children qui est utilisé par le contrÎleur cpuset ont été supprimés. |
||
|
- |
Un mécanisme amélioré pour la notification de cgroups vides est fourni par le fichier cgroup.events . |
Pour plus de détails sur les modifications, consultez le fichier Documentation/admin-guide/cgroup-v2.rst dans les sources du noyau (ou Documentation/cgroup-v2.txt dans Linux 4.17 et les versions antérieures).
Certains de ces nouveaux comportements intĂšgrent une modification avec lâajout dans Linux 4.14 du « mode thread » (dĂ©crit ci-aprĂšs).
Hiérarchie unifiée de cgroups version 2
Dans les cgroups version 1, la possibilitĂ© de monter diffĂ©rents contrĂŽleurs pour diffĂ©rentes hiĂ©rarchies Ă©tait voulue pour permettre une grande flexibilitĂ© dans la conception des applications. En pratique, la flexibilitĂ© sâest avĂ©rĂ©e moins utile quâespĂ©rĂ©e et, dans de nombreux de cas, a ajoutĂ© de la complexitĂ©. Par consĂ©quent, dans cgroups version 2, tous les contrĂŽleurs disponibles sont montĂ©s pour une seule hiĂ©rarchie. Les contrĂŽleurs disponibles sont automatiquement montĂ©s, ce qui signifie quâil nâest pas nĂ©cessaire (ou possible) dâindiquer les contrĂŽleurs lors du montage dâun systĂšme de fichiers cgroups version 2 en utilisant une commande telle que la suivante :
mount -t cgroup2 none /mnt/cgroup2
Un contrĂŽleur cgroups version 2 est disponible seulement sâil nâest pas en cours dâutilisation Ă lâaide dâun montage pour une hiĂ©rarchie de cgroups version 1. Ou, pour dire les choses autrement, il nâest pas possible dâemployer le mĂȘme contrĂŽleur pour les deux hiĂ©rarchies version 1 et version 2 unifiĂ©e. Cela signifie quâil peut ĂȘtre nĂ©cessaire dâabord de dĂ©monter un contrĂŽleur version 1 (comme dĂ©crit ci-dessus) avant que ce contrĂŽleur soit disponible en version 2. Puisque systemd (1) utilise abondamment quelques contrĂŽleurs version 1 par dĂ©faut, il peut dans certains cas ĂȘtre plus simple dâamorcer le systĂšme avec ces contrĂŽleurs version 1 dĂ©sactivĂ©s. Pour ce faire, spĂ©cifier lâoption cgroup_no_v1=list sur la ligne de commande dâamorçage du noyau. list est une liste de noms sĂ©parĂ©s par des virgules des contrĂŽleurs Ă dĂ©sactiver ou le mot all pour dĂ©sactiver tous les contrĂŽleurs version 1. Cette situation est gĂ©rĂ©e correctement par systemd (1), ce qui revient Ă un amorçage sans ces contrĂŽleurs.
Remarquez que sur de nombreux systĂšmes modernes, systemd (1) monte automatiquement le systĂšme de fichiers cgroup2 dans /sys/fs/cgroup/unified lors du processus dâamorçage.
Options de montage pour cgroups version 2
Les options
suivantes (
mount -o
) peuvent ĂȘtre
spécifiées lors du montage de systÚmes
de fichiers de groupe version 2 :
nsdelegate
(depuis Linux 4.15)
Traitement des espaces de noms cgroup comme des limites de délégation. Pour plus de détails, voir ci-dessous.
memory_localevents (depuis Linux 5.2)
memory.events devrait afficher des statistiques seulement pour le cgroup lui-mĂȘme, pas pour les cgroups descendants. CâĂ©tait le comportement avant Linux 5.2. Depuis Linux 5.2, le comportement par dĂ©faut consiste Ă inclure des statistiques pour les cgroups descendants dans memory.events et cette option de montage peut ĂȘtre utilisĂ©e pour revenir au comportement traditionnel. Cette option sâapplique au systĂšme entier et peut ĂȘtre dĂ©finie au moment du montage ou modifiĂ©e Ă travers un remontage seulement Ă partir de lâespace de noms montage initial. Elle est silencieusement ignorĂ©e dans les espaces de noms non initiaux.
ContrÎleurs de cgroups version 2
Les
contrÎleurs suivants, documentés dans le
fichier source du noyau
Documentation/admin-guide/cgroup-v2.rst
(ou
Documentation/cgroup-v2.txt
dans Linux 4.17 et
les versions antérieures) sont pris en charge dans
cgroups version 2 :
cpu
(depuis Linux 4.15)
Câest le successeur des contrĂŽleurs version 1 cpu et cpuacct .
cpuset (depuis Linux 5.0)
Câest le successeur du contrĂŽleur version 1 cpuset .
freezer (depuis Linux 5.2)
Câest le successeur du contrĂŽleur version 1 freezer .
hugetlb (depuis Linux 5.6)
Câest le successeur du contrĂŽleur version 1 hugetlb .
io (depuis Linux 4.5)
Câest le successeur du contrĂŽleur version 1 blkio .
memory (depuis Linux 4.5)
Câest le successeur du contrĂŽleur version 1 memory .
perf_event (depuis Linux 4.11)
Identique au contrÎleur version 1 perf_event .
pids (depuis Linux 4.5)
Identique au contrÎleur version 1 pids .
rdma (depuis Linux 4.11)
Identique au contrÎleur version 1 rdma .
Il nâexiste pas dâĂ©quivalent direct des contrĂŽleurs net_cls et net_prio de cgroups version 1. Ă la place, une prise en charge a Ă©tĂ© ajoutĂ©e Ă iptables (8) pour permettre aux filtres eBPF qui sâattachent aux noms de chemin de cgroups version 2 de prendre des dĂ©cisions Ă partir du trafic rĂ©seau selon le cgroup.
Les contrĂŽleurs version 2 devices ne fournissent pas de fichiers dâinterface. Ă la place, le contrĂŽle de pĂ©riphĂ©rique est sĂ©curisĂ© en attachant un programme eBPF ( BPF_CGROUP_DEVICE ) Ă un cgroup version 2.
ContrĂŽle de sous-arbres de cgroups version 2
Chaque cgroup
dans une hiérarchie version 2 contient les deux
fichiers suivants :
cgroup.controllers
Ce fichier en lecture seule contient une liste des contrĂŽleurs qui sont disponibles dans ce cgroup. Le contenu de ce fichier correspond au contenu du fichier cgroup.subtree_control dans le cgroup parent.
cgroup.subtree_control
Ce fichier contient une liste de contrĂŽleurs qui sont actifs ( permis ) dans le cgroup. Lâensemble des contrĂŽleurs dans ce fichier est un sous-ensemble de lâensemble cgroup.controllers de ce cgroup. Lâensemble des contrĂŽleurs actifs est modifiĂ© en Ă©crivant des chaĂźnes dans ce fichier contenant des noms de contrĂŽleurs sĂ©parĂ©s par des espaces, chacun Ă©tant prĂ©cĂ©dĂ© par un « + » (pour autoriser le contrĂŽleur) ou un « - » (pour interdire le contrĂŽleur), comme dans lâexemple suivant :
echo '+pids -memory' > x/y/cgroup.subtree_control
Un essai pour autoriser un contrĂŽleur qui nâest pas prĂ©sent dans cgroup.controllers provoque une erreur ENOENT lors dâune Ă©criture dans le fichier cgroup.subtree_control .
Parce que la liste de contrĂŽleurs dans cgroup.subtree_control est un sous-ensemble de ces cgroup.controllers , un contrĂŽleur qui nâest plus autorisĂ© dans un cgroup de la hiĂ©rarchie ne peut jamais ĂȘtre rĂ©autorisĂ© dans un sous-arbre de ce cgroup.
Un fichier cgroup.subtree_control de cgroup dĂ©termine lâensemble des contrĂŽleurs qui sont activĂ©s dans les cgroups enfants . Quand un contrĂŽleur (par exemple, pids ) est prĂ©sent dans le fichier cgroup.subtree_control dâun cgroup parent, les fichiers correspondants interface-contrĂŽleur (par exemple, pids.max ) sont automatiquement créés dans lâenfant de ce cgroup et peuvent ĂȘtre utilisĂ©s pour exercer le contrĂŽle des ressources dans les cgroups enfants.
RÚgle « pas de processus internes » pour cgroups version 2
Cgroups version 2 applique une rĂšgle appelĂ©e « pas de processus internes ». En gros, cette rĂšgle veut dire que, Ă lâexception du cgroup racine, les processus ne peuvent rĂ©sider que dans les nĆuds feuilles (des cgroups ne contenant pas eux-mĂȘmes de cgroup enfant). Cela Ă©vite dâavoir Ă dĂ©cider comment partager les ressources entre les processus qui sont membres du cgroup A et les processus dans des cgroups enfants de A.
Par exemple, si le cgroup /cg1/cg2 existe, un processus peut rĂ©sider dans /cg1/cg2 , mais pas dans /cg1 . Cela permet dâĂ©viter une ambiguĂŻtĂ© dans cgroups version 1 par rapport Ă la dĂ©lĂ©gation de ressources entre les processus dans /cg1 et les cgroups enfants. Lâapproche recommandĂ©e dans cgroups version 2 consiste Ă crĂ©er un sous-rĂ©pertoire appelĂ© feuille pour nâimporte quel cgroup non feuille qui contiendrait des processus mais pas de cgroup enfant. Ainsi, les processus qui auparavant seraient allĂ©s dans /cg1 iraient maintenant dans /cg1/feuille . Cela a lâavantage de rendre explicite la relation entre les processus dans /cg1/feuille et les autres enfants de /cg1 .
La rĂšgle « pas de processus internes » est en fait plus subtile que ce qui est dĂ©crit ci-dessus. Plus prĂ©cisĂ©ment, la rĂšgle stipule quâun cgroup (non racine) ne peut pas Ă la fois avoir des processus membres et distribuer des ressources aux cgroups enfants â câest-Ă -dire avoir un fichier cgroup.subtree_control non vide. Par consĂ©quent, il est possible pour un cgroup dâavoir Ă la fois des processus membres et des cgroups enfants, mais pour que les contrĂŽleurs puissent ĂȘtre autorisĂ©s pour ce cgroup, les processus membres doivent ĂȘtre dĂ©placĂ©s en dehors du cgroup (par exemple, dans les cgroups enfants).
Avec lâaddition dans Linux 4.14 du « mode thread » (dĂ©crit ci-aprĂšs), la rĂšgle « pas de processus internes » a Ă©tĂ© assouplie dans certains cas.
Fichier cgroup.events de cgroups version 2
Chaque cgroup non racine dans la hiĂ©rarchie version 2 contient un fichier en lecture seule, cgroup.events , dont le contenu consiste en paires clĂ©-valeur (dĂ©limitĂ©es par des caractĂšres de nouvelle ligne, avec les clĂ©s et valeurs sĂ©parĂ©es par des espaces) fournissant des informations dâĂ©tat sur le cgroup :
$
cat
mygrp/cgroup.events
populated 1
frozen 0
Les clés
suivantes peuvent apparaßtre dans ce fichier :
populated
La valeur de cette clĂ© est soit 1 si ce cgroup ou nâimporte lequel de ses descendants a des processus membres, soit 0 dans le cas contraire.
frozen (depuis Linux 5.2)
La valeur de cette clĂ© est 1 si ce cgroup est actuellement gelĂ© ou 0 sâil ne lâest pas.
Le fichier cgroup.events peut ĂȘtre surveillĂ© dans le but de recevoir des notifications quand la valeur dâune des clĂ©s change. Cette surveillance peut ĂȘtre rĂ©alisĂ©e en utilisant inotify (7), qui notifie les changements tels que les Ă©vĂšnements IN_MODIFY ou poll (2) qui notifie les changements en renvoyant les bits POLLPRI et POLLERR dans le champ revents .
Notification de libération de cgroups version 2
Les cgroups version 2 fournissent un nouveau mĂ©canisme pour recevoir des notifications lorsquâun cgroup devient vide. Les fichiers cgroups version 1 release_agent et notify_on_release sont supprimĂ©s et remplacĂ©s par la clĂ© populated dans le fichier cgroup.events . Cette clĂ© a soit la valeur 0, signifiant que le cgroup (et ses descendants) ne contient aucun processus membre (non zombie), ou 1, signifiant que le cgroup (ou un de ses descendants) contient des processus membres.
Le mécanisme de notification de libération de cgroups version 2 offre les avantages suivants par rapport au mécanisme release_agent de cgroups version 1 :
|
- |
IL permet une notification moins coĂ»teuse puisquâun seul processus peut contrĂŽler plusieurs fichiers cgroup.events (en utilisant les techniques dĂ©crites prĂ©cĂ©demment). En revanche, le mĂ©canisme de cgroups version 1 requiert la charge de crĂ©er un processus pour chaque notification. |
||
|
- |
Les notifications pour des sous-hiĂ©rarchies diffĂ©rentes de cgroup peuvent ĂȘtre dĂ©lĂ©guĂ©es Ă des processus diffĂ©rents. En revanche, le mĂ©canisme de cgroups version 1 permet seulement un agent de notification pour la hiĂ©rarchie complĂšte. |
Fichier cgroup.stat de cgroups version 2
Chaque cgroup
dâune hiĂ©rarchie version 2 contient un
fichier
cgroup.stat
en lecture seule (introduit en
premier dans Linux 4.14) qui consiste en lignes
contenant des paires clé-valeur. Les clés
suivantes apparaissent actuellement dans ce fichier :
nr_descendants
Câest le nombre total de cgroups descendants visibles (câest-Ă -dire en vivants) en dessous de ce cgroup.
nr_dying_descendants
Câest le nombre de cgroups descendants mourants en dessous de ce cgroup. Un cgroup devient mourant aprĂšs avoir Ă©tĂ© supprimĂ©. Il reste dans cet Ă©tat pour une pĂ©riode indĂ©finie (qui dĂ©pend de la charge du systĂšme) pendant que les ressources sont libĂ©rĂ©es avant que le cgroup soit dĂ©truit. Remarquez que la prĂ©sence de quelques cgroups dans lâĂ©tat mourant est normal et nâindique pas un quelconque problĂšme.
Un processus ne peut devenir membre dâun cgroup mourant et celui-ci ne peut redevenir actif.
Limitation du nombre de cgroups descendants
Chaque cgroup
dans une hiérarchie version 2 contient les
fichiers suivants qui peuvent ĂȘtre utilisĂ©s
pour afficher et définir les limites du nombre de
cgroups descendants dans ce cgroup :
cgroup.max.depth
(depuis Linux 4.14)
Ce fichier dĂ©finit une limite sur le niveau dâimbrication de cgroups descendants. Une valeur de 0 dans ce fichier signifie quâaucun cgroup descendant ne peut ĂȘtre créé. Un essai de crĂ©ation dont le niveau dâimbrication excĂšde la limite Ă©chouera ( mkdir (2) Ă©choue avec lâerreur EAGAIN ).
Ăcrire la chaĂźne "max" dans ce fichier signifie quâaucune limite nâest imposĂ©e. La valeur par dĂ©faut dans ce fichier est "max" .
cgroup.max.descendants (depuis Linux 4.14)
Ce fichier dĂ©finit une limite du nombre de cgroups descendants actifs que ce cgroup peut possĂ©der. Un essai de crĂ©er plus de descendants quâautorisĂ©s par la limite Ă©choue ( mkdir (2) Ă©choue avec lâerreur EAGAIN ).
Ăcrire la chaĂźne "max" dans ce fichier signifie quâaucune limite nâest imposĂ©e. La valeur par dĂ©faut dans ce fichier est "max" .
DĂLĂGATION DE CGROUPS Ă UN UTILISATEUR AVEC DES PRIVILĂGES MOINDRES
Dans le contexte de cgroups, dĂ©lĂ©guer signifie transmettre la gestion dâun sous-arbre de la hiĂ©rarchie de cgroup Ă un utilisateur non privilĂ©giĂ©. Cgroups version 1 fournit une prise en charge de la dĂ©lĂ©gation basĂ©e sur les permissions de fichier dans la hiĂ©rarchie de cgroup, mais avec des rĂšgles de confinement moins strictes que dans la version 2 (comme signalĂ© ci-dessous). Cgroups version 2 gĂšre la dĂ©lĂ©gation avec confinement selon un modĂšle explicite. Lâexplication dans cette section se concentre sur la dĂ©lĂ©gation dans cgroups version 2, avec quelques diffĂ©rences pour cgroups version 1 signalĂ©es au fur et Ă mesure.
Un peu de terminologie est nĂ©cessaire pour expliquer la dĂ©lĂ©gation. Un dĂ©lĂ©gant est un utilisateur privilĂ©giĂ© (câest-Ă -dire le superutilisateur) qui possĂšde un cgroup parent. Un dĂ©lĂ©guĂ© est un utilisateur non privilĂ©giĂ© Ă qui sont accordĂ©es les permissions nĂ©cessaires pour gĂ©rer une sous-hiĂ©rarchie sous le cgroup parent, connue comme le sous-arbre dĂ©lĂ©guĂ© .
Pour
réaliser la délégation, le
dĂ©lĂ©gant autorise lâĂ©criture par
le délégué sur certains
répertoires et fichiers, typiquement en
transférant la propriété des objets
Ă lâID utilisateur du
délégué. En supposant une
délégation de hiérarchie de racine (par
exemple)
/dlgt_grp
et quâil nây a pas
encore de cgroup enfant sous ce cgroup, la
propriété de ce qui suit est
transfĂ©rĂ©e Ă lâID utilisateur du
délégué :
/dlgt_grp
Modifier le propriĂ©taire de la racine dâun sous-arbre signifie que nâimporte quel cgroup nouvellement créé dans ce sous-arbre (et les fichiers quâil contient) sera aussi la propriĂ©tĂ© du dĂ©lĂ©guĂ©.
/dlgt_grp/cgroup.procs
Modifier le propriétaire de ce fichier signifie que le délégué peut déplacer les processus dans la racine du sous-arbre délégué.
/dlgt_grp/cgroup.subtree_control (cgroups version 2 seulement)
Modifier le propriĂ©taire de ce fichier signifie que le dĂ©lĂ©guĂ© peut activer des contrĂŽleurs (qui sont prĂ©sents dans /dlgt_grp/cgroup.controllers ) dans le but dâune redistribution postĂ©rieure des ressources Ă des niveaux infĂ©rieurs du sous-arbre. Comme alternative au changement de propriĂ©taire de ce fichier, le dĂ©lĂ©gant pourrait Ă la place ajouter les contrĂŽleurs sĂ©lectionnĂ©s dans ce fichier.
/dlgt_grp/cgroup.threads (cgroups version 2 seulement)
Modifier le propriĂ©taire de ce fichier est nĂ©cessaire si un sous-arbre threaded est sous le coup dâune dĂ©lĂ©gation (consultez la description du « mode thread » ci-dessous). Cela permet au dĂ©lĂ©guĂ© dâĂ©crire des ID de thread dans ce fichier. Le propriĂ©taire de ce fichier peut ĂȘtre aussi changĂ© lors de la dĂ©lĂ©gation dâun sous-arbre de domaine, mais actuellement cela ne sert Ă rien puisque, comme dĂ©crit ci-dessous, il nâest pas possible de dĂ©placer un thread entre des cgroups de domaine en inscrivant son ID de thread dans le fichier cgroup.threads .
Pour les cgroups version 1, le fichier correspondant qui doit ĂȘtre dĂ©lĂ©guĂ© est le fichier tasks .
Le dĂ©lĂ©gant ne doit pas changer le propriĂ©taire de nâimporte quel fichier dâinterface de contrĂŽleur (par exemple, pids.max , memory.high ) dans dlgt_grp . Ces fichiers sont utilisĂ©s au niveau juste au-dessus du sous-arbre dĂ©lĂ©guĂ© dans le but de distribuer les ressources dans le sous-arbre, et le dĂ©lĂ©gant ne doit pas avoir la permission de modifier les ressources qui sont distribuĂ©es dans le sous-arbre dĂ©lĂ©guĂ©.
Consultez aussi lâexplication dans le fichier /sys/kernel/cgroup/delegate dans NOTES pour des informations sur les autres fichiers dĂ©lĂ©gables dans cgroups version 2.
AprĂšs que les Ă©tapes prĂ©citĂ©es aient Ă©tĂ© rĂ©alisĂ©es, le dĂ©lĂ©guĂ© peut crĂ©er des cgroups enfants dans le sous-arbre dĂ©lĂ©guĂ© (les sous-rĂ©pertoires et les fichiers de cgroup quâils contiennent seront la propriĂ©tĂ© du dĂ©lĂ©guĂ©) et dĂ©placer des processus entre des cgroups dans le sous-arbre. Si quelques contrĂŽleurs sont prĂ©sents dans dlgt_grp/cgroup.subtree_control , ou si la propriĂ©tĂ© de ce fichier a Ă©tĂ© transfĂ©rĂ©e au dĂ©lĂ©guĂ©, celui-ci peut aussi contrĂŽler une prochaine redistribution des ressources correspondantes dans le sous-arbre dĂ©lĂ©guĂ©.
Délégation de cgroups version 2 : nsdelegate et espace de noms cgroup
Depuis Linux 4.13, une seconde maniĂšre existe pour rĂ©aliser une dĂ©lĂ©gation de cgroup dans une hiĂ©rarchie de cgroups version 2. Cela est fait en montant ou remontant le systĂšme de fichiers de cgroups version 2 avec lâoption de montage nsdelegate . Par exemple, si un systĂšme de fichiers de cgroups version 2 a dĂ©jĂ Ă©tĂ© montĂ©, il est possible de le remonter avec lâoption nsdelegate comme suit :
mount -t
cgroup2 -o remount,nsdelegate \
none /sys/fs/cgroup/unified
Lâeffet de cette option de montage est que lâespace de noms cgroup deviennent automatiquement les limites de dĂ©lĂ©gation. Plus particuliĂšrement, les restrictions suivantes sâappliquent pour les processus Ă lâintĂ©rieur de lâespace de noms cgroup :
|
- |
Inscrire les fichiers des interfaces de contrĂŽleur dans le rĂ©pertoire racine de lâespace de noms Ă©chouera avec lâerreur EPERM . Les processus Ă lâintĂ©rieur de lâespace de noms cgroup peuvent toujours Ă©crire dans les fichiers dĂ©lĂ©gables dans le rĂ©pertoire racine de lâespace de noms cgroup tels que cgroup.procs et cgroup.subtree_control , et peuvent crĂ©er des sous-hiĂ©rarchies au-dessous du rĂ©pertoire racine. |
||
|
- |
Les essais de migrer des processus Ă travers des limites dâespace de noms sont interdits (avec lâerreur ENOENT ). Les processus Ă lâintĂ©rieur dâun espace de noms cgroup peuvent toujours (soumis aux rĂšgles de confinement dĂ©crites ci-aprĂšs) dĂ©placer des processus entre cgroups Ă lâintĂ©rieur de la sous-hiĂ©rarchie sous lâespace de noms racine. |
La possibilitĂ© de dĂ©finir des espaces de noms cgroup comme des limites de dĂ©lĂ©gation rend les espaces de noms cgroup beaucoup plus utiles. Pour en comprendre la raison, supposons quâil existe dĂ©jĂ une hiĂ©rarchie de cgroup qui a Ă©tĂ© dĂ©lĂ©guĂ©e Ă un utilisateur non privilĂ©giĂ©, cecilia , en utilisant la technique ancienne de dĂ©lĂ©gation dĂ©crite ci-dessus. Supposons que plus tard cecilia veuille dĂ©lĂ©guer une sous-hiĂ©rarchie sous la hiĂ©rarchie dĂ©lĂ©guĂ©e existante (par exemple, la hiĂ©rarchie dĂ©lĂ©guĂ©e peut ĂȘtre associĂ©e avec un conteneur non privilĂ©giĂ© exĂ©cutĂ© par cecilia ). MĂȘme si un espace de noms cgroup Ă©tait employĂ©, parce que les deux hiĂ©rarchies sont la propriĂ©tĂ© de lâutilisateur cecilia non privilĂ©giĂ©, les actions illĂ©gitimes suivantes pourraient ĂȘtre rĂ©alisĂ©es :
|
- |
Un processus dans la hiérarchie inférieure pourrait modifier les réglages du contrÎleur de ressources dans le répertoire racine de cette hiérarchie (ces réglages sont conçus pour permettre le contrÎle à exercer à partir du cgroup parent ; un processus dans le cgroup enfant ne devrait pas pouvoir les modifier) ; |
||
|
- |
un processus Ă lâintĂ©rieur de hiĂ©rarchie subalterne pourrait dĂ©placer des processus dans ou en dehors de la hiĂ©rarchie infĂ©rieure si les cgroups dans la hiĂ©rarchie supĂ©rieure Ă©taient de quelque façon visibles. |
Lâutilisation de lâoption de montage nsdelegate empĂȘche les deux possibilitĂ©s.
Lâoption de montage nsdelegate a seulement un effet lorsque elle est utilisĂ©e dans lâespace de noms initial montage, dans dâautres espaces de noms montage cette option est ignorĂ©e silencieusement.
Remarque : sur certains systĂšmes, systemd (1) monte automatiquement le systĂšme de fichiers de cgroup version 2. Dans le but de tester lâopĂ©ration nsdelegate , il peut ĂȘtre utile dâamorcer le noyau avec les options de ligne de commande suivantes :
cgroup_no_v1=all systemd.legacy_systemd_cgroup_controller
Ces options font que le noyau amorce avec les contrĂŽleurs cgroups version 1 dĂ©sactivĂ©s (signifiant que les contrĂŽleurs sont disponibles dans une hiĂ©rarchie version 2) et indique Ă systemd (1) de ne pas monter et utiliser la hiĂ©rarchie de cgroup version 2, de façon que la hiĂ©rarchie version 2 puisse ĂȘtre montĂ©e manuellement avec les options dĂ©sirĂ©es aprĂšs lâamorçage.
RÚgles de confinement de délégation de cgroup
Certaines rĂšgles de confinement de dĂ©lĂ©gation assurent que le dĂ©lĂ©guĂ© peut dĂ©placer des processus entre des cgroups Ă lâintĂ©rieur du sous-arbre dĂ©lĂ©guĂ©, mais ne puisse pas dĂ©placer les processus de lâextĂ©rieur du sous-arbre dĂ©lĂ©guĂ© dans le sous-arbre ou vice versa. Un processus non privilĂ©giĂ© (câest-Ă -dire le dĂ©lĂ©guĂ©) peut Ă©crire le PID dâun processus « cible » dans un fichier cgroup.procs seulement si toutes les conditions suivantes sont remplies :
|
- |
lâĂ©crivain a la permission dâĂ©criture dans le fichier cgroup.procs du cgroup de destination ; |
||
|
- |
lâĂ©crivain a la permission dâĂ©crire dans le fichier cgroup.procs dans le plus proche ancĂȘtre commun des cgroups source et de destination. Remarquez que dans certains cas, ce plus proche ancĂȘtre commun peut ĂȘtre le cgroup source ou celui de destination eux-mĂȘmes. Ce besoin nâest pas imposĂ© pour les hiĂ©rarchies version 1, avec pour consĂ©quence que le confinement dans la version 1 est moins strict que dans la version 2 (par exemple, dans cgroups version 1 lâutilisateur possĂ©dant deux sous-hiĂ©rarchies dĂ©lĂ©guĂ©es distinctes peut dĂ©placer un processus entre les hiĂ©rarchies) ; |
||
|
- |
si le systĂšme de fichiers dâun cgroup version 2 a Ă©tĂ© montĂ© avec lâoption nsdelegate , lâĂ©crivain doit ĂȘtre capable de voir les cgroups source et destination Ă partir de son espace de noms cgroup ; |
||
|
- |
Dans cgroups version 1, lâUID effectif de lâĂ©crivain (câest-Ă -dire le dĂ©lĂ©guĂ©) correspond Ă lâID rĂ©el utilisateur ou au set-user-ID enregistrĂ© du processus cible. Avant Linux 4.11, cette exigence sâappliquait aussi dans cgroups version 2 (câĂ©tait une exigence historique hĂ©ritĂ©e de cgroups version 1 qui a Ă©tĂ© plus tard estimĂ©e non nĂ©cessaire, puisque les autres rĂšgles suffisent pour le confinement dans cgroups version 2). |
Remarque : une conséquence des ces rÚgles de confinement de délégation est que le délégué non privilégié ne peut placer le premier processus dans le sous-arbre délégué. à la place, le délégant doit placer le premier processus (un processus possédé par le délégué) dans le sous-arbre délégué.
MODE THREAD DE CGROUPS VERSION 2
Parmi les restrictions imposĂ©es par cgroups version 2 qui nâĂ©taient pas prĂ©sentes dans cgroups version 1 :
|
- |
pas contrĂŽle de granularitĂ© au niveau thread : tous les threads dâun processus doivent ĂȘtre dans le mĂȘme cgroup ; |
||
|
- |
pas de processus internes : un cgroup ne peut Ă la fois avoir des processus membres et mettre en Ćuvre des contrĂŽleurs sur des cgroups enfants. |
Ces deux restrictions ont Ă©tĂ© ajoutĂ©es parce que lâabsence de ces restrictions a causĂ© des problĂšmes dans cgroups version 1. En particulier, la possibilitĂ© de cgroups version 1 de permettre une granularitĂ© au niveau threads pour lâappartenance Ă un cgroup nâavait aucun sens pour certains contrĂŽleurs. Un exemple notable Ă©tait le contrĂŽleur memory : puisque les threads partagent un espace dâadressage, cela nâavait aucun sens de rĂ©partir les threads Ă travers des cgroups memory diffĂ©rents.
MalgrĂ© le fait de la dĂ©cision initiale de conception de cgroups version 2, des cas dâutilisation existaient pour certains contrĂŽleurs, notablement le contrĂŽleur cpu , pour lesquels la granularitĂ© au niveau thread du contrĂŽle Ă©tait justifiĂ©e et utile. Pour tenir compte de tels cas, Linux 4.14 a ajoutĂ© le mode thread pour cgroups version 2.
Le mode thread permet les choses suivantes :
|
- |
la crĂ©ation de sous-arbres threaded dans lesquels les threads dâun processus peuvent ĂȘtre rĂ©partis Ă travers des cgroups Ă lâintĂ©rieur de lâarbre (un sous-arbre threaded peut contenir plusieurs processus multithreads) ; |
||
|
- |
le concept de contrÎleurs threaded qui peuvent distribuer des ressources à travers les cgroups dans un sous-arbre threaded ; |
||
|
- |
un relĂąchement de la rĂšgle « pas de processus internes », de façon Ă ce que, Ă lâintĂ©rieur dâun sous-arbre threaded, un cgroup puisse Ă la fois avoir des processus membres et mettre en Ćuvre des contrĂŽleurs de ressources de cgroups enfants. |
Avec lâajout du mode thread, chaque cgroup non racine contient dĂ©sormais un nouveau fichier, cgroup.type , qui expose, et dans certaines circonstances qui peut ĂȘtre utilisĂ© pour modifier, le « type » dâun cgroup. Ce fichier contient une des valeurs de type suivantes :
|
domain |
Câest un cgroup version 2 normal fournissant un contrĂŽle de niveau de granularitĂ© processus. Si un processus est membre de ce cgroup, alors tous les threads de ce processus sont (par dĂ©finition) dans le mĂȘme cgroup. Câest le type par dĂ©faut de cgroup et il fournit le mĂȘme comportement qui Ă©tait fourni pour les cgroups dans lâimplĂ©mentation initiale de cgroups version 2. |
threaded
Ce cgroup est un membre dâun sous-arbre threaded. Des threads peuvent ĂȘtre ajoutĂ©s Ă ce cgroup et des contrĂŽleurs peuvent ĂȘtre activĂ©s pour le cgroup.
domain threaded
Câest un cgroup domain qui sert de racine Ă un sous-arbre threaded. Ce type de cgroup est aussi connu comme « threaded root ».
domain invalid
Câest un cgroup Ă lâintĂ©rieur dâun sous-arbre threaded qui est dans un Ă©tat « invalid ». Un processus ne peut ĂȘtre ajoutĂ© au cgroup et un contrĂŽleur ne peut ĂȘtre activĂ© pour le cgroup. La seule chose qui puisse ĂȘtre faite avec ce cgroup (Ă part le supprimer) est de le convertir en cgroup threaded en inscrivant la chaine « threaded » dans le fichier cgroup.type .
La raison de lâexistence de ce type « transitoire » lors de la crĂ©ation dâun sous-arbre threaded (plutĂŽt que le noyau ne convertisse simplement immĂ©diatement tous les cgroups sous la racine threaded au type threaded ) est de permettre des extensions futures au modĂšle de mode thread.
Threaded versus contrĂŽleurs de domaine
Avec lâajout du mode threads, cgroups version 2 distingue dĂ©sormais deux types de contrĂŽleurs de ressource :
|
- |
contrĂŽleurs Threaded : ces contrĂŽleurs gĂšrent la granularitĂ© au niveau thread pour le contrĂŽle des ressources et peuvent ĂȘtre activĂ©s Ă lâintĂ©rieur de sous-arbres threaded avec pour rĂ©sultat que les fichiers de lâinterface de contrĂŽleur correspondants apparaissent dans les cgroups du sous-arbre threaded. Depuis Linux 4.19, les contrĂŽleurs suivants sont threaded : cpu , perf_event , et pids ; |
||
|
- |
contrĂŽleurs Domain : ces contrĂŽleurs gĂšrent seulement une granularitĂ© au niveau processus pour le contrĂŽle de ressource. Du point de vue contrĂŽleur de domaine, tous les threads dâun processus sont toujours dans le mĂȘme cgroup. Les contrĂŽleurs de domaine ne peuvent ĂȘtre activĂ©s Ă lâintĂ©rieur dâun sous-arbre threaded. |
CrĂ©ation dâun sous-arbre threaded
Il existe deux maniÚres qui conduisent à la création de sous-arbre threaded. La premiÚre maniÚre fonctionne comme ceci :
|
(1) |
Nous Ă©crivons La chaine « threaded » dans le fichier cgroup.type dâun cgroup y/z ayant actuellement le type domain . Cela a les effets suivants : |
-
|
le type du cgroup y/z devient threaded ; |
|||
|
- |
le type du cgroup parent, y , devient domain threaded . Le cgroup parent est la racine dâun sous-arbre threaded (aussi connu comme « threaded root » â racine threaded) ; |
||
|
- |
Tous les autres cgroups sous y qui nâĂ©taient pas dĂ©jĂ de type threaded (parce quâils Ă©taient dĂ©jĂ dans des sous-arbres threaded existants sous la nouvelle racine root threaded) sont convertis au type domain invalid . Tout cgroup créé aprĂšs sous y aura aussi le type domain invalid . |
||
|
(2) |
Nous écrivons La chaine « threaded » pour chacun des cgroups domain invalid sous y , dans le but de les convertir au type threaded . Comme conséquence de cette étape, tous les threads sous la racine threaded ont désormais le type threaded et le sous-arbre threaded est désormais pleinement utilisable. Les conditions nécessaires pour écrire « threaded » pour chacun de ces cgroups sont quelque peu laborieuses, mais permettent de futures extensions au modÚle de mode thread.
La second maniÚre de créer un sous-arbre threaded est la suivante :
|
(1) |
Dans un cgroup existant, z , qui actuellement a le type domain , nous (1.1) activons un ou plusieurs contrĂŽleurs threaded et (1.2) faisons dâun processus un membre de z (ces deux Ă©tapes pouvant ĂȘtre rĂ©alisĂ©es dans nâimporte quel ordre). Cela a les consĂ©quences suivantes : |
-
|
le type de z devient domain threaded ; |
|||
|
- |
tous les cgroups descendants de z qui nâĂ©taient dĂ©jĂ de type threaded sont convertis au type domain invalid . |
||
|
(2) |
Comme auparavant, nous rendons le sous-arbre threaded utilisable en écrivant la chaine « threaded » pour chacun des cgroups domain invalid sous z , dans le but de les convertir au type threaded .
Une des consĂ©quences des maniĂšres ci-dessus de crĂ©er un sous-arbre threaded est quâun cgroup de racine threaded peut ĂȘtre un parent pour seulement des cgroups threaded (et domain invalid ). Le cgroup racine threaded ne peut pas ĂȘtre un parent dâun cgroup domain et un cgroup threaded ne peut avoir de frĂšre qui soit un cgroup domain .
Utilisation de sous-arbre threaded
Ă lâintĂ©rieur dâun sous-arbre threaded, des contrĂŽleurs threaded peuvent ĂȘtre activĂ©s dans chaque sous-groupe dont le type a Ă©tĂ© changĂ© Ă threaded . Ce faisant, les fichiers de lâinterface de contrĂŽleur correspondants apparaissent dans lâenfant de ce cgroup.
Un processus peut ĂȘtre dĂ©placĂ© dans un sous-arbre threaded en Ă©crivant son PID dans le fichier cgroup.procs dans un des cgroups de lâarbre. Cela a pour effet de rendre tous les threads du processus membres du cgroup correspondant et de faire du processus un membre du sous-arbre threaded. Les threads du processus peuvent ĂȘtre rĂ©partis Ă travers le sous-arbre threaded en Ă©crivant leurs ID de thread (voir gettid (2)) dans les fichiers cgroup.threads dans diffĂ©rents cgroups Ă lâintĂ©rieur du sous-arbre. Les threads dâun processus doivent tous rĂ©sider dans le mĂȘme sous-arbre threaded.
Comme pour lâĂ©criture dans cgroup.procs , quelques rĂšgles de confinement sâappliquent pour lâĂ©criture dans le fichier cgroup.threads :
|
- |
lâĂ©crivain doit avoir la permission dâĂ©criture dans le fichier cgroup.threads dans le cgroup de destination ; |
||
|
- |
lâĂ©crivain doit avoir la permission dâĂ©criture dans le fichier cgroup.procs dans lâancĂȘtre commun des cgroups source et destination (dans certains cas, cet ancĂȘtre peut ĂȘtre le cgroup source ou destination eux-mĂȘmes) ; |
||
|
- |
les cgroups source et destination doivent ĂȘtre dans le mĂȘme sous-arbre threaded (en dehors dâun sous-arbre threaded, un essai de dĂ©placer un thread en Ă©crivant son ID de thread dans le fichier cgroup.threads dans un cgroup domain diffĂ©rent Ă©choue avec lâerreur EOPNOTSUPP ). |
Le fichier cgroup.threads est prĂ©sent dans chaque cgroup (incluant les cgroups domain ) et peut ĂȘtre lu pour dĂ©couvrir lâensemble de threads prĂ©sents dans le cgroup. Lâensemble dâID de threads obtenu lors de la lecture de ce fichier nâest pas garanti dâĂȘtre ordonnĂ© ou ne pas avoir de doublons.
Le fichier cgroup.procs dans la racine threaded affiche le PID de tous les processus membres du sous-arbre threaded. Les fichiers cgroup.procs dans les autres cgroups du sous-arbre ne sont pas lisibles.
Les contrĂŽleurs de domaine ne peuvent ĂȘtre activĂ©s dans un sous-arbre threaded. Aucun fichier dâinterface de contrĂŽleur nâapparait dans les cgroups sous la racine threaded. Du point de vue du contrĂŽleur de domaine, les sous-arbres threaded sont invisibles : un processus multithreaded Ă lâintĂ©rieur dâun sous-arbre threaded apparait pour un contrĂŽleur de domaine comme un processus qui rĂ©side dans le cgroup racine threaded.
Dans un sous-arbre threaded, la rĂšgle « pas de processus internes » ne sâapplique pas : un cgroup peut contenir des processus membres (ou des threads) et utiliser des contrĂŽleurs sur des cgroups enfants.
RÚgles pour écrire dans cgroup.type et créer des sous-arbres threaded
Un certain nombre de rĂšgles sâappliquent lors de lâĂ©criture dans le fichier cgroup.type :
|
- |
seule la chaine « threaded » peut ĂȘtre Ă©crite. En dâautres mots, la seule transition explicite possible est de convertir un cgroup domain au type threaded ; |
||
|
- |
lâeffet dâĂ©crire « threaded » dĂ©pend de la valeur en cours dans cgroup.type , comme suit : |
-
|
domain ou domain threaded : dĂ©but de la crĂ©ation dâun sous-arbre threaded (dont la racine est le parent de ce cgroup) Ă lâaide de la premiĂšre des maniĂšres dĂ©crites ci-dessus, |
|||
|
- |
domain invalid : conversion de ce cgroup (qui est Ă lâintĂ©rieur dâun sous-arbre threaded) pour ĂȘtre dans un Ă©tat utilisable (câest-Ă -dire threaded ), |
||
|
- |
threaded : aucun effet (une « no-op ») ; |
||
|
- |
il nâest pas possible dâĂ©crire dans un fichier cgroup.type si le type du parent est domain invalid . En dâautres mots, les cgroups dâun sous-arbre threaded doivent ĂȘtre convertis dans lâĂ©tat threaded dâune maniĂšre descendante.
Quelques contraintes doivent aussi ĂȘtre satisfaites pour crĂ©er un sous-arbre threaded dont la racine est le cgroup x :
|
- |
il ne peut exister de processus membres dans les cgroups descendants de x (le cgroup_ x peut lui avoir des processus membres)Â ; |
||
|
- |
aucun contrĂŽleur de domaine ne peut ĂȘtre activĂ© dans le fichier cgroup.subtree_control de x . |
Si nâimporte laquelle des contraintes ci-dessus nâest pas satisfaite, alors un essai dâĂ©crire « threaded » dans un fichier cgroup.type Ă©chouera avec lâerreur ENOTSUP .
Le type « domain threaded » de cgroup
Selon les chemins dĂ©crits ci-dessus, le type dâun cgroup peut changer Ă domain threaded dans chacun des cas suivants :
|
- |
la chaine « threaded » est écrite pour un cgroup enfant ; |
||
|
- |
un contrÎleur threaded est activé dans le cgroup et un processus est fait membre du cgroup. |
Un cgroup domain threaded , x , peut redevenir du type domain si les conditions ci-dessus ne sont plus vraies, câest-Ă -dire si tous les cgroups enfants threaded de x ont Ă©tĂ© supprimĂ©s et si x nâa plus de contrĂŽleurs threaded activĂ©s ou nâa plus de processus membres.
Quand un cgroup domain threaded x redevient du type domain :
|
- |
tous les descendants domain invalid de x qui ne sont pas dans des sous-arbres threaded de bas niveau redeviennent du type domain ; |
||
|
- |
les cgroups racines dans nâimporte quels sous-arbres threaded de bas niveau redeviennent de type domain threaded . |
Exceptions pour le cgroup racine
Le cgroup racine de la hiĂ©rarchie version 2 est traitĂ© exceptionnellement : il peut ĂȘtre le parent Ă la fois de cgroups domain et threaded . Si la chaine « threaded » est Ă©crite dans le fichier cgroup.type dâun des enfants du cgroup racine, alors :
|
- |
le type de ce cgroup devient threaded ; |
||
|
- |
le type de tous les descendants de ce cgroup qui ne fait pas partie de sous-arbres threaded de bas niveau change Ă domain invalid . |
Remarquez que dans ce cas, il nây a pas de cgroup qui deviennent domain threaded (thĂ©oriquement, le cgroup racine peut ĂȘtre considĂ©rĂ© comme la racine threaded pour le cgroup dont le type a Ă©tĂ© changĂ© Ă threaded ).
Le but de ce traitement exceptionnel pour le cgroup racine est de permettre Ă un cgroup threaded qui emploie le contrĂŽleur cpu dâĂȘtre placĂ© aussi haut que possible dans la hiĂ©rarchie, de façon Ă minimiser le (faible) coĂ»t de parcourir la hiĂ©rarchie de cgroup.
Le contrÎleur « cpu » de cgroups version 2 et les threads en temps réel
Depuis Linux 4.19, le contrĂŽleur cpu de cgroups version 2 ne prend pas en charge le contrĂŽle des threads en temps rĂ©el (particuliĂšrement les threads ordonnancĂ©s sous les politiques SCHED_FIFO , SCHED_RR , SCHED_DEADLINE ; voir sched (7)). Par consĂ©quent, le contrĂŽleur cpu ne peut ĂȘtre activĂ© dans le cgroup racine seulement si tous les threads en temps rĂ©el sont dans le cgroup racine (si des threads en temps rĂ©el sont dans des cgroups non racines, alors une Ă©criture write (2) de la chaine « +cpu » dans le fichier cgroup.subtree_control Ă©choue avec lâerreur EINVAL ).
Dans certains systĂšmes, systemd (1) place certains threads en temps rĂ©el dans des cgroups non racines dans la hiĂ©rarchie version 2. Pour de tels systĂšmes, ces threads doivent dâabord ĂȘtre dĂ©placĂ©s dans le cgroup racine avant que le contrĂŽleur cpu ne soit activĂ©.
ERREURS
Les erreurs suivantes peuvent survenir pour mount (2)Â :
|
EBUSY |
Un essai de monter un systĂšme de fichiers cgroup version 1 nâindiquait ni lâoption name= (pour monter une hiĂ©rarchie nommĂ©e) ni un nom de contrĂŽleur (ou all ). |
NOTES
Un processus enfant créé Ă lâaide de fork (2) hĂ©rite des appartenances de cgroup de son parent. Les appartenances de cgroup de processus sont prĂ©servĂ©es Ă travers execve (2).
Le drapeau CLONE_INTO_CGROUP de clone3 (2) peut ĂȘtre utilisĂ© pour crĂ©er un processus enfant qui dĂ©bute son existence dans un cgroup version 2 diffĂ©rent du processus parent.
Fichiers /proc
/proc/cgroups (depuis Linux 2.6.24)
Ce fichier contient des informations sur les contrÎleurs qui sont compilés dans le noyau. Un exemple du contenu de ce fichier (reformaté pour une meilleure lisibilité) est ce qui suit :
#subsys_name
hierarchy num_cgroups enabled
cpuset 4 1 1
cpu 8 1 1
cpuacct 8 1 1
blkio 6 1 1
memory 3 1 1
devices 10 84 1
freezer 7 1 1
net_cls 9 1 1
perf_event 5 1 1
net_prio 9 1 1
hugetlb 0 1 0
pids 2 1 1
Les champs dans ce fichier sont de gauche à droite :
|
[1] |
Le nom du contrĂŽleur. |
||
|
[2] |
LâID unique de la hiĂ©rarchie de cgroup pour laquelle le contrĂŽleur est montĂ©. Si plusieurs contrĂŽleurs de cgroups version 1 sont liĂ©s Ă la mĂȘme hiĂ©rarchie, chacun dâentre eux affichera le mĂȘme ID de hiĂ©rarchie dans ce champ. La valeur dans ce champ sera zĂ©ro si : |
-
|
le contrĂŽleur nâest pas montĂ© pour une hiĂ©rarchie de cgroups version 1 ; |
|||
|
- |
le contrÎleur est lié à la seule hiérarchie unifiée de cgroups version 2 ; |
||
|
- |
le contrÎleur est désactivé (voir ci-dessous). |
||
|
[3] |
Le nombre de groupes de contrÎle dans cette hiérarchie utilisant ce contrÎleur.
|
[4] |
Ce champ contient la valeur 1 si le contrĂŽleur est activĂ© ou zĂ©ro sâil a Ă©tĂ© dĂ©sactivĂ© (Ă lâaide du paramĂštre cgroup_disable dâamorçage du noyau dans la ligne de commande). |
/proc/ pid /cgroup (depuis Linux 2.6.24)
Ce fichier dĂ©crit les groupes de contrĂŽle auxquels le processus ayant le PID correspondant appartient. Lâinformation affichĂ©e diffĂšre pour les hiĂ©rarchies version 1 et version 2 de cgroups.
Pour chaque hiérarchie de cgroup dont le processus est membre, il existe une entrée contenant trois champs séparés par des deux-points :
ID_hiérarchie:liste_contrÎleurs:chemin_cgroup
Par exemple :
5:cpuacct,cpu,cpuset:/daemons
De gauche à droite, ces trois champs séparés par des deux-points sont :
|
[1] |
Pour les hiĂ©rarchies de cgroups version 1, ce champ contient un numĂ©ro dâID unique de hiĂ©rarchie qui peut ĂȘtre comparĂ© avec un ID de hiĂ©rarchie dans /proc/cgroups . Pour les hiĂ©rarchies de cgroups version 2, ce champ contient la valeur 0. |
||
|
[2] |
Pour les hiérarchies de cgroups version 1, ce champ contient une liste séparée par des virgules de contrÎleurs liés à la hiérarchie. Pour les hiérarchies de cgroups version 2, ce champ est vide. |
||
|
[3] |
Ce champ contient le chemin du groupe de contrÎle dans la hiérarchie à laquelle le processus appartient. Ce chemin est relatif au point de montage de la hiérarchie. |
Fichiers /sys/kernel/cgroup
/sys/kernel/cgroup/delegate (depuis Linux 4.15)
Ce fichier exporte une liste de fichiers cgroups version 2 (un par ligne) qui sont dĂ©lĂ©gables (câest-Ă -dire dont la propriĂ©tĂ© peut ĂȘtre changĂ©e Ă lâID utilisateur du dĂ©lĂ©guĂ©). Dans le futur, lâensemble des fichiers dĂ©lĂ©gables peut ĂȘtre modifiĂ© ou grossir, et ce fichier fournit un moyen pour le noyau dâinformer les applications en espace utilisateur quels fichiers doivent ĂȘtre dĂ©lĂ©guĂ©s. Depuis Linux 4.15, il est possible de voir ce qui suit lors de lâinspection de ce fichier :
$
cat
/sys/kernel/cgroup/delegate
cgroup.procs
cgroup.subtree_control
cgroup.threads
/sys/kernel/cgroup/features (depuis Linux 4.15)
Avec le temps, lâensemble de fonctionnalitĂ©s de cgroups version 2 fournies par le noyau peut Ă©voluer ou grossir, ou certaines fonctionnalitĂ©s pourraient ne pas ĂȘtre activĂ©es par dĂ©faut. Ce fichier fournit un moyen aux applications en espace utilisateur de dĂ©couvrir quelles fonctionnalitĂ©s le noyau utilisĂ© gĂšre et a dâactivĂ©es. Les fonctionnalitĂ©s sont listĂ©es, une par ligne :
$
cat
/sys/kernel/cgroup/features
nsdelegate
memory_localevents
Les
entrées pouvant apparaitre dans ce fichier
sont :
memory_localevents
(depuis Linux 5.2)
Le noyau gĂšre lâoption de montage memory_localevents .
nsdelegate (depuis Linux 4.15)
Le noyau gĂšre lâoption de montage nsdelegate .
memory_recursiveprot (depuis Linux 5.7)
Le noyau gĂšre lâoption de montage memory_recursiveprot .
VOIR AUSSI
prlimit (1), systemd (1), systemd-cgls (1), systemd-cgtop (1), clone (2), ioprio_set (2), perf_event_open (2), setrlimit (2), cgroup_namespaces (7), cpuset (7), namespaces (7), sched (7), user_namespaces (7)
Le fichier des sources du noyau Documentation/admin-guide/cgroup-v2.rst .
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter Ă la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il nây a aucune RESPONSABILITĂ LĂGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .