Das Standardverhalten von 'nice' besteht darin, die 'io'-Priorität der Anwendung auch dann anzupassen, wenn sich die Nizza ändert.
Natürlich hängt alles von Ihrer Arbeitslast ab, aber einer der Schlüsselaspekte eines Betriebssystems ist, wie es seine Ressourcen zuweist und wie es mit Konflikten umgeht .
Es ist eigentlich wichtig zu verstehen, was Freundlichkeit bewirkt, da sich das Verhalten des Betriebssystems unter Last von konkurrierenden Prozessen auf den Rest Ihrer Arbeitslast auswirken kann.
Die Konkurrenz ist das Maß dafür, wie verschiedene Anwendungen um dieselbe Ressource (wie die CPU) konkurrieren.
Umgang mit Last
Seit der Einführung des völlig fairen Schedulers ist nice lediglich ein Frontend für die Gewichtsklausel jedes Prozesses. Welches kann in proc angezeigt werden.
$ cat /proc/self/sched
---------------------------------------------------------
...
se.load.weight : 1024
...
Das Ändern der Schönheit verändert lediglich das Gewicht:
$ nice -n 5 cat /proc/self/sched
---------------------------------------------------------
...
se.load.weight : 335
...
Das Maß für die CPU-Konkurrenz wird durch den vollständig fairen Planungsalgorithmus durchgeführt. Jeder Anwendung wird ein 'Gewichtungs'-Wert zugewiesen. Im Falle einer konkurrierenden CPU-Zeit wird die Zeit zwischen den Prozessen aufgeteilt, indem die gesamte für die CPU-Zeit konkurrierende Verarbeitung summiert und ihnen die CPU-Zeit mit dem niedrigsten gemeinsamen Nennwert basierend auf ihrem Gewichtungswert zugewiesen wird.
Wenn ich 3 Anwendungen habe, die alle die CPU-Zeit nutzen möchten, erhalten sie standardmäßig 1024 als normales Gewicht. Wenn ich einen Prozess mit einer netten +5 wie oben habe, würden alle drei Gewichte bei 2383 summiert. Der gewürfelte Prozess würde somit in einer bestimmten Sekunde ungefähr 15% der CPU-Zeit erhalten, wenn alle 3 Prozesse in dieser Sekunde nach der CPU fragen würden .
Warum müssen unterschiedliche CPU- und E / A-Prioritäten vorhanden sein?
Niceness spielt wirklich nur damit, was zu tun ist, wenn das System unter Last steht, dh wie das Betriebssystem die Zeit zwischen konkurrierenden Prozessen aufteilt, wie durch die erforderlichen Faktoren definiert.
Wie sich dies auf Sie auswirkt oder für Sie relevant ist, hängt davon ab, welche Zustellungsprioritäten verschiedene Anwendungen miteinander haben und welche Zeit für die Zustellung der einzelnen Anwendungen erforderlich ist.
Niceness macht wirklich nur etwas, wenn Ihr System unter Last steht (es gibt mehr Dinge, die Aufmerksamkeit erfordern, als die CPU oder Festplatte verarbeiten kann). Es weist den Kernel lediglich an, wie unter diesen Umständen Ressourcen zugewiesen werden sollen.
Gibt es eine reale Verwendung, um sie anders zu haben?
Wenn Sie zahlreiche konkurrierende Prozesse oder Arbeiten ausführen müssen, die über die CPU hinausgehen, bietet Ihnen die Freundlichkeit einige relativ stabile Garantien dafür, welche Arbeiten zuerst abgeschlossen werden. Dies kann für Sie wichtig sein, wenn Sie einen Bericht erstellen, der vor Abschluss eines anderen Berichts zugestellt werden soll.
Auf einem Desktop-System kann die Freundlichkeit noch wichtiger sein. Bestimmte Anwendungen haben ein Echtzeitverhalten, bei dem sie beim Laden häufiger geweckt werden, um zu verhindern, dass Daten veralten. Pulseaudio fällt beispielsweise in diese Kategorie.
Möglicherweise sind andere Anwendungen erforderlich, um Arbeiten für abhängige Anwendungen zu verteilen. Zum Beispiel können viele Apache-Anfragen, die besagen, dass ein SQL Server wie MySQL für einen langen Zeitraum blockiert wird, weil SQL nicht schnell genug bereitgestellt wird, weil - sagen wir, ein anderer Bericht konkurriert um die CPU-Zeit. So ist nicht nur SQL blockiert, sondern auch Apache. SQL kann hier manchmal schaden, weil es normalerweise weit weniger Worker-Threads als Apache-Threads gibt, die als Gruppe miteinander konkurrieren, um vom Scheduler günstiger gewichtet zu werden, sodass SQL mehr Zeit für die CPU gibt, um die Situation auszugleichen.
UpdateDB (ein Programm, das Dateien indiziert) wird spät in der Nacht ausgeführt und ist sehr festplattenlastig. Es kann nützlich sein, die Priorität der E / A-Planung zu verringern, damit andere Anwendungen zu diesem Zeitpunkt Vorrang vor etwas haben, das in der Reihenfolge der Dinge nicht so wichtig ist.
Welche realen Anwendungsfälle haben Sie gefunden, die unterschiedliche CPU- und E / A-Prioritäten benötigen?
Sehr wenig. Freundlichkeit ist zu sehr ein Best-Effort-Ansatz. Als Faustregel geht es mir weniger darum, wie gut Anwendungen funktionieren, als vielmehr darum, wie schlecht sie funktionieren könnten . Dies mag zunächst rückwärts klingen, aber ich muss Servicebereitstellungsgarantien erfüllen, die für mich wichtiger sind.
Ich möchte, dass das Vertrauen sagt, dass "Ihre Sachen auch an einem schlechten Tag in X Zeit erledigt werden". Wenn es schneller geht, ist es nur ein Bonus.
Ich beginne normalerweise mit der Erstellung vereinbarter Spezifikationen wie:
- Alle Webanwendungen werden garantiert, um Anforderungen in 0,3 Sekunden zu beenden.
- Alle SQL-Anforderungen auf einem System werden garantiert in 0,1 Sekunden abgeschlossen.
- Die Webanwendung sollte nicht mehr als 50 IOPS verarbeiten und liefert 1k-Dateien.
- Der Speicherbedarf der Webanwendungen beträgt insgesamt nicht mehr als 250 MB.
Und ziehen Sie Anforderungen heraus, um Folgendes zu erfüllen:
- Alle Webanfragen sollten in 0,05 Sekunden abgeschlossen sein.
- Alle SQL-Anforderungen sollten in 0,02 Sekunden abgeschlossen sein.
- Es sollte genügend Speicher für alle Anforderungen vorhanden sein.
- IO-Anforderungen sollten erfüllt sein.
Vorausgesetzt, die Spezifikationen sind wahr, erreiche ich diese Ziele ohne Virtualisierung und verwende dabei den weitaus effizienteren Ansatz von Kontrollgruppen.
Mit Kontrollgruppen kann ich ziemlich zuverlässige Service Level-Garantien für die Ressourcenzuweisung geben, sofern sich die Anwendung innerhalb der angegebenen Grenzen verhält. Dies bedeutet, dass ich auch auf einem System unter Last die Ressourcenverfügbarkeit für die betreffende Anwendung und den Platz für andere Anwendungen auf derselben Box garantieren kann!
Wenn wir Ihr Beispiel für CPU und IO nehmen. Ich habe Grenzwerte festgelegt, die diese Anforderungen erfüllen:
# cd /sys/fs/cgroup/blkio/apache
# echo "253:0 100" >blkio.throttle.read_iops_device
# echo "253:0 50" >blkio.throttle.write_iops_device
# echo "253:0 102400" >blkio.throttle.read_bps_device
Also 100.000 Bytes zum Lesen von 100 Iops.
# cd /sys/fs/cgroup/cpu/apache
# echo 1000000 >cpu.cfs_period_us
# echo 60000 >cpu.cfs_quota_us
Geben Sie in einem Zeitraum von 1 Sekunde 0,06 Sekunden CPU an.
# cd /sys/fs/cgroup/cpu/sql
# echo 1000000 >cpu.cfs_period_us
# echo 20000 >cpu.cfs_quota_us
Geben Sie in einem Zeitraum von 1 Sekunde 0,02 Sekunden CPU an.
Wenn andere konkurrierende Gruppen nichts Dummes tun, spielt es bei meiner Servicebereitstellung weniger eine Rolle, unter Last zu stehen, da ich weiß, wie die CPU für jede Anwendung ausgelastet ist.
Kontrollgruppen dieser Art sind immer noch die beste Anstrengung, aber sie bieten weitaus mehr Kontrolle über diese Anstrengung als Freundlichkeit und Ionizität.