Je cherche la valeur de la tranche de temps (ou quantique) de mon noyau Linux.
Y a t-il /proc
fichier qui expose une telle information?
(Ou) Est-il bien défini dans l'en-tête Linux de mes distributions?
(Ou) Existe-t-il une fonction C de l'API Linux (peut-être sysinfo) qui expose cette valeur?
Merci d'avance.
Le quantum alloué pour un processus particulier peut varier :
Vous pouvez régler "tranche" en ajustant sched_latency_ns et sched_min_granularity_ns , mais notez cette "tranche" n'est pas un quantum fixe. Notez également que les décisions de préemption CFS sont basées sur un état instantané. Une tâche peut avoir reçu une "tranche" complète (variable) de temps CPU, mais la préemption ne sera déclenchée que si une tâche plus méritante est disponible, donc une "tranche" n'est pas le "temps CPU maximum ininterrompu" auquel vous pouvez vous attendre être .. mais c'est un peu similaire.
Pour les processus spéciaux en temps réel qui utilisent SCHED_RR, la tranche de temps par défaut est définie dans le noyau Linux comme RR_TIMESLICE
Dans inclure/linux/sched/rt.h .
/*
* default timeslice is 100 msecs (used only for SCHED_RR tasks).
* Timeslices get refilled after they expire.
*/
#define RR_TIMESLICE (100 * HZ / 1000)
Vous pouvez utiliser sched_rr_get_interval()
pour obtenir l'intervalle SCHED_RR pour un processus SCHED_RR spécifique.
CFS (qui est le planificateur par défaut pour les processus) n'a pas de tranche de temps fixe, il est calculé lors de l'exécution en fonction de la latence ciblée (sysctl_sched_latency
) et nombre de processus en cours d'exécution. La tranche de temps ne peut jamais être inférieure à la granularité minimale (sysctl_sched_min_granularity
).
La tranche horaire sera toujours comprise entre sysctl_sched_min_granularity
et sysctl_sched_latency
, qui sont des valeurs par défaut de 0,75 ms et 6 ms respectivement et définies dans kernel/sched/fair.c .
Mais la tranche de temps réelle n'est pas exportée vers l'espace utilisateur.
Il y a une certaine confusion dans la réponse acceptée entre SCHED_OTHER
processus (c'est-à-dire ceux fonctionnant sous la politique de partage de temps alternatif en temps réel (par défaut)) et SCHED_RR
processus.
Le sched_latency_ns
et sched_min_granularity_ns
fichiers (destinés au débogage et visibles uniquement si le noyau est configuré avec CONFIG_SCHED_DEBUG
) affecte la programmation de SCHED_OTHER
processus. Comme indiqué dans la réponse d'Alexey Shmalko, la tranche de temps sous CFS n'est pas fixe (et n'est pas exportée vers l'espace utilisateur), et dépendra des paramètres du noyau et de facteurs tels que la valeur Nice du processus.
sched_rr_get_interval () renvoie une valeur fixe qui est le quantum qu'un SCHED_RR
le processus est garanti à obtenir, sauf s'il est préempté ou bloqué. Sous Linux traditionnel, le SCHED_RR
le quantum est de 0,1 seconde. Depuis Linux 3.9, la limite est réglable via le /proc/sys/kernel/sched_rr_timeslice_ms
fichier, où le quantum est exprimé en millisecondes dont la valeur par défaut est 100.
J'ai googlé ces tickets sur le même doute de tranche de temps de SCHED_RR sous Linux. Mais je ne peux pas obtenir de réponse claire à partir d'ici et du code source du noyau. Après une vérification plus approfondie, j'ai trouvé le le point clé est "RR_TIMESLICE" est la tranche de temps par défaut en jiffies, pas en millisecondes! Ainsi, la tranche horaire par défaut de SCHED_RR est toujours de 100 ms, quel que soit le HZ que vous avez configuré.
Identique à la valeur de "/ proc/sys/kernel/sched_rr_timeslice_ms", qui saisit la valeur en millisecondes, mais il stocke et affiche en jiffies! Ainsi, lorsque votre CONFIG_HZ = 100, vous constaterez que:
# echo 100 > /proc/sys/kernel/sched_rr_timeslice_ms
# cat /proc/sys/kernel/sched_rr_timeslice_ms
10
C'est un peu confus. J'espère que cela peut vous aider à le comprendre!
sysctl
est utilisé pour lire et écrire les paramètres du noyau lors de l'exécution. Les paramètres disponibles sont ceux répertoriés sous /proc/sys/
. Linux 3.9 a également ajouté un nouveau mécanisme pour ajuster (et afficher) le quantum SCHED_RR : le fichier/proc/sys/kernel/sched_rr_timeslice_ms expose le quantum comme une valeur en millisecondes, dont la valeur par défaut est 100. Écriture de 0 à ce fichier réinitialise le quantum à la valeur par défaut. Vous pouvez donc essayer:
sysctl kernel.sched_rr_timeslice_ms