IOPRIO_SET
Section : Manuel du programmeur Linux (
2)
Mise à jour de la version anglaise : 1er juin 2007
Index
Menu principal
NOM
ioprio_get, ioprio_set - Obtenir/configurer la classe d'ordonnancement et la priorité des entrées/sorties
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 et la priorité d'ordonnancement des entrées/sorties
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 prend 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
which
vaut
IOPRIO_WHO_PGRP
ou
IOPRIO_WHO_USER
lors de l'appel à
ioprio_get(),
et si 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é supérieure
(IOPRIO_CLASS_RT
est la classe de priorité la plus haute ;
IOPRIO_CLASS_IDLE
est la plus basse)
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ées 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 et
priorités d'ordonnancement.
Les priorités d'entrées/sorties sont géré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
touchant 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 renseigne
errno
en conséquence.
ERREURS
- EINVAL
-
which
ou
ioprio
n'a pas une valeur valide.
Voir la section NOTES pour les classes et priorité d'ordonnancement
disponibles pour
ioprio.
- 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 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 d'enveloppe pour ces appels système ;
utilisez
syscall(2)
pour les appeler.
Ces appels système n'ont d'effet qu'utilisés avec un ordonnanceur
d'entrées-sorties qui gère 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
pour chaque périphérique par le fichier spécial
/sys/block/<device>/queue/scheduler.
On peut voit l'ordonnanceur d'entrées/sorties actuel
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 /sys/block/hda/queue/scheduler
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'entê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 23 juin 2008.
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.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- VERSIONS
-
- CONFORMITÉ
-
- NOTES
-
- Choisir un ordonnanceur d'entrées-sorties
-
- L'ordonnanceur d'entrées-sorties Completely Fair Queuing (CFQ)
-
- Permissions nécessaires pour configurer les priorités d'entrées-sorties
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 23 juin 2008