Website-Suche

LFCS: Überwachung der Ressourcennutzung von Linux-Prozessen und Festlegen von Prozessgrenzen pro Benutzer - Teil 14


Aufgrund der jüngsten Änderungen an den Zielen der LFCS-Zertifizierungsprüfung, die ab dem 2. Februar 2016 in Kraft treten, fügen wir die hier veröffentlichten LFCS-Serien um die erforderlichen Artikel hinzu. Um sich auf diese Prüfung vorzubereiten, wird Ihnen dringend empfohlen, auch die LFCE-Serie zu durchlaufen.

Jeder Linux-Systemadministrator muss wissen, wie er die Integrität und Verfügbarkeit von Hardware, Ressourcen und Schlüsselprozessen überprüfen kann. Darüber hinaus muss das Festlegen von Ressourcenlimits pro Benutzer ebenfalls Teil seiner Fähigkeiten sein.

In diesem Artikel werden wir einige Möglichkeiten untersuchen, um sicherzustellen, dass sich sowohl die Hardware als auch die Software korrekt verhält, um potenzielle Probleme zu vermeiden, die zu unerwarteten Produktionsausfällen und Geldverlusten führen können.

Statistik der Linux-Berichtsprozessoren

Mit mpstat können Sie die Aktivitäten für jeden Prozessor einzeln oder das System als Ganzes anzeigen, sowohl als einmaliger Snapshot als auch dynamisch.

Um dieses Tool verwenden zu können, müssen Sie sysstat installieren:

# yum update && yum install sysstat              [On CentOS based systems]
aptitutde update && aptitude install sysstat   [On Ubuntu based systems]
zypper update && zypper install sysstat        [On openSUSE systems]

Lesen Sie mehr über sysstat und seine Dienstprogramme unter Learn Sysstat und seine Dienstprogramme mpstat, pidstat, iostat und sar unter Linux

Nachdem Sie mpstat installiert haben, verwenden Sie es, um Berichte über Prozessorstatistiken zu erstellen.

Um 3 globale Berichte über die CPU-Auslastung (-u) für alle CPUs (wie durch -P ALL gekennzeichnet) in einem Intervall von 2 Sekunden anzuzeigen, gehen Sie wie folgt vor:

# mpstat -P ALL -u 2 3
Beispiel-Ausgabe
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:41:07  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:09  IST  all    5.85    0.00    1.12    0.12    0.00    0.00    0.00    0.00    0.00   92.91
11:41:09  IST    0    4.48    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   94.53
11:41:09  IST    1    2.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:09  IST    2    6.44    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   92.57
11:41:09  IST    3   10.45    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   87.56

11:41:09  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:11  IST  all   11.60    0.12    1.12    0.50    0.00    0.00    0.00    0.00    0.00   86.66
11:41:11  IST    0   10.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   88.50
11:41:11  IST    1   14.36    0.00    1.49    2.48    0.00    0.00    0.00    0.00    0.00   81.68
11:41:11  IST    2    2.00    0.50    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:41:11  IST    3   19.40    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   79.60

11:41:11  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:13  IST  all    5.69    0.00    1.24    0.00    0.00    0.00    0.00    0.00    0.00   93.07
11:41:13  IST    0    2.97    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   95.54
11:41:13  IST    1   10.78    0.00    1.47    0.00    0.00    0.00    0.00    0.00    0.00   87.75
11:41:13  IST    2    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:13  IST    3    6.93    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   92.57

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    7.71    0.04    1.16    0.21    0.00    0.00    0.00    0.00    0.00   90.89
Average:       0    5.97    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   92.87
Average:       1    9.24    0.00    1.16    0.83    0.00    0.00    0.00    0.00    0.00   88.78
Average:       2    3.49    0.17    1.00    0.00    0.00    0.00    0.00    0.00    0.00   95.35
Average:       3   12.25    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   86.59

Um die gleichen Statistiken für eine bestimmte CPU (CPU 0 im folgenden Beispiel) anzuzeigen, verwenden Sie Folgendes:

