\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{mar. juin 11 19:01:28 CEST 2013}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={cgroup},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Présentation},
CreationDate={D:20130611190128},
ModDate={D:20130611190128},
Keywords={Linux;Linux configuration}
}}
\begin{document}
 
\begin{center}
{\Huge cgroup }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Présentation}
 
\vspace{10mm}
 
\hspace{1mm}  Les \textbf{Control Groups} fournissent un mécanisme pour agréger/partitionner des jeux de tâches, et tous les futures enfants, dans des groupes hiérarchiques.
\vspace{5mm} \\
 
 
\hspace{1mm}  Un \textbf{cgroup} associe un jeu de tâches avec un jeu de paramètres pour un ou plusieurs sous-systèmes. un sous-système est un module qui utilise les facilités de groupement de tâches pour traiter ces groupes de tâche d'une manière particulière. un sous-système est typiquement un contrôleur de ressource.
\vspace{5mm} \\
 
 
\hspace{1mm}  Une hiérarchie est un jeu de \textbf{cgroups} arrangée en arborescence, de manière à ce que chaque tâche dans le système soit dans exactement un \textbf{cgroup} dans la hiérarchie. Chaque hiérarchie a une instance du \textbf{cgroup} de système de fichier virtuel avec lui.
\vspace{5mm} \\
 
 
\hspace{1mm}  Chaque tâche dans le système a un pointeur de référence vers un \textbf{css\_set}. Un css\_set contient un jeu de pointeur de référence vers des objets \textbf{cgroups\_subsys\_state}, un pour chaque \textbf{cgroup} enregistré dans le système.
\vspace{5mm} \\
 
 
\hspace{1mm}  Un système de fichier hiérarchique de \textbf{cgroup} peut être monté pour le voir et le manipuler depuis l'espace utilisateur. On peut lister toutes les tâches attachées à un cgroup.
\vspace{5mm} \\
 
 
\hspace{1mm}  Quand un cgroup est démonté, s'il y a des cgroups enfants, cette hiérarchie reste active. S'il n'y a pas de cgroups enfant, la hiérarchie est désactivé.
\vspace{5mm} \\
 
 
\hspace{1mm}  Chaque tâche sous \textbf{/proc} a un fichier nommé \textbf{cgroup} affichant, pour chaque hiérarchie active, les noms des sous systèmes et le nom du cgroup.
\vspace{5mm} \\
 
 
\hspace{1mm}  Chaque cgroup est représenté par un répertoire contenant les fichiers suivants:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} tasks]{liste des tâches attachées au cgroup.}
\item[\hspace{1mm} cgroup.procs]{liste des tgid dans ce cgroup.}
\item[\hspace{1mm} notify\_on\_release]{Permet lorsque la dernière tâche d'un cgroup se termine et que le dernier cgroup enfant est supprimé, que le kernel lance une commande spécifiée dans le fichier release\_agent}
\item[\hspace{1mm} release\_agent]{Le chemin à utiliser pour les notifications de release (existe dans le top cgroup uniquement)}
\item[\hspace{1mm} cgroup.clone\_children]{(0 ou 1) Tous les cgroups créés vont appeler post\_clone pour chaque sous-système du nouveau cgroup. ce callback copie les valeurs du parent.}
\item[\hspace{1mm} cgroup.event\_control]{(0 ou 1) active l'exécution du release\_agent}
\item[\hspace{1mm} cpu]{planifie l'accès du cpu aux cgroup}
\item[\hspace{1mm} cpu.shares]{Valeur entière de part relative du temps CPU disponible pour les tâches}
\item[\hspace{1mm} cpu.rt\_runtime\_us]{Période en microsecondes contiguë la plus longue autorisé relative à rt\_period\_us}
\item[\hspace{1mm} cpu.rt\_period\_us]{Période de temps en microsecondes de référence pour rt\_runtime\_us}
\item[\hspace{1mm} cpuset]{Assigne des cpu et des nœud mémoire à des cgroups}
\item[\hspace{1mm} cpuset.cpu\_exclusive]{(0 ou 1) spécifie si des cpusets autres que celui-ci, des ses parents ou enfants peuvent partager les cpu spécifiés}
\item[\hspace{1mm} cpuset.cpus]{Spécifie à quels CPU les tâches dans ce cgroup peuvent accéder}
\item[\hspace{1mm} cpuset.mem\_exclusive]{(0 ou 1) Spécifie si d'autre cpusets peuvent partager les nœuds de mémoire}
\item[\hspace{1mm} cpuset.mem\_hardwall]{(0 ou 1) Spécifie si les allocations au noyau de pages mémoire et données tampon sont restreintes aux nœuds mémoire spécifiés pour ce cpuset}
\item[\hspace{1mm} cpuset.memory\_migrate]{(0 ou 1) spécifie si une page en mémoire devrait migrer vers un nouveau nœud si les valeurs dans cpuset.mems changent}
\item[\hspace{1mm} cpuset.memory\_pressure]{Contient une moyenne de sollicitation de la mémoire des processus de ce cpuset. Est mis à jours lorsque memory\_pressure\_enabled est activé}
\item[\hspace{1mm} cpuset.memory\_pressure\_enabled]{(0 ou 1) Spécifie si le système doit calculer la sollicitation mémoire (memory\_pressure)}
\item[\hspace{1mm} cpuset.memory\_spread\_page]{(0 ou 1) Spécifie si les tampons de système de fichier doivent être placés de manière régulières sur les nœuds mémoire alloués à ce cpuset}
\item[\hspace{1mm} cpuset.memory\_spread\_slab]{(0 ou 1) Spécifie si les cache slab du noyau pour les opérations I/O doivent être placés de manière régulières sur le cpuset}
\item[\hspace{1mm} cpuset.mems]{Spécifie les nœuds de mémoire auxquels les tâches de ce cgroup ont accès}
\item[\hspace{1mm} cpuset.sched\_load\_balance]{(0 ou 1) Spécifie si le noyau va équilibrer les charges sur les CPU dans ce cpuset}
\item[\hspace{1mm} cpuset.sched\_relax\_domain\_level]{entier entre -1 et une valeur positive, représente la largeur de l'étendue des cpu sur laquelle le noyau va essayer d'équilibrer les charges. les valeurs sont:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} -1]{Utilise la valeur par défaut du système pour l'équilibrage de charges}
\item[\hspace{6mm} 0]{Pas d'équilibrage de charge}
\item[\hspace{6mm} 1]{Équilibre immédiatement les charges sur les threads du même coeur}
\item[\hspace{6mm} 2]{Équilibre immédiatement les charges sur les coeurs du même chip}
\item[\hspace{6mm} 3]{Équilibre immédiatement les charges sur les CPU du même nœud ou la même lame}
\item[\hspace{6mm} 4]{Équilibre immédiatement les charges sur les CPU de même architecture NUMA}
\item[\hspace{6mm} 5]{Équilibre immédiatement les charges sur tous les CPU sur architecture NUMA}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} cpuacct]{Rapports automatiques sur les cpu utilisés}
\item[\hspace{1mm} cpuacct.stat]{Rapporte le nombre de cycles CPU en unité USER\_HZ pris par les tâches de ce cgroup et ses enfants dans le mode système}
\item[\hspace{1mm} cpuacct.usage]{Rapporte le nombre de cycles CPU total en nanosecondes pris par les tâches de ce cgroup et enfants}
\item[\hspace{1mm} cpuacct.usage\_percpu]{Rapporte le nombre de cycles CPU total en nanosecondes sur chaque CPU pris par toutes les taches de ce cgroup et ses enfants}
\item[\hspace{1mm} blkio]{Surveille et contrôle l'accès des tâches aux entrées/sorites sur des périphériques block}
\item[\hspace{1mm} blkio.io\_merged]{Rapporte le nombre de requêtes BIOS fusionnées en requêtes pour des opérations I/O}
\item[\hspace{1mm} blkio.io\_queued]{Rapporte le nombre de requêtes en file d'attente pour des opérations I/O}
\item[\hspace{1mm} blkio.io\_service\_bytes]{Rapporte le nombre d'octets transférés depuis et vers des périphériques spécifiques}
\item[\hspace{1mm} blkio.io\_serviced]{Rapporte le nombre d'opérations I/O effectuées sur des périphériques spécifiques}
\item[\hspace{1mm} blkio.io\_service\_time]{Rapporte le temps total pris par l'envoie de la demande et son achèvement pour les opérations I/O sur des périphériques spécifiques}
\item[\hspace{1mm} blkio.io\_wait\_time]{Rapporte le temps total pour un service dans les files d'attentes des opération I/O sur des périphériques spécifiques}
\item[\hspace{1mm} blkio.reset\_stats]{Réinitialise les statistiques enregistrées}
\item[\hspace{1mm} blkio.sectors]{Rapporte le nombre de secteurs transférés depuis/vers des périphériques spécifiques}
\item[\hspace{1mm} blkio.time]{Rapporte le moment auquel un cgroup avait un accès I/O à des périphériques spécifiques, en ms}
\item[\hspace{1mm} blkio.weight]{Poids relatif d'accès au block I/O (de 100 à 1000)}
\item[\hspace{1mm} blkio.weight\_device]{Poids relatif d'accès à des périphériques spécifiques au format majeur:minuer poid}
\item[\hspace{1mm} blkio.avg\_queue\_size]{Rapporte la taille moyenne des files d'attente pour les opérations I/O}
\item[\hspace{1mm} blkio.group\_wait\_time]{Rapporte la durée totale (en ns) q'un cgroup attendu une tranche de temps pour l'une de ses files d'attente}
\item[\hspace{1mm} blkio.empty\_time]{Rapporte la durée totale (en ns) qu'un cgroup a attendu sans requêtes en attente}
\item[\hspace{1mm} blkio.idle\_time]{Rapporte le temps totale (en ns) que le planification a passé à attendre un cgroup dans l'attente d'une meilleur requête que celles déjà dns les files d'attentes ou provenant d'autres cgroups (si CONFIG\_DEBUG\_BLK\_CGROUP=y)}
\item[\hspace{1mm} blkio.dequeue]{Rapporte le nombre de fois que des requêtes d'opérations I/O ont été retirés des files d'attentes par des périphériques spécifiques}
\item[\hspace{1mm} net\_cls]{repère les paquets réseau avec un ClassId}
\item[\hspace{1mm} net\_cls.classid]{valeur hexa indiquant un descripteur de contrôle du traffic}
\item[\hspace{1mm} devices]{Autorise ou refuse l'accès aux périphériques dans un cgroup}
\item[\hspace{1mm} devices.allow]{Spécifie à quels périphériques les tâches du cgroup peuvent accéder. Chaque entrée possède 4 champs : type (a, b ou c), majeur, mineur et accès (r, w, m : autorise à créer des fichiers de périphériques qui n'existent pas encore)}
\item[\hspace{1mm} devices.deny]{Spécifie les périphériques que le cgroup n'a pas accès}
\item[\hspace{1mm} devices.list]{Rapporte les périphériques pour lesquels les contrôles d'accès ont été définis pour ce cgroup}
\item[\hspace{1mm} freezer]{suspend ou réactive les tâches dans un cgroup}
\item[\hspace{1mm} freezer.state]{FROZEN (les tâches dans le cgroup sont suspendues), FREEZING ( le système est en train de suspendre les tâches dans le cgroup), THAWED (les tâches dans le cgroup sont réactivées)}
\item[\hspace{1mm} perf\_event]{Monitoring par cpu. (voir perf)}
\item[\hspace{1mm} ns]{permet de grouper les processus dans des espaces de nom séparés}
\item[\hspace{1mm} memory]{}
\item[\hspace{1mm} memory.stat]{reporte des statistiques de mémoire:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} cache]{Cache de la page, inclut tmpfs (shmem), en octets}
\item[\hspace{6mm} rss]{caches swap et anonyme, n'inclut pas tmpfs (shmem), en octets}
\item[\hspace{6mm} mapped\_file]{taille des fichiers mappés en mémoire, inclut tmpfs (shmem), en octets}
\item[\hspace{6mm} pgpgin]{nombre de pages chargées en mémoire}
\item[\hspace{6mm} pgpgout]{nombre de pages renvoyées de la mémoire}
\item[\hspace{6mm} swap]{usage swap, en octets}
\item[\hspace{6mm} active\_anon]{caches swap et anonyme de la liste des LRU (dernier récemment utilisé) actifs, inclut tmpfs (shmem), en octets}
\item[\hspace{6mm} inactive\_anon]{caches swap et anonyme de la liste des LRU (dernier récemment utilisé) inactifs, inclut tmpfs (shmem), en octets}
\item[\hspace{6mm} active\_file]{mémoire sauvegardée sur fichier de la liste des LRU actifs, en octets}
\item[\hspace{6mm} inactive\_file]{mémoire sauvegardée sur fichier de la liste des LRU inactifs, en octets}
\item[\hspace{6mm} unevictable]{mémoire ne pouvant pas être récupérée, en octets}
\item[\hspace{6mm} hierarchical\_memory\_limit]{limite de la mémoire pour la hiérarchie contenant le groupe de contrôle memory, en octets}
\item[\hspace{6mm} hierarchical\_memsw\_limit]{limite de la mémoire plus le swap pour la hiérarchie contenant le groupe de contrôle memory, en octets}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} memory.usage\_in\_bytes]{Rapporte l'utilisation mémoire total actuelle en octets}
\item[\hspace{1mm} memory.memsw.usage\_in\_bytes]{Rapporte la somme de l'utilisation de la mémoire et de l'espace swap}
\item[\hspace{1mm} memory.max\_usage\_in\_bytes]{Rapporte le montant max e mémoire utilisée}
\item[\hspace{1mm} memory.memsw.max\_usage\_in\_bytes]{Rapporte la somme totale de mémoire et swap utilisé}
\item[\hspace{1mm} memory.limit\_in\_bytes]{Définis la mémoire max utilisateur incluant le cache (-1 pas de limite)}
\item[\hspace{1mm} memory.memsw.limit\_in\_bytes]{mémoire et swap max (-1 pas de limite)}
\item[\hspace{1mm} memory.failcnt]{Rapporte le nombre de fois que la limite mémoire est atteinte (memory.limit\_in\_bytes)}
\item[\hspace{1mm} memory.memsw.failcnt]{Rapporte le nombre de fois que la limite mémoire est atteinte (memory.memsw.limit\_in\_bytes)}
\item[\hspace{1mm} memory.force\_empty]{Vide la mémoire de toutes les pages utilisée lorsque défini à 0. uniquement quand aucune tâche n'est présente}
\item[\hspace{1mm} memory.swappiness]{Définis la tendance du noyau à déloger la mémoire plutôt que de réclamer des pages depuis le cache de page (idem à /proc/sys/vm/swappiness)}
\item[\hspace{1mm} memory.use\_hierarchie]{(0 ou 1) spécifie si la mémoire utilisée devrait être prise en comptes sur une hiérarchie de cgroup, à 0, le sous-système ne récupère pas la mémoire d'une tâche enfant.}
\end{description}
 
\hspace{1mm}  Les nouveaux cgroups sont créé en utilisant l'appel système mkdir. les propriétés d'un cgroup sont modifiés en écrivant dans le fichier approprié dans ce cgroup.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Utiliser les cgroups }
 
\
 
\hspace{1mm} monter une hiérarchie cgroup: \\
\hspace{1mm} \textbf{mount -t tmpfs cgroup\_root /sys/fs/cgroup} \\
\hspace{1mm} ajouter le sous-système cpuset: \\
\hspace{1mm} \textbf{mount -t cgroup cpuset -ocpuset /sys/fs/cgroup/cpuset} \\
\hspace{1mm} ajouter cpuset et memory: \\
\hspace{1mm} \textbf{mount -t cgroup -o cpuset,memory hier1 /sys/fs/cgroup/rg1} \\
\hspace{1mm} Changer de jeu de sous-systèmes: \\
\hspace{1mm} \textbf{mount -o remount,cpuset,blkio hier1 /sys/fs/cgroup/rg1} \\
\hspace{1mm} Spécifier le release\_agent de la hiérarchie: \\
\hspace{1mm} \textbf{mount -t cgroup -o cpuset,release\_agent="/sbin/cpuset\_release\_agent" xxx /sys/fs/cgroup/rg1} \\
\hspace{1mm} Changer la valeur du release\_agent: \\
\hspace{1mm} \textbf{echo "/sbin/new\_release\_agent" > /sys/fs/cgroup/rg1/release\_agent} \\
\hspace{1mm} Attacher une tâche à un cgroup: \\
\hspace{1mm} \textbf{echo `pidof bash` > tasks} \\
\end{flushleft}
\end{document}
