ioprio_set

Autres langues

Langue: fr

Version: 1er juin 2007 (mandriva - 01/05/08)

Section: 2 (Appels système)

NOM

ioprio_get, ioprio_set - Obtenir/configurer la classe d'ordonnancement d'entrées-sorties et la priorité

SYNOPSIS

 int ioprio_get(int which, int who);
 int ioprio_set(int which, int who, int ioprio);
 

DESCRIPTION

Les appels système ioprio_get() et ioprio_set() permettent d'obtenir et configurer, respectivement, la classe d'ordonnancement d'entrées-sorties et la priorité d'un ou plusieurs processus.

Les arguments which et who identifient le(s) processus sur le(s)quel(s) les appels système opèrent. L'argument which détermine comment who est interprété et a l'une des valeurs suivantes :

IOPRIO_WHO_PROCESS
who est un PID identifiant un processus unique.
IOPRIO_WHO_PGRP
who est un PGID identifiant tous les membres d'un groupe de processus.
IOPRIO_WHO_USER
who est un UID identifiant tous les processus qui correspondent à un UID réel.

Si who vaut IOPRIO_WHO_PGRP ou IOPRIO_WHO_USER lors de l'appel à ioprio_get(), et que plus d'un processus correspond à who, la priorité renvoyée sera la plus grande trouvée parmi tous les processus correspondants. Une priorité est dite plus grande qu'une autre si elle appartient à une classe de priorité plus grande (IOPRIO_CLASS_RT est la classe de priorité la plus grande ; IOPRIO_CLASS_IDLE est la plus petite) ou si elle appartient à la même classe de priorité que les autres processus mais a un niveau de priorité plus grand (une petite valeur de priorité signifie un haut niveau de priorité).

L'argument ioprio fourni à ioprio_set() est un masque de bits qui spécifie à la fois la classe d'ordonnancement et la priorité à affecter au(x) processus cible(s). Les macros suivantes sont utilisées pour asssembler et disséquer les valeurs de ioprio :

IOPRIO_PRIO_VALUE(class, data)
Étant donné une classe d'ordonnancement class et une priorité (data), cette macro combine les deux valeurs pour produire une valeur ioprio, qui est renvoyée comme étant le résultat de la macro.
IOPRIO_PRIO_CLASS(mask)
Étant donné mask (une valeur ioprio), cette macro renvoie le composant classe d'entrées-sorties, c'est-à-dire l'une des valeurs IOPRIO_CLASS_RT, IOPRIO_CLASS_BE ou IOPRIO_CLASS_IDLE.
IOPRIO_PRIO_DATA(mask)
Étant donné mask (une valeur ioprio), cette macro renvoie le composant priorité (data).

Voir la section NOTES pour plus d'informations sur les classes d'ordonnancement et les priorités.

Les priorités d'entrées-sorties sont supportées pour les lectures et pour les écritures synchrones (O_DIRECT, O_SYNC). Les priorités d'entrées-sorties ne sont pas supportées pour les écritures asynchrones car elles sont émises en dehors du contexte du programme salissant la mémoire, et ainsi les priorités spécifiques au programme ne s'appliquent pas.

VALEUR RENVOYÉE

S'il réussit, ioprio_get() renvoie la valeur ioprio du processus ayant la plus haute priorité de tous les processus qui correspondent aux critères spécifiés dans which et who. S'il échoue, il renvoie -1 et écrit errno en conséquence.

S'il réussit, ioprio_set() renvoie 0. S'il échoue, il renvoie -1 et écrit errno en conséquence.

ERREURS

EPERM
Le processus appelant n'a pas les privilèges nécessaires pour affecter cet ioprio au(x) processus spécifié(s). Voir la section NOTES pour plus d'informations sur les privilèges nécessaires à ioprio_set().
ESRCH
Aucun processus n'a été trouvé correspondant aux spécifications de which et who.
EINVAL
which ou ioprio n'a pas une valeur valide. Voir la section NOTES pour les classes d'ordonnancement et les niveaux de priorité disponibles pour ioprio.

VERSIONS

Ces appels système sont disponibles sous Linux depuis le noyau 2.6.13.

CONFORMITÉ

Ces appels sont spécifiques à Linux.

NOTES

La glibc ne fournit pas d'enveloppe pour cet appel système ; appelez-le avec syscall(2). Ces appels système n'ont d'effet qu'utilisés avec un ordonnanceur d'entrées-sorties qui supporte les priorités d'entrées-sorties. Dans le noyau 2.6.17, le seul ordonnanceur adéquat est l'ordonnanceur d'entrées-sorties « Completely Fair Queuing » (CFQ).

