Website-Suche

LFCS: Überwachen Sie die Ressourcennutzung von Linux-Prozessen und legen Sie Prozessgrenzen pro Benutzer fest – Teil 14


Aufgrund der jüngsten Änderungen an den Zielen der LFCS-Zertifizierungsprüfung, die am 2. Februar 2016 in Kraft treten, fügen wir der hier veröffentlichten LFCS-Reihe die benötigten Artikel hinzu. Um sich auf diese Prüfung vorzubereiten, wird Ihnen dringend empfohlen, auch die LFCE-Reihe zu absolvieren.

Jeder Linux-Systemadministrator muss wissen, wie er die Integrität und Verfügbarkeit von Hardware, Ressourcen und Schlüsselprozessen überprüft. Darüber hinaus muss es auch zu seinen Fähigkeiten gehören, Ressourcenlimits pro Benutzer festzulegen.

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

Statistiken zu Linux-Reporting-Prozessoren

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

Um dieses Tool nutzen 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]

Weitere Informationen zu sysstat und seinen Dienstprogrammen finden Sie unter „Lernen Sie Sysstat und seine Dienstprogramme mpstat, pidstat, iostat und sar unter Linux“.

Sobald Sie mpstat installiert haben, können Sie damit Berichte über Prozessorstatistiken erstellen.

Zur Anzeige von 3 globalen Berichten der CPU-Auslastung (-u) für alle CPUs (wie durch -P ALL angezeigt) in einem 2-Sekunden-Intervall , Tun:

mpstat -P ALL -u 2 3
Beispielausgabe
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:

mpstat -P 0 -u 2 3
Beispielausgabe
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 diese Spalten:

  1. CPU: Prozessornummer als Ganzzahl oder das Wort „all“ als Durchschnitt aller Prozessoren.
  2. %usr: Prozentsatz der CPU-Auslastung beim Ausführen von Anwendungen auf Benutzerebene.
  3. %nice: Gleich 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 die Bearbeitung von Interrupts oder die Handhabung von Hardware aufgewendet wird.
  5. %iowait: Prozentsatz der Zeit, in der die angegebene CPU (oder alle) im Leerlauf war und für die auf dieser CPU ein ressourcenintensiver E/A-Vorgang geplant war. Eine ausführlichere Erklärung (mit Beispielen) finden Sie hier.
  6. %irq: Prozentsatz der Zeit, die für die Bearbeitung von Hardware-Interrupts aufgewendet wurde.
  7. %soft: Wie %irq, jedoch mit Software-Interrupts.
  8. %steal: Prozentsatz der Zeit, die in unfreiwilligem Warten verbracht wird (Zeit stehlen oder gestohlen), wenn eine virtuelle Maschine als Gast die Aufmerksamkeit des Hypervisors „gewinnt“, während sie um die CPU(s) konkurriert. Dieser Wert sollte möglichst klein gehalten werden. Ein hoher Wert in diesem Feld bedeutet, dass die virtuelle Maschine ins Stocken gerät – oder bald ins Stocken geraten wird.
  9. %guest: Prozentsatz der Zeit, die für die Ausführung eines virtuellen Prozessors aufgewendet wurde.
  10. %idle: Prozentsatz der Zeit, in der die CPU(s) keine Aufgaben ausgeführt haben. Wenn Sie in dieser Spalte einen niedrigen Wert beobachten, ist das ein Hinweis darauf, dass das System einer starken Belastung ausgesetzt ist. In diesem Fall müssen Sie sich die Prozessliste genauer ansehen, wie wir gleich besprechen werden, um die Ursache zu ermitteln.

Um den Prozessor etwas stärker 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 die Ausgabe von mpstat unter „normalen“ Umständen:

Wie Sie im Bild oben sehen können, war CPU 0 in den ersten beiden Beispielen stark ausgelastet, was durch die Spalte %idle angezeigt wird.

Im nächsten Abschnitt besprechen wir, wie man diese ressourcenintensiven Prozesse erkennt, wie man mehr Informationen über sie erhält und wie man entsprechende Maßnahmen ergreift.

Linux-Prozesse melden

Um Prozesse nach CPU-Auslastung zu sortieren, verwenden wir den bekannten Befehl ps mit -eo (um alle Prozesse mit benutzerdefiniertem Format auszuwählen) und --sort (um eine benutzerdefinierte Sortierreihenfolge anzugeben) Optionen, etwa so:

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

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

Sobald wir einen Prozess von Interesse identifiziert haben (z. B. den mit PID=2822), können wir zu /proc/PID (/proc/2822 ) navigieren (in diesem Fall ) und erstellen Sie eine Verzeichnisliste.