# mpstat -P 0 -u 2 3
Beispiel-Ausgabe
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:42:08  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:42:10  IST    0    3.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:42:12  IST    0    4.08    0.00    0.00    2.55    0.00    0.00    0.00    0.00    0.00   93.37
11:42:14  IST    0    9.74    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   89.74
Average:       0    5.58    0.00    0.34    0.85    0.00    0.00    0.00    0.00    0.00   93.23

Die Ausgabe der obigen Befehle zeigt die folgenden Spalten:

  1. CPU: Die Prozessornummer als Ganzzahl oder das Wort all als Durchschnitt für alle Prozessoren.
  2. %usr: Prozentsatz der CPU-Auslastung beim Ausführen von Anwendungen auf Benutzerebene.
  3. %nice: Wie %usr, aber mit netter Priorität.
  4. %sys: Prozentsatz der CPU-Auslastung, die beim Ausführen von Kernel-Anwendungen aufgetreten ist. Dies beinhaltet nicht die Zeit, die für den Umgang mit Interrupts oder den Umgang mit Hardware aufgewendet wird.
  5. %iowait: Prozentsatz der Zeit, in der sich die angegebene CPU (oder die gesamte CPU) im Leerlauf befand und in der ein ressourcenintensiver E/A-Vorgang für diese CPU geplant war. Eine genauere Erklärung (mit Beispielen) finden Sie hier.
  6. %irq: Prozentsatz der Zeit, die für die Wartung von Hardware-Interrupts aufgewendet wurde.
  7. %soft: Wie %irq, aber mit Software-Interrupts.
  8. %steal: Prozentsatz der Zeit, die in unfreiwilliger Wartezeit (Steal oder gestohlene Zeit) verbracht wird, wenn eine virtuelle Maschine als Gast die Aufmerksamkeit des Hypervisors "gewinnt", während sie um die CPU(s) konkurriert. Dieser Wert sollte so klein wie möglich gehalten werden. Ein hoher Wert in diesem Feld bedeutet, dass die virtuelle Maschine ins Stocken gerät – oder es bald sein wird.
  9. %guest: Prozentsatz der Zeit, die für die Ausführung eines virtuellen Prozessors aufgewendet wurde.
  10. %idle: Prozentsatz der Zeit, in der CPU(s) keine Aufgaben ausgeführt haben. Wenn Sie in dieser Spalte einen niedrigen Wert feststellen, ist dies ein Hinweis darauf, dass das System stark belastet wird. In diesem Fall müssen Sie sich die Prozessliste genauer ansehen, wie wir gleich besprechen werden, um festzustellen, was die Ursache ist.

Um den Prozessor etwas zu stark zu belasten, führen Sie die folgenden Befehle aus und führen Sie dann mpstat (wie angegeben) in einem separaten Terminal aus:

# dd if=/dev/zero of=test.iso bs=1G count=1
mpstat -u -P 0 2 3
ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
mpstat -u -P 0 2 3

Vergleichen Sie abschließend mit der Ausgabe von mpstat unter "normalen" Umständen:

Wie Sie in der obigen Abbildung sehen können, war CPU 0 in den ersten beiden Beispielen stark ausgelastet, wie in der Spalte %idle angegeben.

Im nächsten Abschnitt werden wir erörtern, wie man diese ressourcenhungrigen Prozesse erkennt, wie man mehr Informationen über sie erhält und wie man entsprechende Maßnahmen ergreift.

Melden von Linux-Prozessen

Um Prozesse aufzulisten, die nach CPU-Auslastung sortiert sind, verwenden wir den bekannten ps-Befehl mit den Optionen -eo (um alle Prozesse mit benutzerdefiniertem Format auszuwählen) und --sort (um eine benutzerdefinierte Sortierreihenfolge anzugeben), wie folgt:

# ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

