NOM
ioprio_get, ioprio_set - Lire/écrire la classe et la priorité
d’ordonnancement des E/S
SYNOPSIS
int ioprio_get(int which, int who);
int ioprio_set(int which, int who, int ioprio);
Les appels système ioprio_get() et ioprio_set() lisent et écrivent la
classe et la priorité d’ordonnancement des E/S pour un ou plusieurs
processus.
Les arguments which et who identifient le(s) processus auxquels les
appels système s’appliquent. L’argument which détermine comment who est
interprété, et prend l’une des valeurs suivantes :
IOPRIO_WHO_PROCESS
who contient le PID d’un processus.
IOPRIO_WHO_PGRP
who est l’identifiant d’un groupe de processus, et se réfère à
tous les membres de ce groupe.
IOPRIO_WHO_USER
who est un UID identifiant tous les processus dont l’UID réel
correspond.
Si which vaut IOPRIO_WHO_PGRP ou IOPRIO_WHO_USER à l’appel de
ioprio_get(), et si plus d’un processus correspond à who, la priorité
renvoyée sera la plus grande des priorités des processus
correspondants. Une priorité est dite plus grande qu’une autre si elle
appartient à une classe de priorité supérieure (IOPRIO_CLASS_RT est la
classe la plus haute ; IOPRIO_CLASS_IDLE est la plus basse) ou si elle
appartient à la même classe mais a un niveau de priorité plus élevé
(donc un numéro de priorité plus faible).
L’argument ioprio donné à ioprio_set() est un masque de bits indiquant
la classe et la priorité à donner au(x) processus cible(s). Les macros
suivantes servent à créer et à tester les valeurs ioprio :
IOPRIO_PRIO_VALUE(class, data)
Étant données une classe d’ordonnancement (class) et une
priorité (data), cette macro combine les deux valeurs pour créer
une valeur ioprio, qui est renvoyée comme résultat.
IOPRIO_PRIO_CLASS(mask)
À partir de mask (une valeur ioprio) cette macro renvoie sa
classe d’E/S, c’est-à-dire une valeur parmi IOPRIO_CLASS_RT,
IOPRIO_CLASS_BE et IOPRIO_CLASS_IDLE.
IOPRIO_PRIO_DATA(mask)
Étant donné mask (une valeur ioprio), renvoie la priorité (data)
correspondante.
Voir la section NOTES pour plus d’informations sur les classes et
priorités d’ordonnancement.
Les priorités d’E/S sont gérées pour les lectures et pour les écritures
synchrones (O_DIRECT, O_SYNC). Les priorités d’E/S ne sont pas gérées
pour les écritures asynchrones parce qu’elles sont lancées hors du
contexte du programme touchant la mémoire, ce qui fait que les
priorités spécifiques à chaque programme ne s’appliquent pas.
VALEUR RENVOYÉE
Lorsqu’il réussit, ioprio_get() renvoie la valeur ioprio du processus
dont la priorité d’E/S est la plus grande parmi les processus
correspondant aux critères indiqués par which et who. En cas d’erreur,
-1 est renvoyé, et errno contient le code d’erreur.
S’il réussit, ioprio_set() renvoie zéro. En cas d’erreur, il renvoie -1
et remplit errno avec la valeur d’erreur.
ERREURS
EINVAL which ou ioprio est invalide. Voir la section NOTES pour les
classes et priorités d’ordonnancement disponibles pour ioprio.
EPERM Le processus appelant n’a pas les privilèges nécessaires pour
attribuer cette priorité ioprio au(x) processus indiqué(s). Voir
la section NOTES pour plus d’informations sur les privilèges
nécessaires pour ioprio_set().
ESRCH Aucun processus ne correspond aux critères indiqués par which et
who.
VERSIONS
Ces appels système sont disponibles sous Linux depuis le noyau 2.6.13.
CONFORMITÉ
Ces appels système sont spécifiques à Linux.
NOTES
La glibc ne fournit pas de fonction autour de ces appels système ;
appelez‐les avec syscall(2).
Ces appels système n’ont d’effet que lorsqu’ils sont utilisés avec un
ordonnanceur d’E/S qui gère les priorités d’E/S. Sous Linux 2.6.17,
l’ordonnanceur « Completely Fair Queuing » (CFQ) est le seul
ordonnanceur d’E/S de ce type.
Choisir un ordonnanceur d’E/S
Les ordonnanceurs d’E/S sont sélectionnés pour chaque périphérique par
le fichier spécial /sys/block/<device>/queue/scheduler.
On peut voir quel ordonnanceur d’E/S est actuellement sélectionnés via
le système de fichiers /sys. Par exemple, la commande suivante affiche
la liste des ordonnanceurs chargés dans le noyau :
$ cat /sys/block/hda/queue/scheduler
noop anticipatory deadline [cfq]
L’ordonnanceur entre crochets est celui qui est utilisé pour le
périphérique (hda dans l’exemple). Pour choisir un autre ordonnanceur,
on écrit son nom dans ce fichier. Par exemple, la commande suivante
fixe l’ordonnanceur pour le périphérique hda à cfq :
$ su
Password:
# echo cfq > /sys/block/hda/queue/scheduler
L’ordonnanceur d’E/S « Completely Fair Queuing » (CFQ)
Depuis la version 3 (« CFQ Time Sliced »), CFQ implémente des niveaux
de politesse d’E/S similaires à ceux de l’ordonnancement CPU. Ces
niveaux de politesse sont groupés en trois classes d’ordonnancement,
chacune de ces classes contenant un ou plusieurs niveaux de priorité :
IOPRIO_CLASS_RT (1)
Il s’agit de la classe d’E/S temps réel. Cette classe
d’ordonnancement a une priorité plus grande que toutes les
autres classes : les processus de cette classe ont toujours
accès au disque en premier. Cette classe d’E/S doit donc être
utilisée avec parcimonie : un seul processus avec des E/S temps
réel peut bloquer tout le système. Au sein de la classe temps
réel, il y a 8 niveaux de priorité qui déterminent exactement
pendant combien de temps ce processus aura besoin du disque à
chaque service. La plus haute priorité temps réel est 0 ; la
plus basse est 7. Dans le futur, ceci pourra changer afin d’être
plus directement corrélé à la performance, en passant le débit
de données souhaité à la place de la priorité.
IOPRIO_CLASS_BE (2)
Classe d’ordonnancement « best-effort », qui est utilisée par
défaut pour les processus qui n’ont pas indiqué de priorité
d’E/S particulière. La priorité de classe détermine combien de
bande passante d’E/S le processus obtiendra. Les niveaux de
priorité best-effort sont similaires aux valeurs de politesse
CPU (voir getpriority(2)). Le niveau de priorité détermine une
priorité par rapport aux autres processus dans la classe
d’ordonnancement best-effort. Les niveaux de priorité vont de 0
(plus prioritaire) à 7 (moins prioritaire).
IOPRIO_CLASS_IDLE (3)
Classe d’ordonnancement « idle ». Les processus s’exécutant à ce
niveau n’obtiennent du temps d’E/S que lorsque personne d’autre
n’a besoin du disque. La classe idle n’a pas de donnée
(priorité) de classe. Il faut faire attention lorsque l’on met
un processus dans cette classe de priorité, car il peut être
bloqué si des processus de plus haute priorité accèdent
constamment au disque.
Voir Documentation/block/ioprio.txt pour plus d’informations sur
l’ordonnanceur d’E/S CFQ et un exemple de programme.
Permissions nécessaires pour fixer les priorités d’E/S
La permission de modifier la priorité d’un processus est accordée ou
refusée en fonction de deux critères :
Propriétaire du processus
Un processus non privilégié ne peut fixer la priorité d’E/S que
des processus dont l’UID réel est égal à l’UID réel ou effectif
du processus appelant. Un processus ayant la capacité
CAP_SYS_NICE peut modifier la priorité de n’importe quel
processus.
Priorité désirée
Pour pouvoir définir une priorité très haute ((IOPRIO_CLASS_RT),
il faut avoir la capacité CAP_SYS_ADMIN. Les noyaux antérieurs à
2.6.24 (compris) nécessitent également CAP_SYS_ADMIN pour
définir une priorité très faible ((IOPRIO_CLASS_IDLE), mais
depuis 2.6.25, ce n’est plus le cas.
Un appel à ioprio_set() doit suivre ces deux règles, sans quoi il
échoue avec l’erreur EPERM.
BOGUES
Glibc ne fournit pas encore de fichier d’en‐tête définissant les
prototypes de fonctions et les macros décrits dans cette page. Les
définitions se trouvent dans linux/ioprio.h.
VOIR AUSSI
getpriority(2), open(2), capabilities(7)
Documentation/block/ioprio.txt dans les sources du noyau.
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et est maintenue par Julien Cristau
<julien.cristau@ens-lyon.org> et l’équipe francophone de traduction de
Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».