GNU/Linux >> LINUX-Kenntnisse >  >> Linux

3 Tipps zur Verbesserung der Linux-Prozessleistung mit Priorität und Affinität

[ Anmerkung des Herausgebers:Es gibt bekannte Einschränkungen beim CPU-Pinning in einigen Umgebungen, also lesen Sie unbedingt die Details Ihrer Umgebung, bevor Sie diesem Tutorial folgen. ]

CPUs führen alle Anwendungen aus und es ist am besten, wenn Sie verstehen, wie es funktioniert und wie Sie die CPU-Auslastung optimieren können, um die Leistung Ihrer Anwendungen zu steigern.

Moderne Systeme haben in der Regel mehrere CPUs und Kerne, die vom Kernel-Scheduler von der gesamten laufenden Software gemeinsam genutzt werden. Normalerweise kümmert es Sie also nicht, auf welcher CPU/welchem ​​Kern Ihre Anwendung oder Ihr Prozess läuft, solange sie läuft.

Es gibt mehrere Möglichkeiten, mehr CPU zu erhalten und Ihre Anwendung besser funktionieren und effizienter ausführen zu lassen. Eine Möglichkeit besteht darin, die Prioritätsabstimmung mit nice zu verwenden /renice Befehl.

[Das könnte Ihnen auch gefallen: Die Zentraleinheit (CPU):Ihre Komponenten und Funktionen]

Die zweite Möglichkeit besteht darin, die Anwendung an eine oder mehrere CPUs zu binden, was als „CPU-Pinning“ oder „CPU-Affinität“ bezeichnet wird. Durch das Binden der Anwendung an eine oder mehrere bestimmte CPUs werden alle Threads oder untergeordneten Prozesse, die sich auf die Anwendung beziehen, auf definierten CPUs ausgeführt. Auf diese Weise führt die Beschränkung des Prozesses/der Anwendung auf eine oder mehrere CPUs zu mehr „Cache-Wärme“ oder „Cache-Hits“, wodurch die Gesamtleistung gesteigert wird. Der erste Vorteil der CPU-Affinität ist die Optimierung der Cache-Leistung. Der zweite Vorteil der CPU-Affinität besteht darin, dass es sinnvoll ist, sie alle auf demselben Prozessor auszuführen, wenn mehrere Threads auf dieselben Daten zugreifen, wodurch Cache-Fehler minimiert werden.

Methode 1 – Prioritätsabstimmung

Ändern der Priorität des Prozesses mit einem nice Befehl. Dies ist vielleicht die bekannteste Methode, um die CPU-Auslastung von Anwendungen/Prozessen zu verbessern.

Unix hat immer ein nice() bereitgestellt Systemaufruf zum Anpassen der Prozesspriorität, der eine Nettigkeit festlegt Wert. Positiv nice Werte führen zu einer niedrigeren Prozesspriorität (schöner ) und negative Werte – die nur vom Superuser (root) gesetzt werden können – führen zu einer höheren Priorität.

Das nice Der Wert ist auch heute noch nützlich, um die Prozesspriorität anzupassen. Ihre Aufgabe ist es, Arbeiten mit niedriger Priorität zu identifizieren, die die Überwachung von Agents und geplanten Sicherungen umfassen können, die Sie so ändern, dass sie mit einem nice beginnen Wert. Sie können auch eine Analyse durchführen, um zu überprüfen, ob die Optimierung effektiv ist und ob die Planer-Latenz für Arbeiten mit hoher Priorität niedrig bleibt.

Wie funktioniert es?

Jedem Prozess wird eine bestimmte Zeit gegeben, um auf der CPU ausgeführt zu werden. Die tatsächliche Zeit, die der Prozess auf der CPU ausgeführt wird, wird als virtuelle Laufzeit  bezeichnet des Prozesses. Übrigens neigt die CPU dazu, sich wie ein Vater zu verhalten und hat die Angewohnheit, die Zeit gleichmäßig auf alle Kinder (die Prozesse) aufzuteilen.

Die Gesamtzeit, die ein Prozess „auf CPU“ verbringt, ist die virtuelle Laufzeit des Prozesses. Das Betriebssystem (OS) zeichnet diese virtuelle Laufzeit auf und versucht, allen Prozessen in der Ausführungswarteschlange die gleiche Zeit zu geben.

Das nice und renice Dienstprogramme manipulieren diese virtuelle Laufzeitumgebung.

Wenn Sie positive Werte mit renice füttern /nice Befehle, zum Beispiel - renice +10 PID Sie fügen dem Prozess manuell mehr virtuelle Laufzeit hinzu. Das Betriebssystem geht davon aus, dass der Prozess mehr virtuelle Laufzeit in Anspruch genommen hat als andere Prozesse in der Ausführungswarteschlange. Im nächsten Zyklus gibt die CPU dem Prozess also weniger Zeit. Der Prozess endet spät, da er jetzt weniger Zeit „auf der CPU“ hat, nach dem renice Befehl.

Aber wenn Sie negative Werte mit renice füttern /nice Befehle, zum Beispiel - renice -10 PID , reduzieren Sie die virtuelle Laufzeit des Prozesses manuell. Das Betriebssystem denkt, dass der Prozess nicht genug „auf CPU“-Zeit hat als andere Prozesse in der Ausführungswarteschlange. Im nächsten Zyklus gibt die CPU diesem Prozess also im Vergleich zu anderen Prozessen in der Ausführungswarteschlange mehr „auf der CPU“-Zeit. Der Vorgang wird schnell abgeschlossen.

Methode 2 – Prozessbindung