Der obige Befehl zeigt nur die PID, die PPID, den mit dem Prozess verknüpften Befehl und den Prozentsatz der CPU- und RAM-Auslastung sortiert nach dem Prozentsatz der CPU-Auslastung in absteigender Reihenfolge an. Bei der Ausführung während der Erstellung der .iso Datei sind hier die ersten Zeilen der Ausgabe:

Sobald wir einen Prozess von Interesse identifiziert haben (wie den mit PID=2822), können wir zu /proc/PID (in diesem Fall /proc/2822) navigieren und eine Verzeichnisauflistung vornehmen.

In diesem Verzeichnis werden mehrere Dateien und Unterverzeichnisse mit detaillierten Informationen über diesen bestimmten Prozess aufbewahrt, während er ausgeführt wird.

Zum Beispiel:
  1. /proc/2822/io enthält E/A-Statistiken für den Prozess (Anzahl der Zeichen und Bytes, die u.a. während E/A-Operationen gelesen und geschrieben werden).
  2. /proc/2822/attr/current zeigt die aktuellen SELinux-Sicherheitsattribute des Prozesses an.
  3. /proc/2822/cgroup beschreibt die Kontrollgruppen (kurz cgroups), zu denen der Prozess gehört, wenn die CONFIG_CGROUPS Kernel-Konfigurationsoption aktiviert ist, was Sie überprüfen können mit:
# cat /boot/config-$(uname -r) | grep -i cgroups

Wenn die Option aktiviert ist, sollte Folgendes angezeigt werden:

CONFIG_CGROUPS=y

Mit cgroups können Sie die Menge der zulässigen Ressourcennutzung pro Prozess verwalten, wie in den Kapiteln 1 bis 4 des Red Hat Enterprise Linux 7 Resource Management Guide, in Kapitel 9 des openSUSE System Analysis and Tuning Guide und im Abschnitt Control Groups der Ubuntu 14.04 Server-Dokumentation erläutert.

/proc/2822/fd ist ein Verzeichnis, das einen symbolischen Link für jeden Dateideskriptor enthält, den der Prozess geöffnet hat. Die folgende Abbildung zeigt diese Informationen für den Prozess, der in tty1 (dem ersten Terminal) gestartet wurde, um das .iso Image zu erstellen:

Die obige Abbildung zeigt, dass stdin (Dateideskriptor 0), stdout (Dateideskriptor 1) und stderr (Dateideskriptor 2) auf /dev/zero, /root/test.iso bzw. /dev/tty1 abgebildet sind.

Weitere Informationen zu /proc finden Sie im Dokument "Das /proc-Dateisystem", das von Kernel.org geführt und gepflegt wird, und im Linux Programmer's Manual.

Festlegen von Ressourcenlimits pro Benutzer in Linux

Wenn Sie nicht vorsichtig sind und jedem Benutzer erlauben, eine unbegrenzte Anzahl von Prozessen auszuführen, kann es schließlich zu einem unerwarteten Herunterfahren des Systems kommen oder Sie werden gesperrt, wenn das System in einen unbrauchbaren Zustand übergeht. Um dies zu verhindern, sollten Sie die Anzahl der Prozesse, die Benutzer starten können, begrenzen.

Bearbeiten Sie dazu die Datei /etc/security/limits.conf und fügen Sie am Ende der Datei die folgende Zeile hinzu, um das Limit festzulegen:

*   	hard	nproc   10

Das erste Feld kann verwendet werden, um entweder einen Benutzer, eine Gruppe oder alle (*) anzugeben, während das zweite Feld einen festen Grenzwert für die Anzahl der Prozesse (nproc) auf 10 erzwingt. Um die Änderungen zu übernehmen, reicht es aus, sich ab- und wieder anzumelden.

Schauen wir uns also an, was passiert, wenn ein bestimmter Benutzer, der nicht root ist (entweder ein legitimer oder nicht), versucht, eine Shell-Fork-Bombe zu starten. Wenn wir keine Grenzwerte implementiert hätten, würde dies zunächst zwei Instanzen einer Funktion starten und dann jede von ihnen in einer endlosen Schleife duplizieren. Daher würde es Ihr System schließlich zum Kriechen bringen.

