Quelle est la plus belle des commandes Unix?

9

Pour un test de benchmarking rapide, comment nice et ionice peuvent-ils être combinés pour un effet maximum, c'est-à-dire pour qu'une commande utilise le moins de ressources possible (sans tourner au ralenti)?

(Je pense que c'est quelque chose comme `nice -n 19 ionice -c 2 [commande], mais je ne suis pas sûr du" -n "(param de données de classe) d'ionice, la page de manuel est cryptique quant à sa pertinence.)

mahemoff
la source
3
plus 1 pour le titre de la question intelligente, mais c'est aussi une bonne question en général.
Lizardx

Réponses:

10

La commande complète que vous souhaitez est:

chrt -b 0 nice -n 19 ionice -c 2 -n 7 [command]

La chrtcommande au début fera basculer les choses dans la classe de planification par lots, ce qui équivaut à ajouter 0,5 à la valeur de Nice. L'option -n pour ionice est une priorité simple pour les options en temps réel ( -c 1) et best-effort ( -c 2), avec des valeurs plus faibles étant une priorité plus élevée tout comme les bonnes valeurs (mais dans la plage 0-7). Cependant, la commande ionice n'est pas strictement nécessaire, car la classe et la priorité d'ordonnancement des E / S sont par défaut dérivées des paramètres d'ordonnancement du processeur et nice -n 19impliquent ionice -c 2 -n 7.

Cependant, vous pouvez obtenir l'utilisation minimale absolue des ressources en définissant les classes de planification CPU et E / S sur inactif. Dans les deux cas, les planificateurs «inactifs» ne sont pas réellement des planificateurs inactifs, et vous pourrez toujours utiliser les ressources, c'est juste que tout aura une priorité plus élevée.

Pour la classe de planification CPU, cela utilise également la chrtcommande, bien que sans besoin nice(la priorité doit être définie sur 0dans la classe de planification inactive), et ressemble à ceci:

chrt -i 0 {command or PID}

La nicecommande sur Linux reflète la version SVR4, ce qui signifie qu'elle ne peut pas changer la classe de planification, seulement une belle valeur (qui se comporte également différemment sur Linux que UNIX classique, mais c'est un peu OT). Comme les classes de planification alternatives originales étaient le temps réel POSIX.1E SCHED_RRet SCHED_FIFO, la commande pour définir les classes de planification a finalement été appelée chrt. L' -ioption spécifie d'utiliser la SCHED_IDLEclasse de planification

Pour la classe de planification d'E / S, vous utilisez ionice. La commande exacte ressemble à ceci:

ionice -c 3 {command or PID}

L' -coption spécifie la classe de planification à utiliser et 3 est le numéro de la classe inactive. Notez que selon le planificateur d'E / S de bloc utilisé, cela peut n'avoir aucun impact. En particulier, le noopplanificateur d'E / S ne prend pas du tout en charge les priorités ou les classes de planification, et je suis pratiquement sûr que les deadlineplanificateurs (à la fois hérités et blk-mq) ne le font pas non plus.

Si vous voulez le faire par programme, soit pour votre propre programme, soit pour ajuster les choses pour d'autres processus, consultez les pages de manuel pour les appels système sched_setscheduleret ioprio_set(bien que les deux valent la peine d'être lus si vous voulez juste plus d'informations).

Austin Hemmelgarn
la source
0

En supposant que vous ne voulez pas que cette commande attende complètement la fin des autres, afin de ne pas potentiellement souffrir de la famine des ressources , la ligne serait:

nice -n19 [command]

Comme ionice sera défini proportionnellement sur les noyaux Linux modernes.

Soit dit en passant, cela chrt -b0n'a rien à voir avec la gentillesse, mais avec la fréquence à laquelle le processeur passera d'un processus à l'autre. Cette ligne allonge ce temps pour que les programmes batch utilisent mieux les caches, mais pour d'autres commandes, c'est inutile. Comme on le voit ici .

Alberto Salvia Novella
la source