Man page - cpuset(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 ruManual
cpuset
NOMDESCRIPTION
FICHIERS
CAPACITĂS ĂTENDUES
Ensembles de CPU exclusifs
Hardwall
Notification à la libération
Pression mémoire
Répartition mémoire
Migration mémoire
RĂ©partition de la charge par lâordonnanceur
Niveau du domaine de dĂ©tente de lâordonnanceur
FORMATS
Affichage sous forme de masque
Affichage sous forme de liste
RĂGLES
PERMISSIONS
AVERTISSEMENTS
Activation de memory_pressure
Utilisation de la commande echo
EXCEPTIONS
Placement mémoire
Renommer des cpusets
ERREURS
VERSIONS
NOTES
BOGUES
EXEMPLES
CrĂ©er et sâattacher Ă un cpuset.
DĂ©placer des tĂąches sur dâautres nĆuds mĂ©moire.
VOIR AUSSI
TRADUCTION
NOM
cpuset - Confiner des processus Ă des sous-ensembles de processeurs et de nĆuds mĂ©moire
DESCRIPTION
Le systĂšme de fichiers cpuset (N.d.T. : « cpuset » signifie mot Ă mot « ensemble de CPU », mais comme il ne sâagit pas uniquement dâensembles de CPU, le terme cpuset sera utilisĂ© par la suite) est une interface sous forme dâun pseudosystĂšme de fichiers pour le mĂ©canisme « cpuset » du noyau, qui permet de contrĂŽler le placement de processus sur des processeurs ou en mĂ©moire. Il est habituellement montĂ© dans /dev/cpuset .
Sur les systĂšmes dont le noyau a Ă©tĂ© compilĂ© avec la prise en charge des cpusets, tous les processus sont attachĂ©s Ă un cpuset, et les cpusets sont toujours prĂ©sents. Si un systĂšme prend en charge les cpusets, alors il aura une entrĂ©e nodev cpuset dans le fichier /proc/filesystems . En montant le systĂšme de fichiers cpuset (consultez la section EXEMPLE ci-dessous), lâadministrateur peut configurer les cpusets dâun systĂšme pour contrĂŽler le placement des processus sur les CPU et dans la mĂ©moire sur de systĂšme. Par dĂ©faut, si la configuration des cpusets dâun systĂšme nâest pas modifiĂ©e ou si le systĂšme de fichiers cpuset nâest mĂȘme pas montĂ©, le mĂ©canisme des cpusets, mĂȘme sâil est prĂ©sent, nâa pas dâeffets sur le comportement du systĂšme.
Un cpuset dĂ©finit une liste de CPU et de nĆuds mĂ©moire.
Les CPU dâun systĂšme comprennent toutes les unitĂ©s de traitement logiques sur lesquelles peuvent sâexĂ©cuter des processus, comprenant, sâil y en a, les diffĂ©rents cĆurs dâun processeur et les Hyper-Threads dâun cĆur de processeur. Les nĆuds mĂ©moire comprennent tous les bancs distinct de mĂ©moire ; les petits systĂšmes et les systĂšmes SMP ont typiquement un seul nĆud mĂ©moire qui contient toute la mĂ©moire du systĂšme, alors que les systĂšmes NUMA (« non-uniform memory access » : accĂšs non uniforme Ă la mĂ©moire) ont plusieurs nĆuds mĂ©moire.
Les cpusets sont reprĂ©sentĂ©s par des rĂ©pertoires dans un pseudosystĂšme de fichiers hiĂ©rarchique dont le rĂ©pertoire de plus haut niveau ( /dev/cpuset ) reprĂ©sente le systĂšme complet (tous les CPU et nĆuds mĂ©moire en ligne). Tout cpuset fils (le descendant) dâun autre cpuset pĂšre contient un sous-ensemble des CPU et des nĆuds mĂ©moire du pĂšre. Les rĂ©pertoires et les fichiers qui reprĂ©sentent les cpusets ont les permissions habituelles des systĂšmes de fichiers.
Chaque processus du systĂšme appartient Ă un unique cpuset. Un processus est obligĂ© de sâexĂ©cuter sur les CPU du cpuset auquel il appartient et est obligĂ© dâallouer de la mĂ©moire uniquement sur les nĆuds mĂ©moire de ce cpuset. Quand un processus crĂ©e un fils avec fork (2), le processus fils est placĂ© dans le mĂȘme cpuset que le processus pĂšre. Sâil a les privilĂšges suffisants, le processus fils peut se dĂ©placer dâun cpuset Ă un autre et les CPU ou nĆuds mĂ©moire dâun cpuset existant peuvent ĂȘtre changĂ©s.
Au dĂ©but du dĂ©marrage du systĂšme, un seul cpuset est dĂ©fini qui comprend tous les CPU et tous les nĆuds mĂ©moire du systĂšme et tous les processus se trouvent dans ce cpuset. Pendant le dĂ©marrage ou par la suite lors de lâexĂ©cution normale du systĂšme, dâautres cpusets peuvent ĂȘtre créés, en tant que sous-rĂ©pertoire de ce cpuset de plus haut niveau, sous le contrĂŽle de lâadministrateur systĂšme. Des processus peuvent ĂȘtre placĂ©s dans ces autres cpusets.
Les cpusets sont intĂ©grĂ©s dans le noyau avec le mĂ©canisme dâaffinitĂ© dâordonnancement de sched_setaffinity (2) et les mĂ©canismes de placement en mĂ©moire de mbind (2) et set_mempolicy (2). Aucun de ces mĂ©canismes ne permettent Ă un processus dâutiliser un CPU ou un nĆud mĂ©moire qui nâest pas autorisĂ© par le cpuset du processus. Si une modification du cpuset entre en conflit avec ces autres mĂ©canismes, le placement dans le cpuset est forcĂ©, mĂȘme si cela signifie quâil faut outrepasser ces autres mĂ©canismes. Ceci est fait silencieusement par le noyau en restreignant les CPU et nĆuds mĂ©moire demandĂ©s par ces autres mĂ©canismes Ă ceux qui sont autorisĂ©s par le cpuset du processus appelant. Ces autres appels peuvent alors renvoyer une erreur si, par exemple, ils sont amenĂ©s Ă demander un ensemble vide de CPU ou de nĆuds mĂ©moire aprĂšs que la demande est restreinte au cpuset du processus appelant.
Typiquement, un cpuset est utilisĂ© pour gĂ©rer le confinement dans des CPU ou des nĆuds mĂ©moire pour un ensemble de processus qui coopĂšrent entre eux, comme un ordonnanceur de tĂąches, et ces autres mĂ©canismes permettent de gĂ©rer le placement de chacun des processus ou des rĂ©gions mĂ©moire pour chacune de ces tĂąches.
FICHIERS
Chaque rĂ©pertoire de /dev/cpuset reprĂ©sente un cpuset et contient un ensemble dĂ©finit de pseudofichiers qui dĂ©crivent lâĂ©tat de ce cpuset.
Les nouveaux cpusets sont créés avec lâappel systĂšme mkdir (2) ou la commande mkdir (1). Les propriĂ©tĂ©s dâun cpuset, comme ses drapeaux, les CPU et nĆuds mĂ©moire autorisĂ©s et les processus attachĂ©s sont rĂ©cupĂ©rĂ©s ou modifiĂ©s en lisant ou Ă©crivant dans le fichier appropriĂ© du rĂ©pertoire du cpuset. Ces fichiers sont dĂ©crits ci-dessous.
Les pseudofichiers dans chaque rĂ©pertoire dâun cpuset sont créés automatiquement quand le cpuset est créé, suite Ă lâappel Ă mkdir (2). Il nâest pas possible dâajouter ou de supprimer directement ces pseudofichiers.
Le rĂ©pertoire dâun cpuset qui ne contient pas de rĂ©pertoire pour un cpuset fils et nâa pas de processus lui Ă©tant attachĂ© peut ĂȘtre supprimĂ© Ă lâaide de rmdir (2) ou rmdir (1). Il nâest pas nĂ©cessaire, ou possible, de supprimer les pseudofichiers du rĂ©pertoire avant de le supprimer.
Les pseudofichiers des rĂ©pertoires dâun cpuset sont de petits fichiers textes qui peuvent ĂȘtre lus ou Ă©crits en utilisant les outils traditionnels comme cat (1) et echo (1) ou depuis un programme en utilisant des fonctions dâune bibliothĂšque dâentrĂ©es sorties ou des appels systĂšme, comme open (2), read (2), write (2) et close (2).
Les pseudofichiers dans un rĂ©pertoire dâun cpuset reprĂ©sentent lâĂ©tat interne du noyau et nâont pas de reprĂ©sentation persistante sur le disque. Les fichiers dâun cpuset sont listĂ©s et dĂ©crits ci-dessous.
|
tasks |
Liste des identifiants de processus (PID) des processus dans ce cpuset. La liste contient une sĂ©rie de nombres dĂ©cimaux au format ASCII, chacun suivit dâune nouvelle ligne. Un processus peut ĂȘtre ajoutĂ© Ă un cpuset (ce qui le supprime automatiquement du cpuset qui le contenait auparavant) en Ă©crivant son PID dans le fichier tasks du cpuset (avec ou sans nouvelle ligne Ă la fin). |
Attention : un seul PID peut ĂȘtre Ă©crit Ă la fois dans le fichier tasks . Si une chaĂźne est Ă©crite et quâelle contient plus dâun PID, seul le premier sera utilisĂ©.
notify_on_release
Drapeau (0 ou 1). Lorsquâil est activĂ© (1), ce cpuset sera gĂ©rĂ© de façon particuliĂšre une fois quâil sera libĂ©rĂ©, câest-Ă -dire aprĂšs que tous les processus cessent de lâutiliser (câest-Ă -dire se terminent ou ont Ă©tĂ© dĂ©placĂ©s dans un autre ensemble de CPU) et que tous les rĂ©pertoires des cpusets fils ont Ă©tĂ© supprimĂ©s. Consultez la section Notification Ă la libĂ©ration ci-dessous.
cpuset.cpus
Liste des numĂ©ros physiques des CPU sur lesquels les processus de ce cpuset ont le droit de sâexĂ©cuter. Consultez la section Format des listes ci-dessous pour une description du format de cpus .
Les CPU autorisĂ©s pour un cpuset peuvent ĂȘtre changĂ©s en Ă©crivant une nouvelle liste dans la fichier cpus .
cpuset.cpu_exclusive
Drapeau (0 ou 1). Sâil est activĂ© (1), le cpuset a un accĂšs exclusif Ă ses CPU (des cpusets frĂšres ou cousins ne peuvent pas partager de CPU). Par dĂ©faut, il est dĂ©sactivĂ© (0). Les cpusets nouvellement créés ont aussi ce drapeau de dĂ©sactivĂ© (0) au dĂ©but.
Deux cpusets sont frĂšres sâils ont le mĂȘme cpuset pĂšre dans la hiĂ©rarchie /dev/cpuset . Deux cpusets sont cousins si aucun nâest lâancĂȘtre de lâautre. IndĂ©pendamment du paramĂštre cpu_exclusive , si un cpuset est lâancĂȘtre dâun autre et si ces deux cpusets ont des listes de CPU ( cpus ) non vides, alors leurs listes de CPU doivent se chevaucher parce que la liste cpus dâun cpuset est toujours un sous ensemble de la liste cpus de son cpuset pĂšre.
cpuset.mems
Liste des nĆuds mĂ©moire sur lesquels les processus de ce cpuset ont le droit dâallouer de la mĂ©moire. Consultez la section Format des listes ci-dessous pour une description du format de mems .
cpuset.mem_exclusive
Drapeau (0 ou 1). Sâil est activĂ© (1), le cpuset a un accĂšs exclusif Ă ses nĆuds mĂ©moire (pas de partage entre frĂšres ou cousins). Sâil est activĂ© (1), il sâagit Ă©galement dâun cpuset « Hardwall » (voir ci-dessous). Par dĂ©faut, il est dĂ©sactivĂ© (0). Les cpusets nouvellement créés ont aussi ce drapeau de dĂ©sactivĂ© (0) au dĂ©but.
IndĂ©pendamment du paramĂštre mem_exclusive , si un cpuset est lâancĂȘtre dâun autre, alors leurs nĆuds mĂ©moires doivent se chevaucher parce que lâensemble des nĆuds mĂ©moire dâun cpuset est toujours un sous ensemble des nĆuds mĂ©moire du cpuset pĂšre.
cpuset.mem_hardwall (depuis Linux 2.6.26)
Drapeau (0 ou 1). Sâil est activĂ© (1), le cpuset est de type Hardwall (voir ci-dessous). Contrairement Ă mem_exclusive , des cpusets marquĂ©s avec mem_hardwall peuvent partager des nĆuds mĂ©moire avec des cpusets frĂšres ou cousins. Par dĂ©faut, il est dĂ©sactivĂ© (0). Les cpusets nouvellement créés ont aussi ce drapeau de dĂ©sactivĂ© (0) au dĂ©but.
cpuset.memory_migrate (depuis Linux 2.6.16)
Drapeau (0 ou 1). Sâil est activĂ© (1), alors la migration mĂ©moire est activĂ©e. Par dĂ©faut, il est dĂ©sactivĂ© (0). Consultez la section Migration mĂ©moire ci-dessous.
cpuset.memory_pressure (depuis Linux 2.6.16)
Une mesure de la pression mĂ©moire causĂ©e par les processus dâun cpuset. Consultez la section Pression mĂ©moire ci-dessous. Ă moins que memory_pressure_enabled soit activĂ©, il vaut toujours zĂ©ro. Ce fichier est en lecture seule. Consultez la section AVERTISSEMENTS ci-dessous.
cpuset.memory_pressure_enabled (depuis Linux 2.6.16)
Drapeau (0 ou 1). Ce fichier nâest prĂ©sent que dans le cpuset racine, qui est normalement /dev/cpuset . Sâil est activĂ© (1), les calculs de memory_pressure sont activĂ©s pour tous les cpusets du systĂšme. Par dĂ©faut, il est dĂ©sactivĂ© (0). Consultez la section Pression mĂ©moire ci-dessous.
cpuset.memory_spread_page (depuis Linux 2.6.17)
Drapeau (0 ou 1). Sâil est activĂ© (1), les pages du cache de pages du noyau (les tampons des systĂšmes de fichiers) sont distribuĂ©es uniformĂ©ment dans les cpusets. Par dĂ©faut, il est dĂ©sactivĂ© (0) dans le cpuset racine et hĂ©ritĂ© du cpuset parent pour les cpusets nouvellement créés. Consultez la section RĂ©partition mĂ©moire ci-dessous.
cpuset.memory_spread_slab (depuis Linux 2.6.17)
Drapeau (0 ou 1). Sâil est activĂ© (1), les caches slab (N.d.T. : tampons prĂ©allouĂ©s par le noyau) pour les entrĂ©es-sorties de fichiers (des structures pour des rĂ©pertoires ou inĆuds) sont rĂ©partis uniformĂ©ment dans le cpuset. Par dĂ©faut, ce drapeau est dĂ©sactivĂ© (0) dans le cpuset racine et les nouveaux cpusets hĂ©ritent du drapeau de leur parent quand ils sont créés. Consultez la section RĂ©partition mĂ©moire ci-dessous.
cpuset.sched_load_balance (depuis Linux 2.6.24)
Drapeau (0 ou 1). Sâil est activĂ© (1, la valeur par dĂ©faut), le noyau rĂ©partira automatiquement la charge des processus du cpuset au travers les CPU autorisĂ©s pour le cpuset. Sâil est dĂ©sactivĂ© (0), le noyau ne rĂ©partira pas la charge des processus du cpuset, Ă moins quâun autre cpuset qui partage des CPU avec lui nâait son drapeau sched_load_balance activĂ©. Consultez la section RĂ©partition de la charge par lâordonnanceur ci-dessous pour plus de dĂ©tails.
cpuset.sched_relax_domain_level (depuis Linux 2.6.26)
Entier, compris entre -1 et une petite valeur positive. sched_relax_domain_level contrĂŽle la largeur de lâintervalle des CPU pour lesquels le noyau effectue une rĂ©partition immĂ©diate des tĂąches exĂ©cutables. Si sched_load_balance est dĂ©sactivĂ©, alors sched_relax_domain_level ne compte pas, puisquâil nây a pas de rĂ©partition de la charge. Si sched_load_balance est activĂ©, alors plus sched_relax_domain_level est important, plus lâintervalle des CPU sur lesquels le noyau essaie de rĂ©partir la charge est important. Consultez la section Niveau du domaine de dĂ©tente de lâordonnanceur ci-dessous pour plus de dĂ©tails.
En plus des pseudofichiers décrits ci-dessus, dans chaque répertoire de /dev/cpuset , chaque processus a un pseudofichier, /proc/ pid /cpuset , qui indique le chemin vers le répertoire du cpuset du processus, relativement à la racine du systÚme de fichiers cpuset.
Quatre lignes sont Ă©galement ajoutĂ©es dans le fichier /proc/ pid /status , fournissant pour chaque processus les champs : Cpus_allowed (sur quels CPU il peut ĂȘtre ordonnancĂ©) et Mems_allowed (sur quels nĆuds mĂ©moire de la mĂ©moire peut ĂȘtre allouĂ©e), avec lâ Affichage sous forme de masque et lâ Affichage sous forme de liste (voir ci-dessous). Voici un exemple :
Cpus_allowed:
ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list: 0-127
Mems_allowed: ffffffff,ffffffff
Mems_allowed_list: 0-63
Les champs « allowed » ont été ajoutés dans Linux 2.6.24 ; les champs « allowed_list » ont été ajoutés dans Linux 2.6.26.
CAPACITĂS ĂTENDUES
En plus de contrĂŽler quels CPU ( cpus ) et nĆuds mĂ©moire ( mems ) un processus Ă le droit dâutiliser, les cpusets fournissent les fonctionnalitĂ©s Ă©tendues suivantes.
Ensembles de CPU exclusifs
Si un cpuset est marquĂ© avec cpu_exclusive ou mem_exclusive , aucun autre cpuset, autre que des ancĂȘtres ou descendants directs, peuvent partager des CPU ou des nĆuds mĂ©moire avec ce cpuset.
Un cpuset dont mem_exclusive est activĂ© restreint les allocations du noyau pour les pages des tampons de cache et autres donnĂ©es internes du noyau communĂ©ment partagĂ©es par le noyau au travers diffĂ©rents utilisateurs. Tous les cpusets, que mem_exclusive soit activĂ© ou non, restreignent lâallocation de mĂ©moire depuis lâespace utilisateur. Ceci permet de configurer un systĂšme de telle sorte que diffĂ©rentes tĂąches puissent partager des donnĂ©es du noyau, tout en isolant toutes les allocations en mode utilisateur des tĂąches dans leur propre cpuset. Pour ceci, il faut crĂ©er un gros cpuset, avec mem_exclusive activĂ©, pour contenir toutes les tĂąches, et crĂ©er des cpuset fils sans mem_exclusive pour chacune des tĂąches. Seule une petite partie de la mĂ©moire du noyau, comme les requĂȘtes des gestionnaires dâinterruptions, est autorisĂ©e Ă ĂȘtre placĂ©e sur des nĆuds mĂ©moire en dehors dâun cpuset, mĂȘme si mem_exclusive est activĂ©.
Hardwall
Un cpuset pour lequel mem_exclusive ou mem_hardwall est activĂ© est un cpuset hardwall . Un cpuset hardwall restreint les allocations mĂ©moire du noyau pour les pages, tampons et toutes autre donnĂ©es partagĂ©s frĂ©quemment par le noyau au travers diffĂ©rents utilisateurs. Tous les cpusets, hardwall ou non, restreignent les allocations mĂ©moire pour lâespace utilisateur.
Ceci permet de configurer un systĂšme de telle sorte que diffĂ©rentes tĂąches indĂ©pendantes puissent partager des donnĂ©es du noyau, comme des pages des systĂšmes de fichiers, tout en isolant les allocations de lâespace utilisateur de chaque tĂąche dans leur cpuset. Pour ceci, il faut crĂ©er un gros cpuset hardwall qui contiendra toutes les tĂąches et crĂ©er des cpusets fils (non hardwall ) pour chacune des tĂąches.
Seule une petite quantitĂ© de mĂ©moire noyau, comme les demandes des gestionnaires dâinterruption, peut ĂȘtre utilisĂ©e Ă lâextĂ©rieur dâun cpuset hardwall .
Notification à la libération
Si le drapeau notify_on_release dâun cpuset est activĂ© (1), alors quand le dernier processus quitte le cpuset (il se termine ou sâattache Ă un autre cpuset) et que le dernier cpuset fils de ce cpuset a Ă©tĂ© supprimĂ©, le noyau exĂ©cutera la commande /sbin/cpuset_release_agent en lui fournissant le chemin (relatif au point de montage du systĂšme de fichiers cpuset) du cpuset abandonnĂ©. Ceci permet de supprimer automatiquement les cpusets abandonnĂ©s.
Le drapeau notify_on_release du cpuset racine est désactivé (0) par défaut au moment du démarrage. La valeur par défaut pour les autres cpusets lors de leur création est égale à la valeur de notify_on_release de leur cpuset parent.
La commande /sbin/cpuset_release_agent est appelée, avec dans argv[1] le nom (un chemin relatif à /dev/cpuset ) du cpuset à supprimer.
Le contenu habituel de la commande /sbin/cpuset_release_agent est simplement le script shell suivant :
#!/bin/sh
rmdir /dev/cpuset/$1
Comme pour les autres drapeaux ci-dessous, ce drapeau peut ĂȘtre modifiĂ© en Ă©crivant un 0 ou un 1 ASCII (avec ou sans fin de ligne) dans le fichier pour respectivement dĂ©sactiver ou activer le drapeau.
Pression mémoire
Le fichier memory_pressure dâun cpuset indique la moyenne instantanĂ©e du taux auquel les processus du cpuset tentent de libĂ©rer de la mĂ©moire utilisĂ©e sur les nĆuds du cpuset pour satisfaire les nouvelles demandes de mĂ©moire.
Ceci permet Ă un gestionnaire de tĂąches de superviser les tĂąches qui sâexĂ©cutent dans des cpuset dĂ©diĂ©s et dĂ©tecter efficacement la pression mĂ©moire quâune tĂąche produit.
Ceci est utile Ă la fois pour les systĂšmes trĂšs surveillĂ©s qui exĂ©cutent diverses tĂąches qui leurs sont fournies et peuvent choisir de terminer ou de changer la prioritĂ© des tĂąches qui essaient dâutiliser plus de mĂ©moire que les nĆuds mĂ©moire qui leurs ont Ă©tĂ© assignĂ©s leurs permettent, et les systĂšmes pour du calcul scientifique avec des tĂąches parallĂšles, fortement couplĂ©es, au temps dâexĂ©cution important, qui ne pourraient plus fournir les performances demandĂ©es si elles se mettaient Ă utiliser plus de mĂ©moire quâelles nâen ont droit.
Ce mĂ©canisme fourni un moyen trĂšs Ă©conomique pour dĂ©tecter des signes de pression mĂ©moire sur un cpuset. Lâaction Ă effectuer lorsquâun signe de pression mĂ©moire est dĂ©tectĂ© est laissĂ© au libre arbitre du gestionnaire des tĂąches ou autre code utilisateur.
Ă moins que le calcul de la pression mĂ©moire soit activĂ© par le pseudofichier /dev/cpuset/cpuset.memory_pressure_enabled , cette pression mĂ©moire nâest calculĂ©e pour aucun cpuset et les lectures dans les fichiers memory_pressure renvoient toujours zĂ©ro, câest-Ă -dire la chaĂźne ASCII « 0\en ». Consultez la section AVERTISSEMENTS ci-dessous.
Une moyenne instantanée par cpuset est utilisée pour les raisons suivantes :
|
- |
Comme cette mĂ©trique est par cpuset plutĂŽt que par processus ou par rĂ©gion mĂ©moire virtuelle, la charge du systĂšme due Ă la supervision de cette mĂ©trique par un ordonnanceur de tĂąches est fortement rĂ©duite sur les gros systĂšmes, Ă©tant donnĂ© quâil nâest pas nĂ©cessaire de parcourir la liste des tĂąches Ă chaque fois. |
||
|
- |
Comme cette mĂ©trique est une moyenne instantanĂ©e plutĂŽt quâun compteur, un ordonnanceur de tĂąches obtient la pression mĂ©moire en une seule lecture sans avoir Ă lire et se souvenir des rĂ©sultats pendant un certain temps. |
||
|
- |
Comme cette mĂ©trique est par cpuset plutĂŽt que par processus, lâordonnanceur de tĂąches peut obtenir lâinformation importante, la pression mĂ©moire dans un cpuset, en une seule lecture sans nĂ©cessiter dâobtenir et de se souvenir des rĂ©sultats pour tous les processus dâun cpuset (la liste des processus peut changer dynamiquement). |
La pression mĂ©moire dâun cpuset est calculĂ©e en utilisant un simple filtre digital par cpuset dans le noyau. Pour chaque cpuset, ce filtre suit le taux auquel les processus attachĂ©s Ă ce cpuset demandent au noyau de rĂ©utiliser de la mĂ©moire.
Ces demandes de rĂ©utilisation de mĂ©moire se produisent quand un processus doit satisfaire une demande de page mĂ©moire en trouvant dâabord une page Ă rĂ©utiliser, du fait de lâabsence de page disponible dĂ©jĂ prĂȘte. Les pages sales des systĂšmes de fichiers sont rĂ©utilisĂ©es en les Ă©crivant dâabord sur le disque. Les tampons des systĂšmes de fichiers qui nâont pas Ă©tĂ© modifiĂ©s sont rĂ©utilisĂ©s tout simplement en les abandonnant, mais si cette page est nĂ©cessaire de nouveau, il faudra la relire sur le disque.
Le fichier cpuset.memory_pressure fournit un nombre entier qui reprĂ©sente le taux des demandes rĂ©centes (la demi-vie est de 10 secondes) de rĂ©utilisation de mĂ©moire par les processus du cpuset, lâunitĂ© Ă©tant le nombre de demandes par seconde fois 1000.
Répartition mémoire
Il y a deux fichiers, par cpuset, pour des drapeaux boolĂ©ens qui contrĂŽlent oĂč le noyau alloue les pages pour les tampons des systĂšmes de fichiers et les structures de donnĂ©es liĂ©es internes au noyau. Ces fichiers sont cpuset.memory_spread_page et cpuset.memory_spread_slab .
Si le drapeau boolĂ©en cpuset.memory_spread_page est activĂ©, alors le noyau rĂ©partit les tampons des systĂšmes de fichiers (les caches des pages) Ă©quitablement sur tous les nĆuds autorisĂ©s pour le processus qui demande la page, au lieu de placer ces pages de prĂ©fĂ©rence sur le nĆud sur lequel sâexĂ©cute le processus.
Si le drapeau boolĂ©en cpuset.memory_spread_slab dâun cpuset est activĂ©, alors le noyau rĂ©partira uniformĂ©ment les caches slab liĂ©s aux systĂšmes de fichiers, comme ceux pour des entrĂ©es dâinĆuds ou de rĂ©pertoires, sur tous les nĆuds autorisĂ©s pour le processus qui demande de la mĂ©moire, plutĂŽt que de prĂ©fĂ©rer mettre ces pages sur le nĆud sur lequel sâexĂ©cute le processus.
La configuration de ces drapeaux nâaffecte pas les pages du segment de donnĂ©es (consultez brk (2)) ou du segment de la pile dâun processus.
Par dĂ©faut, les deux types de rĂ©partition de la mĂ©moire sont dĂ©sactivĂ©s et le noyau prĂ©fĂšre allouer la mĂ©moire sur le nĆud local oĂč sâexĂ©cute le processus. Si ce nĆud nâest pas autorisĂ© par la politique NUMA du processus ou par la configuration des cpusets ou sâil nây a plus suffisamment de pages mĂ©moire disponibles sur ce nĆud, alors le noyau recherche le nĆud le plus proche Ă©tant autorisĂ© et ayant suffisamment de pages disponibles.
Quand un nouveau cpuset est créé, il hérite de la configuration de répartition mémoire de son pÚre.
Activer la rĂ©partition mĂ©moire a pour effet dâignorer la politique mĂ©moire NUMA du processus pour les allocations de pages ou de caches slab, qui sont alors Ă©parpillĂ©es. Cependant, les changements dus Ă la rĂ©partition mĂ©moire demandĂ©e par un cpuset ne sont pas visibles pour les appels systĂšme mbind (2) ou set_mempolicy (2). Ces deux appels systĂšme liĂ©s Ă la politique mĂ©moire NUMA semblent se comporter comme si aucune rĂ©partition mĂ©moire nâĂ©tait demandĂ©e par un cpuset, mĂȘme si câest le cas. Si la rĂ©partition mĂ©moire est par la suite dĂ©sactivĂ©e pour les cpuset, la derniĂšre politique mĂ©moire NUMA dĂ©finie par ces appels est automatiquement appliquĂ©e de nouveau.
cpuset.memory_spread_page et cpuset.memory_spread_slab sont tous les deux des fichiers contenant des drapeaux booléens. Par défaut, ils contiennent un « 0 », ce qui signifie que la fonctionnalité est désactivée pour ce cpuset. Si un « 1 » est écrit dans le fichier, la fonctionnalité correspondante est activée.
La rĂ©partition mĂ©moire dâun cpuset se comporte de façon similaire Ă ce qui est connu (dans dâautres contextes) comme le placement mĂ©moire Ă tour de rĂŽle (« round-robin ») ou entrelacĂ© (« interleave »).
La configuration dâune stratĂ©gie de rĂ©partition mĂ©moire pour un cpuset peut amĂ©liorer significativement les performances pour les tĂąches qui :
|
- |
nĂ©cessitent de placer les donnĂ©es locales des threads dans des nĆuds mĂ©moire proches des CPU qui exĂ©cutent les threads qui accĂšdent le plus frĂ©quemment Ă ces donnĂ©es ; mais aussi |
||
|
- |
nĂ©cessitent dâaccĂ©der Ă de gros ensembles de donnĂ©es de systĂšmes de fichiers qui doivent ĂȘtre rĂ©partis sur diffĂ©rents nĆuds du cpuset de la tĂąche du fait de leurs tailles. |
Sans cette politique, la rĂ©partition des allocations mĂ©moire sur les nĆuds du cpuset de la tĂąche peut ne pas ĂȘtre Ă©quitable, particuliĂšrement pour les tĂąches qui nâauraient quâun thread chargĂ© de lâinitialisation ou de la lecture des donnĂ©es dâentrĂ©e.
Migration mémoire
Normalement, avec la configuration de cpuset.memory_migrate par dĂ©faut (dĂ©sactivĂ©), une fois quâune page est allouĂ©e (une page physique de la mĂ©moire lui est donnĂ©e), cette page reste sur le nĆud oĂč elle a Ă©tĂ© allouĂ©e, tant quâelle reste allouĂ©e, mĂȘme si la politique de placement mĂ©moire du cpuset ( mems ) change par la suite.
Quand la migration mĂ©moire est activĂ©e pour un cpuset, si la configuration de mems est modifiĂ©e alors toute page mĂ©moire utilisĂ©e par un processus du cpuset qui se trouverait sur un nĆud mĂ©moire qui nâest plus autorisĂ© sera dĂ©placĂ©e sur un nĆud mĂ©moire qui est autorisĂ©.
De plus, si un processus est dĂ©placĂ© dans un cpuset dont le drapeau memory_migrate est activĂ©, toutes les pages mĂ©moire quâil utilise et qui se trouvent sur des nĆuds mĂ©moire qui Ă©taient autorisĂ©s dans son cpuset prĂ©cĂ©dant mais ne le sont plus dans le nouveau cpuset seront dĂ©placĂ©es sur un nĆud mĂ©moire autorisĂ© pour le nouveau cpuset.
Lâemplacement relatif dâun page dĂ©placĂ©e dâun cpuset est prĂ©servĂ© si possible lors de ces opĂ©rations de dĂ©placement. Par exemple, si la page se trouvait sur le deuxiĂšme nĆud valable du prĂ©cĂ©dent cpuset, alors la page sera placĂ©e sur le deuxiĂšme nĆud valable du nouveau cpuset, si câest possible.
RĂ©partition de la charge par lâordonnanceur
Lâordonnanceur du noyau rĂ©partit automatiquement la charge des processus. Si un CPU est sous-utilisĂ©, le noyau recherchera des processus sur dâautres CPU plus chargĂ©s et dĂ©placera ces processus sur le CPU sous-utilisĂ© Ă condition que les mĂ©canismes comme les cpuset et sched_setaffinity (2) le permettent.
Le coĂ»t de lâalgorithme de rĂ©partition de la charge et son impact sur les structures de donnĂ©es partagĂ©es du noyau, comme la liste des processus, augmente plus que linĂ©airement avec le nombre de CPU qui interviennent pour la rĂ©partition de la charge. Par exemple le coĂ»t pour la rĂ©partition de la charge dans un grand ensemble de CPU sera supĂ©rieur Ă celui pour la rĂ©partition de la charge dans deux ensembles ayant moitiĂ© moins de CPU. (La relation entre le nombre de CPU intervenant dans la rĂ©partition de la charge et le coĂ»t de cette rĂ©partition de charge dĂ©pend de lâimplĂ©mentation de lâordonnanceur de processus du noyau, qui change dans le temps quand de meilleurs algorithmes dâordonnancement sont implĂ©mentĂ©s)
Le drapeau sched_load_balance dâun cpuset permet de supprimer cette rĂ©partition automatique de la charge dans les cas oĂč elle nâest pas nĂ©cessaire et que sa suppression amĂ©liorerait les performances.
Par dĂ©faut, la rĂ©partition de la charge se fait sur tous les CPU, Ă lâexception de ceux marquĂ©s comme Ă©tant isolĂ©s en utilisant au moment du dĂ©marrage le paramĂštre du noyau « isolcpus= ». (Consultez la section Niveau du domaine de dĂ©tente de lâordonnanceur ci-dessous pour changer le comportement par dĂ©faut)
Cette rĂ©partition de la charge par dĂ©faut nâest pas bien adaptĂ©e aux situations suivantes :
|
- |
Sur les gros systĂšmes, la rĂ©partition de la charge sur beaucoup de CPU est trĂšs coĂ»teuse. Si le systĂšme est gĂ©rĂ© avec des cpusets pour placer les tĂąches indĂ©pendantes sur diffĂ©rents ensembles de CPU, une rĂ©partition de la charge complĂšte nâest pas nĂ©cessaire. |
||
|
- |
Les systĂšmes avec une prise en charge temps-rĂ©el sur certains CPU doivent minimiser la surcharge du systĂšme sur ces CPU et donc Ă©viter la rĂ©partition de la charge des processus si elle nâest pas nĂ©cessaire. |
Quand le drapeau sched_load_balance dâun cpuset est activĂ© (ce qui est le cas par dĂ©faut), une rĂ©partition de la charge sur tous les CPU autorisĂ©s par le cpuset est demandĂ©, Ă condition que le processus puisse ĂȘtre dĂ©placĂ© dâun CPU du cpuset Ă un autre CPU (câest-Ă -dire quâil nâait pas Ă©tĂ© attachĂ© Ă des CPU avec, par exemple, sched_setaffinity (2)).
Quand le drapeau sched_load_balance dâun cpuset est dĂ©sactivĂ©, alors lâordonnanceur Ă©vitera de dĂ©placer des processus pour rĂ©partir la charge des CPU du cpuset, sauf si un autre cpuset partage le mĂȘme CPU et a son drapeau sched_load_balance activĂ©.
Ainsi, par exemple, si le cpuset racine a son drapeau sched_load_balance activĂ©, alors lâordonnanceur rĂ©partira la charge sur tous les CPU et la configuration du drapeau sched_load_balance des autres cpusets nâa pas dâeffet, puisquâune rĂ©partition complĂšte de la charge est dĂ©jĂ demandĂ©e.
Dans les deux situations ci-dessus, le drapeau sched_load_balance devrait donc ĂȘtre dĂ©sactivĂ© sur le cpuset racine et seuls les cpusets fils plus petits devraient lâactiver.
Lorsque vous faites ceci, vous ne devez gĂ©nĂ©ralement pas laisser un processus non attachĂ© Ă un CPU dans le cpuset racine qui pourrait utiliser les CPU de façon non nĂ©gligeable. De cette façon les processus peuvent ĂȘtre artificiellement contraints Ă un sous ensemble des CPU en fonction de la configuration de ce drapeau dans les cpusets descendants. MĂȘme si ce processus pourrait utiliser des cycles CPU inutilisĂ©s par certains CPU, lâordonnanceur du noyau ne cherchera pas Ă rĂ©partir la charge du processus sur le CPU sous utilisĂ©.
Bien sĂ»r, les processus attachĂ©s Ă un CPU particulier peuvent ĂȘtre laissĂ©s dans un cpuset qui dĂ©sactive sched_load_balance puisque ces processus ne peuvent ĂȘtre dĂ©placĂ©s de toute façon.
Niveau du domaine de dĂ©tente de lâordonnanceur
Lâordonnanceur du noyau effectue une rĂ©partition de la charge immĂ©diate lorsquâun CPU devient disponible ou lorsquâune autre tĂąche est prĂȘte. Cette rĂ©partition de la charge permet de sâassurer que le plus de CPU possibles sont utilisĂ©s efficacement en exĂ©cutant des tĂąches. Le noyau effectue aussi une rĂ©partition de la charge de façon plus sporadique sur la base de lâhorloge logicielle dĂ©crite dans time (7). La configuration de sched_relax_domain_level ne sâapplique quâĂ la rĂ©partition de charge automatique. IndĂ©pendamment de la configuration de sched_relax_domain_level , une rĂ©partition de charge sporadique est effectuĂ©e Ă travers tous les CPU (sauf si cela a Ă©tĂ© dĂ©sactivĂ© avec sched_load_balance ). Dans tous les cas, bien sĂ»r, les tĂąches ne seront exĂ©cutĂ©es que sur les CPU autorisĂ©s par leur cpuset et par les appels systĂšmes sched_setaffinity (2).
Sur les petits systĂšmes, avec peu de CPU, la rĂ©partition de charge immĂ©diate est utile pour amĂ©liorer lâinteractivitĂ© du systĂšme et minimiser les cycles CPU inutilisĂ©s. Mais sur les gros systĂšmes, essayer de rĂ©partir la charge immĂ©diatement sur un nombre important de CPU peut ĂȘtre plus coĂ»teux que ce que ça ne rapporte, en fonction des performances des diffĂ©rentes tĂąches et du matĂ©riel.
La signification exacte des petites valeurs de sched_relax_domain_level dĂ©pendra de lâimplĂ©mentation de lâordonnanceur du noyau et de lâarchitecture non uniforme du matĂ©riel. Ces deux paramĂštres Ă©volueront dans le temps et dĂ©pendent de lâarchitecture du systĂšme et de la version du noyau.
à ce jour, quand cette capacité a été introduite sous Linux 2.6.26, la signification des valeurs positives de sched_relax_domain_level est la suivante pour certaines des architectures les plus courantes :
|
1 |
Effectuer immĂ©diatement une rĂ©partition de la charge sur les diffĂ©rents Hyper-Thread frĂšres dâun mĂȘme cĆur. |
||
|
2 |
Effectuer immĂ©diatement une rĂ©partition de la charge sur les diffĂ©rents cĆurs dâun processeur. |
||
|
3 |
Effectuer immĂ©diatement une rĂ©partition de la charge sur les diffĂ©rents CPU dâun mĂȘme nĆud ou dâune mĂȘme lame. |
||
|
4 |
Effectuer immĂ©diatement une rĂ©partition de la charge sur les diffĂ©rents (dĂ©tail dâimplĂ©mentation) nĆuds [pour les systĂšmes NUMA]. |
||
|
5 |
Effectuer immĂ©diatement une rĂ©partition de la charge sur tous les CPU dâun systĂšme [pour les systĂšmes NUMA]. |
La valeur zĂ©ro (0) pour sched_relax_domain_level signifie toujours quâil nây a pas de rĂ©partition de charge immĂ©diate, et donc la rĂ©partition de la charge sâeffectue pĂ©riodiquement et non pas immĂ©diatement quand un CPU devient disponible ou quâune tĂąche peut ĂȘtre exĂ©cutĂ©e.
La valeur -1 pour sched_relax_domain_level signifie toujours quâil faut utiliser la valeur par dĂ©faut du systĂšme. La valeur par dĂ©faut du systĂšme peut varier en fonction de lâarchitecture et du noyau. Cette valeur par dĂ©faut du systĂšme peut ĂȘtre modifiĂ©e en fournissant au noyau un paramĂštre « relax_domain_level= » lors du dĂ©marrage.
Si des cpusets partagent des CPU et ont des valeurs de sched_relax_domain_level incompatibles, alors la valeur la plus Ă©levĂ©e sâapplique Ă tous les CPU de ces cpusets. Dans ce cas, -1 est la valeur la plus faible, remplacĂ©e par toute autre valeur et -0 est la valeur la plus faible suivante.
FORMATS
Les formats suivants sont utilisĂ©s pour reprĂ©senter des ensembles de CPU et de nĆuds mĂ©moire.
Affichage sous forme de masque
Lâ Affichage sous forme de masque est utilisĂ© pour reprĂ©senter les masques de bits des CPU et nĆuds mĂ©moire dans le fichier /proc/ pid /status .
Ce format affiche chaque mot de 32 bits au format hexadĂ©cimal (en utilisant les caractĂšres ASCII « 0 » - « 9 » et « a » - « f ») ; le dĂ©but des mots est complĂ©tĂ© par des zĂ©ros si nĂ©cessaire. Pour les masques de plus dâun mot, une virgule est utilisĂ©e pour sĂ©parer les mots. Les mots sont affichĂ© au format grand boutiste, avec le bit le plus significatif en premier. Les chiffres hexadĂ©cimaux dâun mot utilise aussi lâordre grand boutiste.
Le nombre de mots de 32 bits affichés est le nombre minimal nécessaire pour afficher tous les bits du masque, en fonction de la taille du masque de bits.
Exemple dâ Affichage sous forme de masque :
00000001 # seul
le bit 0
40000000,00000000,00000000 # seul le bit 94
00000001,00000000,00000000 # seul le bit 64
000000ff,00000000 # seuls les bits 32-39
00000000,000e3862 # les bits 1,5,6,11-13,17-19
Un masque avec les bits 0, 1, 2, 4, 8, 16, 32 et 64 activés sera affiché de cette façon :
00000001,00000001,00010117
Le premier « 1 » correspond au bit 64, le second au bit 32, le troisiÚme au bit 16, le quatriÚme au bit 8, le cinquiÚme au bit 4 et le « 7 » correspond aux bits 2, 1 et 0.
Affichage sous forme de liste
Lâ Affichage sous forme de liste pour les fichiers cpus et mems est une liste de numĂ©ros ou intervalles de CPU ou de nĆuds mĂ©moire sĂ©parĂ©s par des virgules, en dĂ©cimal au format ASCII.
Exemple dâ Affichage sous forme de liste :
0-4,9 # bits 0,
1, 2, 3, 4 et 9 activés
0-2,7,12-14 # bits 0, 1, 2, 7, 12, 13 et 14
activés
RĂGLES
Les rĂšgles suivantes sâappliquent Ă chaque cpuset :
|
- |
Ses CPU et nĆuds mĂ©moire doivent ĂȘtre des sous-ensembles de ceux de leur parent (ou les mĂȘmes ensembles). |
||
|
- |
Il ne peut ĂȘtre marquĂ© avec cpu_exclusive que si son parent lâest. |
||
|
- |
Il ne peut ĂȘtre marquĂ© avec mem_exclusive que si son parent lâest. |
||
|
- |
Sâil est marquĂ© avec cpu_exclusive , ses CPU ne doivent pas ĂȘtre partagĂ©s avec ses frĂšres. |
||
|
- |
Sâil est marquĂ© avec mem_exclusive , ses nĆuds mĂ©moire ne doivent pas ĂȘtre partagĂ©s avec ses frĂšres. |
PERMISSIONS
Les permissions dâun cpuset sont dĂ©terminĂ©es par les permissions des rĂ©pertoires et pseudofichiers du systĂšme de fichiers cpuset, normalement montĂ© dans /dev/cpuset .
Par exemple, un processus peut se placer dans un autre cpuset sâil peut Ă©crire dans le fichier tasks de ce cpuset. Ceci nĂ©cessite les permission dâexĂ©cution des rĂ©pertoires Ă traverser et la permission dâĂ©crire dans le fichier tasks .
Une contrainte supplĂ©mentaire sâapplique aux demandes de dĂ©placement dâautres processus dans un cpuset. Un processus ne peut pas attacher un autre processus Ă un cpuset Ă moins quâil ait la permission dâenvoyer un signal Ă ce processus (consultez kill (2)).
Un processus peut crĂ©er un cpuset fils sâil a accĂšs et peut Ă©crire dans le rĂ©pertoire du cpuset pĂšre. Il peut modifier les CPU et nĆuds mĂ©moire dâun cpuset sâil a accĂšs au rĂ©pertoire de ce cpuset (les permissions dâexĂ©cuter tous les rĂ©pertoires parents) et sâil peut Ă©crire dans les fichiers correspondants cpus ou mems .
Il y a une petite diffĂ©rence entre la maniĂšre dont ces permissions sont Ă©valuĂ©es et la maniĂšre dont sont Ă©valuĂ©es les permissions pour les opĂ©rations sur des systĂšmes de fichiers normaux. Le noyau interprĂšte les chemins relatifs en fonction du rĂ©pertoire de travail actuel dâun processus. MĂȘme quand on opĂšre sur un fichier dâun cpuset, les chemins relatifs sont interprĂ©tĂ©s en fonction du rĂ©pertoire de travail du processus, et non pas relativement au cpuset actuel du processus. Les seules façons pour que les chemins de cpusets soient interprĂ©tĂ©s relativement au cpuset actuel du processus sont soit que le processus utilise le rĂ©pertoire du cpuset comme rĂ©pertoire de travail (il a dâabord effectuĂ© un cd ou chdir (2) dans le rĂ©pertoire de son cpuset dans /dev/cpuset , ce qui est plutĂŽt inhabituel), soit que du code utilisateur convertit le chemin relatif au cpuset en un chemin absolu.
En thĂ©orie, ceci signifie que le code utilisateur devrait indiquer les cpusets en utilisant des chemins absolus, ce qui nĂ©cessite de connaĂźtre le point de montage du systĂšme de fichier cpuset (dâhabitude, mais sans que ce soit nĂ©cessaire, /dev/cpuset ). En pratique, Ă la connaissance de lâauteur, tous les utilitaires en mode utilisateur supposent que si le systĂšme de fichier cpuset est montĂ©, alors il est montĂ© dans /dev/cpuset . De plus, une pratique assez courante utilisĂ© pour du code Ă©crit soigneusement consiste Ă vĂ©rifier la prĂ©sence du pseudofichier /dev/cpuset/tasks afin de vĂ©rifier que le pseudosystĂšme de fichiers cpuset est bien montĂ©.
AVERTISSEMENTS
Activation de memory_pressure
Par dĂ©faut, le fichier cpuset.memory_pressure dâun cpuset vaut zĂ©ro (0). Ă moins que cette fonctionnalitĂ© soit activĂ©e en Ă©crivant « 1 » dans le pseudofichier /dev/cpuset/cpuset.memory_pressure_enabled , le noyau ne calcule pas les valeurs des fichiers memory_pressure de chaque cpuset.
Utilisation de la commande echo
Lorsque la commande echo est utilisĂ©e dans un interprĂ©teur de commandes pour changer les valeurs des fichiers dâun cpuset, soyez conscient que la commande echo interne Ă certains interprĂ©teurs de commandes nâaffiche pas de message dâerreur si lâappel systĂšme write (2) Ă©choue. Par exemple, si la commande :
echo 19 > cpuset.mems
Ă©choue parce que le nĆud mĂ©moire numĂ©ro 19 nâest pas autorisĂ© (par exemple le systĂšme nâa pas de nĆud mĂ©moire numĂ©ro 19), alors la commande echo peut nâafficher aucune erreur. If faut mieux utiliser la commande externe /bin/echo pour changer la configuration dâun fichier dâun cpuset puisque cette commande affichera les erreurs de write (2), comme par exemple :
/bin/echo 19
> cpuset.mems
/bin/echo : erreur dâĂ©criture :
argument invalide
EXCEPTIONS
Placement mémoire
Les contraintes des cpusets ne sâappliquent pas Ă toutes les allocations de mĂ©moire systĂšme pour les raisons suivantes :
Si la fonctionnalitĂ© de connexion Ă chaud est utilisĂ©e pour supprimer tous les CPU dâun cpuset, alors le noyau mettra Ă jour automatiquement la liste de CPU autorisĂ©s ( cpus_allowed ) de tous les processus attachĂ©s aux CPU du cpuset et autorisera tous les CPU. Le comportement est similaire lorsque la fonctionnalitĂ© de connexion Ă chaud est utilisĂ©e pour la mĂ©moire. En gĂ©nĂ©ral, le noyau prĂ©fĂšre ne pas tenir compte du placement sur les CPU ou les nĆuds mĂ©moire plutĂŽt que dâabandonner un processus dont tous les CPU ou nĆuds mĂ©moire autorisĂ©s sont dĂ©connectĂ©s. Le code utilisateur devrait reconfigurer les cpusets pour ne mentionner que les CPU et les nĆuds mĂ©moire en ligne lorsque la fonctionnalitĂ© de connexion Ă chaud est utilisĂ©e pour ajouter ou retirer ces ressources.
Quelques demandes dâallocation mĂ©moire critiques et internes au noyau, marquĂ©es GFP_ATOMIC, doivent ĂȘtre satisfaites immĂ©diatement. Le noyau peut rater des demandes ou ne pas fonctionner correctement si certaines de ces allocations Ă©chouent. Si une de ces demandes ne peut ĂȘtre satisfaite par le cpuset du processus en cours, alors les contraintes du cpuset sont relĂąchĂ©es et le noyau recherche de la mĂ©moire lĂ oĂč il peut en trouver. Il est prĂ©fĂ©rable de ne pas respecter un cpuset plutĂŽt que de stresser le noyau.
Les allocations de mĂ©moire demandĂ©es par des pilotes du noyau lors du traitement dâune interruption ne se trouvent dans le contexte dâaucun processus et ne sont donc pas contraintes par les cpusets.
Renommer des cpusets
Vous pouvez utiliser lâappel systĂšme rename (2) pour renommer des cpusets. Seuls des renommages simples sont pris en charge ; câest-Ă -dire que changer le nom du rĂ©pertoire dâun cpuset est autorisĂ©, mais dĂ©placer le rĂ©pertoire dâun cpuset dans un autre rĂ©pertoire nâest pas autorisĂ©.
ERREURS
LâimplĂ©mentation des cpusets du noyau Linux positionne errno pour indiquer la raison de lâĂ©chec dâun appel systĂšme liĂ© Ă un cpuset.
Les valeurs possible pour errno et leurs significations, lors dâun Ă©chec dâun appel systĂšme liĂ© Ă un cpuset sont listĂ©es ci-dessous :
|
E2BIG |
Tentative dâĂ©criture ( write (2)) dans un fichier spĂ©cial dâun cpuset avec une longueur supĂ©rieure Ă la longueur autorisĂ©e par le noyau pour ces Ă©critures. |
||
|
EACCES |
Tentative dâĂ©criture ( write (2)) dâun identifiant de processus (PID) dans le fichier tasks dâun cpuset alors que lâappelant nâest pas autorisĂ© Ă dĂ©placer le processus. |
||
|
EACCES |
Tentative dâajout, avec write (2), dâun CPU ou dâun nĆud mĂ©moire dans un cpuset alors que ce CPU ou ce nĆud mĂ©moire ne se trouve pas dans le cpuset parent. |
||
|
EACCES |
Tentative dâactivation, avec write (2), de cpuset.cpu_exclusive ou de cpuset.mem_exclusive sur un cpuset dont le parent nâa pas ces propriĂ©tĂ©s. |
||
|
EACCES |
Tentative dâĂ©criture ( write (2)) dans un fichier cpuset.memory_pressure . |
||
|
EACCES |
Tentative de crĂ©ation dâun fichier dans le rĂ©pertoire dâun cpuset. |
||
|
EBUSY |
Tentative de suppression, avec rmdir (2), dâun cpuset auquel sont attachĂ©s des processus. |
||
|
EBUSY |
Tentative de suppression, avec rmdir (2), dâun cpuset ayant des ensembles de CPU fils. |
||
|
EBUSY |
Tentative de suppression dâun CPU ou dâun nĆud mĂ©moire dâun cpuset alors que le CPU ou le nĆud mĂ©moire se trouve Ă©galement dans un des fils du cpuset. |
||
|
EEXIST |
Tentative de crĂ©ation, avec mkdir (2), dâun cpuset qui existe dĂ©jĂ . |
||
|
EEXIST |
Tentative de renommage ( rename (2)) dâun cpuset avec un nom dĂ©jĂ utilisĂ©. |
||
|
EFAULT |
Tentative de lecture ( read (2)) ou dâĂ©criture ( write (2)) dans un fichier dâun cpuset en utilisant un tampon en dehors de lâespace mĂ©moire accessible par le processus appelant. |
||
|
EINVAL |
Tentative de modification dâun cpuset, en utilisant write (2), de telle sorte que les attributs cpu_exclusive ou mem_exclusive ne soient plus respectĂ©s pour ce cpuset ou ses frĂšres. |
||
|
EINVAL |
Tentative dâĂ©criture (avec write (2)) dâune liste vide dans cpuset.cpus ou cpuset.mems pour un cpuset auquel sont dĂ©jĂ attachĂ©s des processus ou des cpuset fils. |
||
|
EINVAL |
Tentative dâĂ©criture (avec write (2)) dans cpuset.cpus ou cpuset.mems dâune liste qui comprend un intervalle dont la borne supĂ©rieure est infĂ©rieure Ă la borne infĂ©rieure. |
||
|
EINVAL |
Tentative dâĂ©criture (avec write (2)) dans cpuset.cpus ou cpuset.mems dâune liste dont la chaĂźne comprend un caractĂšre non valable. |
||
|
EINVAL |
Tentative dâĂ©criture (avec write (2)) dans le fichier cpuset.cpus dâune liste qui ne comprend aucun CPU en ligne. |
||
|
EINVAL |
Tentative dâĂ©criture (avec write (2)) dans le fichier cpuset.mems dâune liste qui ne comprend aucun nĆud mĂ©moire en ligne. |
||
|
EINVAL |
Tentative dâĂ©criture (avec write (2)) dans le fichier cpuset.mems dâune liste qui comprend un nĆud qui ne contient pas de mĂ©moire. |
||
|
EIO |
Tentative dâĂ©criture (avec write (2)) dans le fichier tasks dâun cpuset dâune chaĂźne qui ne commence pas par un entier dĂ©cimal au format ASCII. |
||
|
EIO |
Tentative de renommage (avec rename (2)) dâun cpuset dans un autre rĂ©pertoire. |
ENAMETOOLONG
Tentative de lecture (avec read (2)) du fichier /proc/ pid /cpuset dâun cpuset, pour lequel le chemin est plus long que la taille des pages du noyau.
ENAMETOOLONG
Tentative de crĂ©ation, avec mkdir (2), dâun cpuset dont le nom du rĂ©pertoire de base fait plus de 255 caractĂšres.
ENAMETOOLONG
Tentative de crĂ©ation, avec mkdir (2), dâun cpuset dont le chemin complet, prĂ©fixe du point de montage compris (typiquement « /dev/cpuset/ »), fait plus de 4095 caractĂšres.
|
ENODEV |
Le cpuset a Ă©tĂ© supprimĂ© par un autre processus en mĂȘme temps quâune tentative dâĂ©criture (avec write (2)) sur un des pseudofichiers du rĂ©pertoire du cpuset. |
||
|
ENOENT |
Tentative de crĂ©ation, avec mkdir (2), dâun cpuset dans un cpuset parent qui nâexiste pas. |
||
|
ENOENT |
Tentative dâaccĂ©der Ă (avec access (2)) ou dâouvrir (avec open (2)) un fichier inexistant du rĂ©pertoire dâun cpuset. |
||
|
ENOMEM |
Pas assez de mémoire disponible pour le noyau ; ceci peut se produire pour différents appels systÚme liés aux cpusets, mais seulement si le systÚme manque beaucoup de mémoire. |
||
|
ENOSPC |
Tentative dâĂ©criture (avec write (2)) de lâidentifiant dâun processus dans le fichier tasks dâun cpuset alors que les fichiers cpuset.cpus ou cpuset.mems sont vides. |
||
|
ENOSPC |
Tentative dâĂ©criture (avec write (2)) dâun fichier cpuset.cpus ou cpuset.mems vide dans un cpuset auquel sont attachĂ©es des tĂąches. |
ENOTDIR
Tentative de renommage (avec rename (2)) dâun cpuset qui nâexiste pas.
|
EPERM |
Tentative de suppression dâun fichier dans le rĂ©pertoire dâun cpuset. |
||
|
ERANGE |
Une liste pour cpuset.cpus ou cpuset.mems a Ă©tĂ© fournie au noyau mais comprend un nombre trop grand pour que le noyau lâajoute Ă son champ de bits. |
||
|
ESRCH |
Tentative dâĂ©criture (avec write (2)) de lâidentifiant dâun processus inexistant dans le fichier tasks dâun cpuset. |
VERSIONS
Cpusets est apparu pour la premiÚre fois dans Linux 2.6.12.
NOTES
Contrairement Ă ce que son nom indique, le paramĂštre pid est en fait un identifiant de thread. Chaque thread dâun groupe de threads peut ĂȘtre attachĂ© un cpuset diffĂ©rent. La valeur renvoyĂ©e par un appel Ă gettid (2) peut ĂȘtre fournie comme paramĂštre pid .
BOGUES
Les fichiers cpuset.memory_pressure peuvent ĂȘtre ouverts en Ă©criture en demandant une crĂ©ation ou troncature, mais dans ce cas write (2) Ă©chouera en positionnant errno Ă EACCES , et les options de crĂ©ation ou de troncature de open (2) nâont aucun effet.
EXEMPLES
Voici des exemples pour lâaffichage et la modification dâoptions dâun cpuset Ă lâaide dâun interprĂ©teur de commandes.
CrĂ©er et sâattacher Ă un cpuset.
Voici les Ă©tapes pour crĂ©er un nouveau cpuset et lui attacher lâinterprĂ©teur de commandes en cours :
|
(1) |
mkdir /dev/cpuset (si ce nâest dĂ©jĂ fait) |
|||
|
(2) |
mount -t cpuset none /dev/cpuset (si ce nâest dĂ©jĂ fait) |
|||
|
(3) |
Créer un nouveau cpuset avec mkdir (1). |
|||
|
(4) |
Assigner des CPU et nĆuds mĂ©moire au nouveau cpuset. |
|||
|
(5) |
Attacher lâinterprĂ©teur de commandes au nouveau cpuset. |
Par exemple, la sĂ©quence de commandes suivante dĂ©finira un cpuset appelĂ© « Charlie », ne contenant que les CPU 2 et 3 et le nĆud mĂ©moire 1, et attachera lâinterprĂ©teur de commandes en cours Ă ce cpuset.
$
mkdir
/dev/cpuset
$
mount -t cpuset cpuset /dev/cpuset
$
cd /dev/cpuset
$
mkdir Charlie
$
cd Charlie
$
/bin/echo 2-3 > cpuset.cpus
$
/bin/echo 1 > cpuset.mems
$
/bin/echo $$ > tasks
# Le shell en cours sâexĂ©cute dĂ©sormais
dans le cpuset Charlie
# La ligne suivante devrait afficher
« /Charlie »
$
cat /proc/self/cpuset
DĂ©placer des tĂąches sur dâautres nĆuds mĂ©moire.
Pour dĂ©placer les tĂąches attachĂ©es Ă un cpuset sur dâautres CPU et dâautres nĆuds mĂ©moire du systĂšme et dĂ©placer les pages mĂ©moires actuellement allouĂ©es par ces processus, effectuez les Ă©tapes suivantes :
|
(1) |
Supposons quâil faille dĂ©placer les tĂąches du cpuset alpha (les CPU 4â7 et nĆuds mĂ©moire 2â3) vers un autre cpuset beta (CPU 16â19 et nĆuds mĂ©moire 8â9). |
||
|
(2) |
CrĂ©er dâabord le nouveau cpuset beta . |
||
|
(3) |
Autoriser les CPU 16â19 et les nĆuds mĂ©moire 8â9 pour beta . |
||
|
(4) |
Activer memory_migration dans beta . |
||
|
(5) |
DĂ©placer chaque tĂąche dâ alpha vers beta . |
La séquence de commandes suivante effectue cela.
$
cd
/dev/cpuset
$
mkdir beta
$
cd beta
$
/bin/echo 16-19 > cpuset.cpus
$
/bin/echo 8-9 > cpuset.mems
$
/bin/echo 1 > cpuset.memory_migrate
$
while read i; do /bin/echo $i; done < ../alpha/tasks
> tasks
La sĂ©quence ci-dessus dĂ©place tous les processus de alpha vers beta et dĂ©place toute mĂ©moire utilisĂ©e par ces processus sur les nĆuds mĂ©moire 2â3 vers les nĆuds mĂ©moire 8â9.
Notez que la derniĂšre Ă©tape de la sĂ©quence ci-dessus nâĂ©tait pas :
$ cp ../alpha/tasks tasks
La boucle while , plutĂŽt que lâutilisation de la commande cp (1), est nĂ©cessaire par ce quâun seul identifiant de processus Ă la fois peut ĂȘtre Ă©crit dans le fichier tasks .
La mĂȘme chose (lâĂ©criture dâun PID Ă la fois) peut se faire plus efficacement quâavec la boucle while , en moins de caractĂšre et dans une syntaxe qui fonctionne avec tous les interprĂ©teurs de commandes mais malheureusement de façon moins intelligible, en utilisant lâoption -u (sans tampon) de sed (1) :
$ sed -un p < ../alpha/tasks > tasks
VOIR AUSSI
taskset (1), get_mempolicy (2), getcpu (2), mbind (2), sched_getaffinity (2), sched_setaffinity (2), sched_setscheduler (2), set_mempolicy (2), CPU_SET (3), proc (5), cgroups (7), numa (7), sched (7), migratepages (8), numactl (8)
Documentation/admin-guide/cgroup-v1/cpusets.rst dans lâarborescence des sources du noyau Linux (ou Documentation/cgroup-v1/cpusets.txt avant Linux 4.18 et Documentation/cpusets.txt avant Linux 2.6.29)
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>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Pierre Giraud <jean-pierregiraud@neuf.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 .