In diesem Verzeichnis werden während der Ausführung mehrere Dateien und Unterverzeichnisse mit detaillierten Informationen zu diesem bestimmten Prozess gespeichert.

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

Wenn die Option aktiviert ist, sollte Folgendes angezeigt werden:

CONFIG_CGROUPS=y

Mithilfe von 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-Handbuchs und in Kapitel 9 der openSUSE-Systemanalyse erläutert und Tuning-Handbuch sowie im Abschnitt „Kontrollgruppen“ der Ubuntu 14.04 Server-Dokumentation.

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

Das obige Bild zeigt, dass stdin (Dateideskriptor 0), stdout (Dateideskriptor 1) und stderr (Dateideskriptor 2) werden /dev/zero, /root/test.iso und /dev/tty1.

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

Festlegen von Ressourcenlimits auf Benutzerbasis unter Linux

Wenn Sie nicht vorsichtig sind und jedem Benutzer erlauben, eine unbegrenzte Anzahl von Prozessen auszuführen, kann es irgendwann zu einem unerwarteten Systemabsturz oder zu einer Sperrung kommen, da das System in einen unbrauchbaren Zustand übergeht. Um dies zu verhindern, sollten Sie die Anzahl der Prozesse begrenzen, die Benutzer starten können.

Bearbeiten Sie dazu /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 von ihnen (*) anzugeben, während das zweite Feld eine harte Grenze für die Anzahl der Prozesse (nproc) für erzwingt 10. Um Änderungen zu übernehmen, genügt ein Abmelden und erneutes Anmelden.

Sehen wir uns also an, was passiert, wenn ein bestimmter Benutzer außer Root (entweder ein legitimer oder nicht) versucht, eine Shell-Fork-Bombe zu starten. Hätten wir keine Limits implementiert, würde dies zunächst zwei Instanzen einer Funktion starten und diese dann jeweils in einer Endlosschleife duplizieren. Dies würde Ihr System letztendlich zum Durcheinander bringen.

Mit der oben genannten Einschränkung ist die Fork-Bombe jedoch nicht erfolgreich, aber der Benutzer wird trotzdem gesperrt, bis der Systemadministrator den damit verbundenen Prozess abbricht:

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

Linux Andere Prozessmanagement-Tools

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

a) Ändern Sie die Ausführungspriorität (Nutzung von Systemressourcen) eines Prozesses mit renice. Das bedeutet, dass der Kernel dem Prozess basierend auf der zugewiesenen Priorität mehr oder weniger Systemressourcen zuweist (eine Zahl, die allgemein als „niceness“ bekannt ist und im Bereich von -20 liegt 19).

Je niedriger der Wert, desto höher ist die Ausführungspriorität. Normale Benutzer (außer Root) können die Nettigkeit der Prozesse, die sie besitzen, nur auf einen höheren Wert ändern (was eine niedrigere Ausführungspriorität bedeutet), 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 Nettigkeit des Prozesses mit PID=identifier auf gesetzt.

b) Unterbrechen Sie bei Bedarf die normale Ausführung eines Prozesses. Dies wird allgemein als „Abbruch“ des Prozesses bezeichnet. Unter der Haube bedeutet dies, dass dem Prozess ein Signal gesendet wird, seine Ausführung ordnungsgemäß abzuschließen und alle verwendeten Ressourcen ordnungsgemäß 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 Besitzers (-u) oder eines Gruppenbesitzers (-G) oder sogar der Prozesse zu beenden, die eine PPID haben gemeinsam (-P). Diesen Optionen kann die numerische Darstellung oder der tatsächliche Name als Bezeichner folgen:

pkill [options] identifier

Zum Beispiel,

pkill -G 1000

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

Und,

pkill -P 4993 

beendet alle Prozesse, deren PPID 4993 ist.

Bevor ein pkill ausgeführt wird, ist es eine gute Idee, die Ergebnisse zunächst mit pgrep zu testen, möglicherweise auch mit der Option -l, um die Ergebnisse aufzulisten Prozessnamen. Es verwendet dieselben Optionen, gibt aber nur die PIDs von Prozessen zurück (ohne weitere Maßnahmen zu ergreifen), die bei Verwendung von pkill abgebrochen würden.

pgrep -l -u gacanepa

Dies wird im nächsten Bild 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 ergreifen kann (entweder indem man die Ausführungspriorität eines bestimmten Prozesses anpasst oder ihn beendet).

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.