Was ist das Schönste, was ein Unix-Befehl sein kann?

9

Wie können für einen schnellen Benchmarking-Test Nizza und Ionice maximal kombiniert werden, dh damit ein Befehl so wenig Ressourcen wie möglich verbraucht (ohne insgesamt im Leerlauf zu sein)?

(Ich denke, es ist so etwas wie `nice -n 19 ionice -c 2 [Befehl], aber nicht sicher über ionices" -n "(classdata param), die Manpage ist hinsichtlich ihrer Relevanz kryptisch.)

Mahemoff
quelle
3
plus 1 für den klugen Fragentitel, aber es ist auch eine gute Frage im Allgemeinen.
Lizardx

Antworten:

10

Der vollständige Befehl, den Sie möchten, lautet:

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

Der chrtBefehl am Anfang schaltet die Dinge in die Stapelplanungsklasse um, was dem Hinzufügen von 0,5 zum netten Wert entspricht. Die Option -n für Ionice hat für die Optionen Echtzeit ( -c 1) und Best-Effort ( -c 2) eine einfache Priorität , wobei niedrigere Werte ebenso wie schöne Werte eine höhere Priorität haben (jedoch im Bereich von 0 bis 7). Der Befehl ionice ist jedoch nicht unbedingt erforderlich, da die E / A-Planungsklasse und die Priorität standardmäßig aus den CPU-Planungsparametern abgeleitet werden und dies nice -n 19implizieren ionice -c 2 -n 7.

Sie können jedoch die absolut minimale Ressourcennutzung erzielen, indem Sie sowohl die CPU- als auch die E / A-Planungsklasse auf Leerlauf setzen. In beiden Fällen sind die "inaktiven" Scheduler keine inaktiven Scheduler, und Sie können weiterhin Ressourcen verwenden. Es ist nur so, dass alles eine höhere Priorität hat.

Für die CPU-Planungsklasse wird auch der chrtBefehl verwendet, allerdings ohne Notwendigkeit nice(Priorität muss 0in der Leerlaufplanungsklasse festgelegt werden) und sieht folgendermaßen aus:

chrt -i 0 {command or PID}

Der niceBefehl unter Linux spiegelt die SVR4-Version wider, was bedeutet, dass die Planungsklasse nicht geändert werden kann, sondern nur ein netter Wert (der sich auch unter Linux anders verhält als unter klassischem UNIX, aber das ist ein bisschen OT). Da die ursprünglichen alternativen Planungsklassen POSIX.1E in Echtzeit waren SCHED_RRund SCHED_FIFOder Befehl zum Festlegen von Planungsklassen aufgerufen wurde chrt. Die -iOption gibt an, dass die SCHED_IDLEPlanungsklasse verwendet werden soll

Für die E / A-Planungsklasse verwenden Sie ionice. Der genaue Befehl sieht folgendermaßen aus:

ionice -c 3 {command or PID}

Die -cOption gibt an, welche Planungsklasse verwendet werden soll, und 3 ist die Nummer für die Leerlaufklasse. Beachten Sie, dass dies je nach verwendetem Block-E / A-Scheduler möglicherweise keine Auswirkungen hat. Insbesondere unterstützt der noopE / A-Scheduler überhaupt keine Prioritäten oder Planungsklassen, und ich bin mir ziemlich sicher, dass die deadlineScheduler (sowohl der Legacy- als auch der blk-mq-Scheduler) dies auch nicht tun.

Wenn Sie dies programmgesteuert tun möchten, entweder für Ihr eigenes Programm oder um Dinge für andere Prozesse anzupassen, lesen Sie die Manpages für die sched_setschedulerund ioprio_setSystemaufrufe (obwohl beide lesenswert sind, wenn Sie nur mehr Hintergrund wünschen).

Austin Hemmelgarn
quelle
0

Angenommen, Sie möchten nicht, dass dieser Befehl vollständig auf das Ende anderer wartet, um möglicherweise keinen Ressourcenmangel zu erleiden , lautet die Zeile:

nice -n19 [command]

Da ionice auf modernen Linux-Kerneln proportional eingestellt wird.

Hat übrigens chrt -b0nichts mit Freundlichkeit zu tun, sondern damit, wie oft die CPU von einem Prozess zum anderen springt. Diese Zeile verlängert die Zeit für Batch-Programme, um Caches besser zu nutzen, für andere Befehle ist sie jedoch nutzlos. Wie hier zu sehen .

Alberto Salvia Novella
quelle