Wenn jedoch die obige Einschränkung angewendet wird, ist die Fork-Bombe nicht erfolgreich, aber der Benutzer wird trotzdem gesperrt, bis der Systemadministrator den damit verbundenen Prozess beendet:

TIPP: Weitere mögliche Einschränkungen, die durch ulimit ermöglicht werden, sind in der Datei limits.conf dokumentiert.

Linux Andere Prozessmanagement-Tools

Zusätzlich zu den zuvor beschriebenen Tools muss ein Systemadministrator möglicherweise auch Folgendes tun:

a) Ändern Sie die Ausführungspriorität (Verwendung von Systemressourcen) eines Prozesses mit renice. Das bedeutet, dass der Kernel dem Prozess mehr oder weniger Systemressourcen zuweist, basierend auf der zugewiesenen Priorität (eine Zahl, die allgemein als "Nettigkeit" in einem Bereich von -20 bis 19 bekannt ist).

Je niedriger der Wert, desto größer die Ausführungspriorität. Reguläre Benutzer (außer root) können nur die Freundlichkeit von Prozessen, die sie besitzen, auf einen höheren Wert ändern (d. h. eine niedrigere Ausführungspriorität), während root diesen Wert für jeden Prozess ändern und ihn erhöhen oder verringern kann.

Die grundlegende Syntax von renice lautet wie folgt:

# renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

Wenn das Argument nach dem neuen Prioritätswert nicht vorhanden (leer) ist, wird es standardmäßig auf PID gesetzt. In diesem Fall wird die Freundlichkeit des Prozesses mit PID=identifier auf <neue Priorität> gesetzt.

b) Unterbrechen Sie bei Bedarf die normale Ausführung eines Prozesses. Dies wird allgemein als "Töten" des Prozesses bezeichnet. Unter der Haube bedeutet dies, dem Prozess ein Signal zu senden, seine Ausführung ordnungsgemäß abzuschließen und alle verwendeten Ressourcen geordnet freizugeben.

Um einen Prozess zu beenden, verwenden Sie den Befehl kill wie folgt:

# kill PID

Alternativ können Sie pkill verwenden, um alle Prozesse eines bestimmten Eigentümers (-u) oder eines Gruppenbesitzers (-G) zu beenden, oder sogar die Prozesse, die eine gemeinsame PPID (-P) haben. Auf diese Optionen kann die numerische Darstellung oder der tatsächliche Name als Kennung folgen:

# pkill [options] identifier

Zum Beispiel

# pkill -G 1000

beendet alle Prozesse, die einer Gruppe mit GID=1000 gehören.

Und

# pkill -P 4993 

beendet alle Prozesse, deren PPID 4993 ist.

Bevor Sie einen pkill ausführen, ist es eine gute Idee, die Ergebnisse zuerst mit pgrep zu testen, vielleicht auch mit der Option -l, um die Namen der Prozesse aufzulisten. Es nimmt die gleichen Optionen, gibt aber nur die PIDs von Prozessen zurück (ohne weitere Maßnahmen zu ergreifen), die beendet würden, wenn pkill verwendet wird.

# pgrep -l -u gacanepa

Dies wird in der nächsten Abbildung veranschaulicht:

Zusammenfassung

In diesem Artikel haben wir einige Möglichkeiten zur Überwachung der Ressourcennutzung untersucht, um die Integrität und Verfügbarkeit kritischer Hardware- und Softwarekomponenten in einem Linux-System zu überprüfen.

Wir haben auch gelernt, wie man unter ungewöhnlichen Umständen geeignete Maßnahmen ergreift (entweder durch Anpassen der Ausführungspriorität eines bestimmten Prozesses oder durch Beenden des Prozesses).

Wir hoffen, dass die in diesem Tutorial erläuterten Konzepte hilfreich waren. Wenn Sie Fragen oder Anmerkungen haben, können Sie uns gerne über das untenstehende Kontaktformular erreichen.

Verwandte Artikel: