Als Linux-Systemadministrator ist es sehr wichtig, die Konzepte von Prozessen und Threads sowie die entsprechenden praktischen Fähigkeiten zu verstehen und zu beherrschen. Dies hilft uns nicht nur, die Systemressourcen besser zu verwalten, sondern verbessert auch die Betriebseffizienz und Stabilität des Systems. Dieser Artikel vermittelt Ihnen ein tiefgreifendes Verständnis der Linux-Prozesse und -Threads und gibt Ihnen einige praktische Tipps und Tools.
Ein Prozess ist eine laufende Aktivität eines Programms mit bestimmten unabhängigen Funktionen für eine bestimmte Datensammlung. Es ist die Grundeinheit der dynamischen Ausführung des Betriebssystems. In herkömmlichen Betriebssystemen ist der Prozess sowohl die Grundzuordnungseinheit als auch die Grundausführungseinheit.
Prozess
Ein Prozess ist eine laufende Aktivität eines Programms mit bestimmten unabhängigen Funktionen für eine bestimmte Datensammlung. Es ist die Grundeinheit der dynamischen Ausführung des Betriebssystems. In herkömmlichen Betriebssystemen ist der Prozess sowohl die Grundzuordnungseinheit als auch die Grundausführungseinheit. Das Konzept des Prozesses besteht aus zwei Hauptpunkten: Erstens ist ein Prozess eine Entität. Jeder Prozess verfügt über einen eigenen Adressraum, der im Allgemeinen Textbereiche, Datenbereiche und Stapelbereiche umfasst. Der Textbereich speichert vom Prozessor ausgeführten Code; der Datenbereich speichert Variablen und dynamisch zugewiesenen Speicher, der während der Prozessausführung verwendet wird, und der Stapelbereich speichert Anweisungen und lokale Variablen für aktive Prozeduraufrufe. Zweitens ist ein Prozess ein „ausführendes Programm“. Ein Programm ist eine unbelebte Einheit. Erst wenn der Prozessor dem Programm Leben einhaucht (das vom Betriebssystem ausgeführt wird), kann es zu einer aktiven Einheit werden.
Thread
Thread ist die kleinste Einheit, mit der das Betriebssystem die Betriebsplanung durchführen kann. Es wird in den Prozess eingebunden und ist die eigentliche Bedieneinheit im Prozess. Ein Thread bezieht sich auf einen einzelnen sequenziellen Kontrollfluss in einem Prozess. In einem Prozess können mehrere Threads gleichzeitig ausgeführt werden, und jeder Thread führt parallel unterschiedliche Aufgaben aus. In Unix System V und SunOS werden sie auch als Lightweight-Prozesse bezeichnet. Lightweight-Prozesse beziehen sich jedoch eher auf Kernel-Threads, während Benutzer-Threads als Threads bezeichnet werden. Die Beziehung zwischen Prozessen und Threads. Mehrere Threads im selben Prozess teilen sich alle Systemressourcen im Prozess, z. B. virtuellen Adressraum, Dateideskriptoren, Signalverarbeitung usw. Aber mehrere Threads im selben Prozess haben ihre eigenen Aufrufstapel, ihren eigenen Registerkontext und ihren eigenen Thread-lokalen Speicher.
Threads und Prozesse unter Linux
Obwohl Prozesse und Threads im Linux-Kernel Aufgaben sind, sollten sie unterschieden werden. Dabei ist pid die Prozess-ID und tgid die Thread-Gruppen-ID. Wenn es für jeden Prozess nur den Hauptthread gibt, dann ist die PID er selbst, die TGID ist er selbst und der Gruppenleiter zeigt immer noch auf sich selbst. Wenn ein Prozess jedoch andere Threads erstellt, ändert sich dies. Der Thread hat seine eigene PID, tgid ist die PID des Hauptthreads des Prozesses und group_leader zeigt auf den Hauptthread des Prozesses. Mit tgid wissen wir also, ob taste_struct einen Prozess oder einen Thread darstellt. Die Beziehung ist wie folgt:
Über Kernel-Parameter von Threads und Prozessen
ulimit limit, führen Sie ulimit -a unter Linux aus, Sie werden ulimit-Limits für verschiedene Ressourcen sehen.
Die „max. Benutzerprozesse“ ist die maximale Anzahl von Threads, die ein Prozess erstellen kann. Wir können diesen Parameter ändern:
ulimit -u 66535
2. Parameter sys.kernel.threads-max limit. Dieser Parameter begrenzt die Anzahl der Threads global im Betriebssystem. Sie können seinen Wert mit dem folgenden Befehl anzeigen. Threads-Max-Methode anzeigen:
cat /proc/sys/kernel/threads-max 32768
Methode zum Ändern dieses Werts:
#方法一,重启后会失效 echo 65535 > /proc/sys/kernel/threads-max #方法二,永久修改 echo "kernel.threads-max = 65535" >> /etc/sysctl.conf
3. Parameter sys.kernel.pid_max limit. Dieser Parameter begrenzt die Anzahl der Threads global im Betriebssystem. Sie können seinen Wert mit dem folgenden Befehl anzeigen. Lassen Sie mich über das 32-Bit-Betriebssystem sprechen. Der Maximalwert von pid_max beträgt 2 ^ 22. Wenn der Linux-Kernel das System initialisiert, legt er den pid_max-Wert entsprechend der Anzahl der CPUs in der Maschine fest. Wenn beispielsweise die Anzahl der CPUs in der Maschine kleiner oder gleich 32 ist, wird pid_max auf 32768 (32 KB) gesetzt. Wenn die Anzahl der CPUs in der Maschine größer als 32 ist, wird pid_max auf N gesetzt *1024 (N ist die Anzahl der CPUs). So überprüfen Sie pid_max:
cat /proc/sys/kernel/pid_max 32768
Methode zum Ändern dieses Werts:
#方法一,重启后会失效 echo 65535 > /proc/sys/kernel/pid_max #方法二,永久修改 echo "kernel.pid_max = 65535" >> /etc/sysctl.conf
Hinweis: Eine Reihe von Threads belegen ebenfalls eine PID, daher muss threads-max kleiner oder gleich pid_max sein.
Beschränkung der Anzahl der Container-Threads
Bei Linux-Systemen ist ein Container eine Sammlung von Prozessen. Wenn die Anwendung im Container zu viele Prozesse erstellt oder Fehler aufweist, führt sie zu einem Verhalten, das Fork-Bomben ähnelt. Auf diese Weise können nicht nur andere Container auf demselben Knoten nicht funktionieren, sondern auch der Host selbst. Daher müssen wir für jeden Container die maximale Anzahl von Prozessen begrenzen, und diese Funktion wird vom Cgroup-Subsystem pids ausgeführt. Ich bin schon einmal auf ein solches Problem gestoßen, da Java-Anwendungen viele geplante Aufgaben verarbeiten müssen. Eine geplante Aufgabe ruft einen Thread auf. Aufgrund von Fehlern im Code wurden die Threads jedoch nicht rechtzeitig recycelt, und der Container generierte dann weiterhin Threads, was den Prozesstabellenbereich des Hosts erschöpfte und schließlich dazu führte, dass der gesamte Linux-Dienst den Fehler „java.lang.OutOfMemoryError“ meldete : Native Threads können nicht erstellt werden“, was sich auf andere Dienste auswirkt. Während des Erstellungsvorgangs wird die Fehlermeldung „Ressource vorübergehend nicht verfügbar“ angezeigt. Diese Art von Problem ermöglicht es Entwicklern nicht nur, Fehler zu beheben, sondern erfordert auch eine Begrenzung der Anzahl der Threads auf Systemebene.
cgroup
Pids sind in der cgroup isoliert. Durch Ändern der Docker-/Kubelet-Konfiguration können Sie die Gesamtzahl der Pids begrenzen, um die Gesamtzahl der Threads zu begrenzen.
Docker, legen Sie beim Starten des Containers den Parameter –pids-limit fest, um die Gesamtzahl der PIDs auf Containerebene zu begrenzen
Kubelet, aktivieren Sie die SupportPodPidsLimit-Funktion, legen Sie den Parameter –pod-max-pids fest und begrenzen Sie die Gesamtzahl der PIDs für jeden Pod des Knotens
Das Prinzip ist wie folgt: Nachdem ein Container erstellt wurde, erstellt der Dienst, der den Container erstellt, ein Unterverzeichnis unter /sys/fs/cgroup/pids, einer Kontrollgruppe. Die kritischste Datei in der Kontrollgruppe ist pids. max. Kubelet oder Docker schreiben einen Wert in diese Datei. Dieser Wert ist die maximal zulässige Anzahl von Prozessen in diesem Container. Jeder Knoten in Kubernetes führt einen Dienst namens Kubelet aus, der für den Status und Lebenszyklus der Container auf dem Knoten verantwortlich ist, beispielsweise für das Erstellen und Löschen von Containern. Gemäß dem offiziellen Kubernetes-Dokument Process ID Limits And Reservations können Sie die Konfigurationsoption –pod-max-pids des Kubelet-Dienstes festlegen. Nachfolgende Container, die auf diesem Knoten erstellt werden, verwenden schließlich den Cgroups-PID-Controller, um die Anzahl der Prozesse in zu begrenzen Container.
Zusammenfassung
Durch die Einführung und Analyse dieses Artikels verstehen wir die Konzepte, Unterschiede, Zustandsübergänge und ihre Auswirkungen auf die Systemressourcen von Linux-Prozessen und -Threads. Gleichzeitig haben wir auch einige praktische Tipps und Tools weitergegeben, wie z. B. Prozessoptimierung, Erkennungstools und Verwaltungstools. Diese Tools und Techniken können uns nicht nur dabei helfen, Systemressourcen besser zu verwalten und die Betriebseffizienz und Stabilität des Systems zu verbessern, sondern auch unsere Arbeitseffizienz und Wettbewerbsfähigkeit zu verbessern. Daher ist es für uns sehr wichtig, die Bedeutung und praktischen Fähigkeiten von Linux-Prozessen und -Threads zu beherrschen.
Das obige ist der detaillierte Inhalt vonBeherrschen Sie die Bedeutung und praktischen Fähigkeiten von Linux-Prozessen und -Threads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!