Ein Prozess kann an eine oder mehrere CPUs gebunden sein, was seine Leistung durch Verbesserung der Cache-Wärme steigern kann oder Treffer zwischenspeichern und Speicherort . Unter Linux wird dies mit dem taskset durchgeführt Befehl, der eine CPU-Maske verwenden kann oder Bereiche um die CPU-Affinität einzustellen.

Verwenden des taskset , Sie hatten den Prozess 6197 so gebunden, dass er nur auf CPU 1 ausgeführt wird. Dies führt zu mehr Cache-Wärme/Cache-Treffern. Andere Prozesse können auch auf CPU 1 ausgeführt werden, aber der Prozess wird nur auf CPU 1 und CPU 2 ausgeführt. Diese Konfiguration ist nicht dauerhaft. Wenn der Server neu gestartet wird oder der Prozess neu gestartet wird, ändert sich die PID. Diese Konfiguration geht also verloren.

Ein besserer Weg ist die Verwendung einer „Drop-in“-Datei.

Methode 3 – CPU-Affinität über Drop-in-Datei

Laut Wikipedia Prozessoraffinität , oder CPU-Pinning oder "Cache-Affinität", ermöglicht das Binden und Lösen eines Prozesses oder eines Threads an eine Central Processing Unit (CPU) oder eine Reihe von CPUs, sodass der Prozess oder Thread nur auf der oder den angegebenen CPUs und nicht auf irgendeiner CPU ausgeführt wird .

Normalerweise bestimmt der Kernel die CPUs, die ein Prozess ausführt. Jedes Mal, wenn der Scheduler einen Prozess neu plant, kann er an jede der verfügbaren CPUs gehen. Während dies für die meisten Workloads in Ordnung ist, ist es manchmal wünschenswert, die CPU(s) zu begrenzen, die ein Prozess ausführen darf. Wenn Sie beispielsweise einen speicherintensiven Prozess auf nur eine oder zwei CPUs beschränken, erhöht sich die Wahrscheinlichkeit eines Cache-Treffers und damit die Gesamtleistung.

Wie funktioniert es?

Wie hier abgebildet, haben Sie drei Anwendungen:X, Y und Z. Das Standardverhalten des Planers besteht darin, alle verfügbaren CPUs zu verwenden, um die Threads der Anwendungen X, Y und Z auszuführen. Anhand der Standardeinstellungen können Sie sehen, dass Sie Da die Anwendung über alle CPUs verteilt ist, wird es eine beträchtliche Anzahl von Cache-Fehlern geben. Dies führt zu weniger Cache-Treffern und mehr Cache-Fehlschlägen.

Wenn die Anwendungen an bestimmte CPUs gebunden sind, müssen sie auf bestimmten CPUs ausgeführt werden, wodurch der CPU-Cache effektiver genutzt wird – mehr Code auf derselben CPU. Dies führt zu mehr Cache-Wärme/Cache-Treffern und somit zu einer leistungsfähigeren Anwendung.

Um herauszufinden, wie Sie CPU-Pinning/CPU-Affinität verwenden können, um einen Prozess an bestimmte Prozessoren zu binden, pinnen Sie sshd an Prozess auf CPU 0.

Überprüfen Sie den aktuellen Status von sshd Service. Sie überprüfen, an welche CPU es gebunden ist.

Gemäß taskset Befehlsmanpages, Wert f bedeutet "jede CPU". Es ist also kein CPU-Pinning oder -Binding für sshd konfiguriert Dienst.

Binden Sie die sshd Dienst an CPU 0 – wodurch ein Drop-In erstellt wird Datei, mit der Sie das Verhalten von sshd steuern Service. Die Drop-in-Datei steuert viele Dinge im Zusammenhang mit einem Prozess, aber derzeit beschränken Sie sich auf CPU-Pinning/Affinität.

Sie können sehen, wie das taskset Der Befehl zeigt die CPU als "1" an, was dem taskset entspricht Manpage ist die erste verfügbare CPU.

Sie können die Drop-In-Datei weiter bestätigen, indem Sie den Status von sshd überprüfen Dienst.

Abschluss

Sie können entweder nice  verwenden oder renice um die Priorität eines Prozesses zu ändern. Beides nice und renice Befehle können die „virtuelle Laufzeit“ des Prozesses manipulieren. Basierend auf den Werten verbringt der Prozess also entweder mehr oder weniger Zeit auf der CPU.

Sie können einen Prozess an eine oder mehrere CPUs binden/anheften. Dies erhöht die Chancen auf mehr Cache-Wärme/Cache-Treffer, was zu einer viel besseren Leistung führt. Sie können das taskset verwenden Befehlszeilentool für diesen Zweck. Aber die Wirkung ist nur vorübergehend. Wenn Sie möchten, dass die Konfiguration dauerhaft ist, müssen Sie eine "Drop-in"-Datei verwenden.

[ Kostenloser Online-Kurs:Technischer Überblick über Red Hat Enterprise Linux. ]


Linux
  1. 3 Tipps zum Drucken mit Linux

  2. Top 5 Podcasts für Neuigkeiten und Tipps zu Linux

  3. CPU-Auslastung und Speicherauslastung eines einzelnen Prozesses unter Linux abrufen?

  4. Live-Linux-CD zum Einbrennen mit Bonnie++?

  5. Linux-CPU-Auslastung und Verlauf der Prozessausführung

Überwachung von Linux- und Windows-Hosts mit Glances

Tipps zum Auflisten von Dateien mit ls in der Linux-Befehlszeile

Tipps für oben:Überwachung der CPU-Last unter Linux

Linux-Taskset-Befehls-Tutorial für Anfänger (mit Beispielen)

Beheben und überwachen Sie die Linux-Systemleistung mit nmon

Einführung in die Linux-Leistungsüberwachung und -optimierung