web-dev-qa-db-fra.com

Comment augmenter la priorité des threads dans pthreads?

J'utilise pthread sous Linux. Je souhaite augmenter la priorité des threads en définissant les paramètres sched_param.priority. Cependant, je n'ai pas pu trouver beaucoup d'informations sur le net concernant la plage de priorité des threads que je pouvais définir ou la description de la priorité des threads.

En outre, je voudrais connaître la priorité relative des threads car je ne voudrais pas définir une priorité de thread trop élevée et entraîner l'arrêt du système d'exploitation. Quelqu'un pourrait-il m'aider avec ça?

55
Steveng

La politique de planification Linux par défaut est SCHED_OTHER, Qui n'a pas de choix de priorité mais un niveau Nice à Tweak à l'intérieur de la politique.

Vous devrez passer à un autre politique de planification en utilisant la fonction pthread_setschedparam (Voir aussi man sched_setscheduler)

Stratégies de planification "normales": (à partir de sched_setscheduler(2))

   SCHED_OTHER   the standard round-robin time-sharing policy;
   SCHED_BATCH   for "batch" style execution of processes; and
   SCHED_IDLE    for running very low priority background jobs.

Politiques de planification en temps réel:

   SCHED_FIFO    a first-in, first-out policy; and
   SCHED_RR      a round-robin policy.

Dans votre cas, vous pouvez peut-être utiliser SCHED_BATCH Car cela ne nécessite pas de privilèges root.

Avertissement: une mauvaise utilisation des politiques de planification en temps réel peut bloquer votre système. C'est pourquoi vous avez besoin des privilèges root pour effectuer ce type d'opération.

Juste pour être sûr de ce dont votre machine est capable, vous pouvez utiliser l'outil chrt du package util-linux.
Par exemple:

$ chrt -m 
SCHED_OTHER min/max priority    : 0/0
SCHED_FIFO min/max priority     : 1/99
SCHED_RR min/max priority       : 1/99
SCHED_BATCH min/max priority    : 0/0
SCHED_IDLE min/max priority     : 0/0

Un moyen de perdre moins de temps (que j'utilise souvent):

alias batchmake='time chrt --batch 0 make --silent'

Tout en restant avec des privilèges utilisateur, cela propulse le make de 15% (dans mon cas).

Edit: présentant Nice, SCHED_BATCH, SCHED_IDLE Et chrt outil. Pour Precision ! :)

56
levif

La réponse actuelle de levif (recommandant SCHED_BATCH) n'est pas correcte pour l'implémentation de thread NPTL actuelle sur Linux (vous pouvez vérifier quelle implémentation a votre noyau en exécutant 'getconf GNU_LIBPTHREAD_VERSION').

Dans le noyau d'aujourd'hui, seules les politiques de planification en temps réel permettent de définir la fonction sched_priority - elle est toujours 0 pour les politiques non RT (SCHED_OTHER, SCHED_BATCH et SCHED_IDLE). Votre seul choix pour les politiques non RT est de définir des valeurs `` Nice '', par exemple par setpriority (). Cependant, il n'y a pas de bonnes spécifications du comportement exact à attendre en définissant 'Nice', et au moins en théorie, cela pourrait varier d'une version de noyau à une autre. Pour les noyaux Linux actuels, "Nice" a un effet très fort similaire à la priorité, vous pouvez donc l'utiliser de manière pratiquement interchangeable. Afin d'augmenter la fréquence de planification de votre thread, vous souhaitez diminuer votre valeur 'Nice'. Cela nécessite la capacité CAP_SYS_Nice (généralement root, mais pas nécessairement, voir http://man7.org/linux/man-pages/man7/capabilities.7.html et http: // man7.org/linux/man-pages/man3/cap_set_proc.3.html ).

En fait, SCHED_BATCH est conçu pour le cas opposé à ce que l'interrogateur a demandé: il est conçu pour les travaux longs et gourmands en CPU, qui peuvent vivre avec priorité inférieure . Il indique au planificateur de pénaliser légèrement la priorité de réveil pour les threads.

Aussi pour répondre à l'un des commentaires précédents (je n'ai pas encore une réputation suffisante pour commenter en réponse - quelques votes positifs pour cette réponse aideraient :)). Oui, la mauvaise nouvelle est que la spécification POSIX.1 dit que "Nice" affecte les processus, pas les threads individuels. La bonne nouvelle est que les implémentations de threads Linux (NPTL et les threads Linux d'origine) cassent la spécification et lui permettent d'affecter les threads individuels. Je trouve amusant que cela soit souvent mentionné dans la section "BUGS" des pages de manuel. Je dirais que le bogue était dans la spécification POSIX.1, qui aurait dû permettre ce comportement, pas dans les implémentations qui ont été obligées de le fournir malgré la spécification et l'ont fait sciemment et délibérément. En d'autres termes - pas un bug.

La plupart de ces informations sont détaillées sur la page de manuel sched (7) (qui, pour une raison quelconque, n'est pas fournie sur mon système Fedora 20): http://man7.org/linux/man-pages/man7/sched. 7.html

Si vous vouliez vraiment affecter sched_priority, vous pouvez consulter les politiques en temps réel telles que SCHED_RR).

29
BobDoolittle

POSIX définit une requête, vous pouvez donc demander à OS la plage de priorités valide.

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

Ne vous attendez pas à ce que la priorité élevée étouffe la machine. En fait, ne vous attendez pas à ce qu'il fasse quoi que ce soit à moins que vous n'utilisiez déjà 100% des cycles du processeur. Ne soyez pas surpris si la requête vous indique qu'aucune priorité n'est supérieure à la valeur par défaut.

25
Potatoswatter