Choisir un ordonnanceur d'entrées-sorties

Les ordonnanceurs d'entrées-sorties sont sélectionnés par périphérique de base via le fichier spécial /sys/block/<device>/queue/scheduler.

On peut voit l'ordonnanceur d'entrées-sorties courant via le système de fichiers /sys. Par exemple, la commande suivante affiche une liste de tous les ordonnanceurs actuellement chargés par le noyau :

 $ cat c
 noop anticipatory deadline [cfq]
 

L'ordonnanceur entre crochets est celui en cours d'utilisation pour le périphérique (hda dans l'exemple). Le choix d'un autre ordonnanceur est effectué en écrivant le nom du nouvel ordonnanceur dans ce fichier. Par exemple, la commande suivante définira à cfq l'ordonnanceur pour le périphérique hda :

 $ su
 Password:
 # echo cfq > /sys/block/hda/queue/scheduler
 

L'ordonnanceur d'entrées-sorties Completely Fair Queuing (CFQ)

Depuis la version 3 (aka CFQ Time Sliced), CFQ implémente des niveaux de courtoisie d'entrées-sorties similaires à ceux de l'ordonnancement de la CPU. Ces niveaux de courtoisie sont regroupés en trois classes d'ordonnancement, chacune contenant un ou plusieurs niveaux de priorités :
IOPRIO_CLASS_RT (1)
C'est la classe d'entrées-sorties temps réel. Cette classe d'ordonnancement a la plus grande priorité de toutes les classes : les processus appartenant à cette classe obtiendront toujours les premiers l'accès au disque. Aussi, cette classe d'entrées-sorties doit être utilisée avec précaution : un processus temps réel d'entrées-sorties peut étioler le système entier. À l'intérieur de la classe temps réel, il y a 8 niveaux de données classe (priorité) qui détermine exactement combien de temps le processus a besoin du disque pour chaque service. Le niveau de priorité temps réel le plus haut est 0, le plus bas est 7. Cela pourrait changer dans le futur afin de pouvoir plus directement maîtriser les performances, en passant par exemple le taux de transfert désiré.
IOPRIO_CLASS_BE (2)
C'est la classe d'ordonnancement « au mieux » qui est la valeur par défaut pour tous les processus qui n'ont pas de priorité d'entrées-sorties configurée. La donnée classe (priorité) détermine quelle bande passante d'entrées-sorties le processus obtiendra. Les niveaux de priorité « au mieux » sont analogues aux valeurs de courtoisie de la CPU (voir getpriority(2)). Le niveau de priorité détermine une priorité relative aux autres processus dans la classe d'ordonnancement « au mieux ». Les niveaux de priorité s'échelonnent de 0 (le plus grand) à 7 (le plus petit).
IOPRIO_CLASS_IDLE (3)
C'est la classe d'ordonnancement « idle ». Les processus s'exécutant à ce niveau n'obtiendront du temps d'entrées-sorties que lorsqu'aucun autre n'aura besoin du disque. La classe « idle » n'a pas de donnée de classe. Il faut faire attention lors de l'affectation de cette classe de priorité à un processus car il peut devenir « affamé » 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'entrées-sorties CFQ et pour un exemple de programme.

Permissions nécessaires pour configurer les priorités d'entrées-sorties

La permission pour modifier la priorité d'un processus est accordée ou refusée sur la base de deux assertions :
Appartenance du processus
Un processus non privilégié ne peut configurer la priorité d'entrées-sorties que d'un processus dont l'UID réel correspond à l'UID réel ou effectif du processus appelant. Un processus qui possède la capacité CAP_SYS_NICE peut modifier la priorité de n'importe quel processus.
Quelle est la priorité souhaitée
Les tentatives de configurer de très hautes (IOPRIO_CLASS_RT) ou de très basses (IOPRIO_CLASS_IDLE) priorités nécessitent la capacité CAP_SYS_ADMIN.

Un appel à ioprio_set() doit suivre les deux règles, sinon l'appel échouera avec l'erreur EPERM.

BOGUES

La glibc ne fournit pas encore de fichier d'en-tête convenable définissant les prototypes des fonctions et macros décrites dans cette page. Des définitions convenables peuvent être trouvées dans linux/ioprio.h.

VOIR AUSSI

getpriority(2), open(2), capabilities(7)

Documentation/block/ioprio.txt dans l'arborescence des sources du noyau.

TRADUCTION

Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 10 août 2006 et révisée le 26 novembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 ioprio_set ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.