Ich sehe Pids über 400.000, warum ist das so? Zeigt es an, dass etwas nicht stimmt?


13

Heute habe ich gerade festgestellt, dass meine Prozess-IDs bei den 400.000 (dh 449624) sehr hoch sind. Wenn ich renne ps -ef | more, ist mir das aufgefallen. Ist das normal oder deutet das auf ein Problem hin? Ansonsten laufen die Skripte einwandfrei.

Ich benutze Redhat 7.3 x 64 Bit.

Eine andere Sache, die mir aufgefallen ist, ist, dass wir auch Redhat 7.2 haben und die Pids nicht so hoch sind, nur auf neueren Betriebssystemen. Warum sollte das so sein? Bedeutet das, dass es mit dem Betriebssystem zusammenhängt und normal ist?

Das habe ich nicht kernel_pid_maxin meinem sysctl.conf. Ich lief Katze /proc/sys/kernel/pid_maxund ich sehe 458752.


Sie haben nicht kernel_pid_maxin Ihrem, sysctl.confweil es sein sollte kernel.pid_max.
JRFerguson

Große Prozess-IDs bedeuten nur, dass Sie viele Prozesse gestartet haben, seit der Computer gestartet wurde. Bei jedem Start eines Prozesses weist der Kernel die nächste verfügbare Prozess-ID zu, die größer ist als die zuletzt verwendete. Bei Erreichen des Maximums wird ein Rollover ausgeführt.
Chepner

Antworten:


19

Beim Booten passt der Kernel den Standard pid_maxabhängig von der Anzahl der verfügbaren CPUs an. Wenn die Zahl niedrig ist, wird das übliche 32768 ausgewählt. Andernfalls wird die Berechnung wie folgt durchgeführt (hier wird ein 3.10-Kernel gezeigt, der RHEL ähnelt, aber abgesehen von einigen Variationen ist er für jeden neueren Linux-Kernel gleich):

include/linux/threads.h:

/ *
 * Dies steuert die Standard-Maximal-PID, die einem Prozess zugewiesen ist
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 ist der übliche Wert, der auf Systemen mit weniger als 32 verfügbaren CPU-Threads verwendet wird.

und später:

#define PIDS_PER_CPU_DEFAULT 1024

Diese Werte werden dann verwendet in kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

und später :

    / * Bump Default und Minimum pid_max basierend auf der Anzahl der CPU * /
    pid_max = min (pid_max_max, max_t (int, pid_max,
                PIDS_PER_CPU_DEFAULT * num_possible_cpus ()));
    pid_max_min = max_t (int, pid_max_min,
                PIDS_PER_CPU_MIN * num_possible_cpus ());
    pr_info ("pid_max: default:% u minimum:% u \ n", pid_max, pid_max_min);

Ab OP sollten also insgesamt 458752/1024 = 448 gleichzeitige Threads verfügbar sein: ziemlich viel. Das andere System hat wahrscheinlich nicht so viele CPUs / Kerne / Threads usw., hat also einen niedrigeren Standard pid_max.


1
Beispiel: SuperServer 7089P-TR4T hat 224 Kerne, also 448 Threads.
AB

16

Aus der procDokumentation :

Auf 32-Bit-Plattformen ist 32768 der Maximalwert für pid_max. Auf 64-Bit-Systemen kann pid_max auf einen beliebigen Wert von bis zu 2 ^ 22 gesetzt werden (PID_MAX_LIMIT, ungefähr 4 Millionen).

Sie können das mit sehen cat /proc/sys/kernel/pid_max. Sie können dies auch mit abfragen sysctl.

sudo sysctl -a | grep kernel.pid_max

Oder:

sysctl -n kernel.pid_max

Ändern Sie /etc/sysctl.confden Wert fest und reload sich ändern mit sysctl -p.


7

Eine Prozess-ID kann ein beliebiger Wert sein, der durch den pid_tfür Ihr Betriebssystem spezifischen Typ dargestellt wird. In der Praxis handelt es sich normalerweise um eine 32-Bit-Ganzzahl mit Vorzeichen. Dies bedeutet, dass die maximale Prozess-ID 2147483647 oder etwa 5000-mal größer ist als die von Ihnen beobachteten Prozess-IDs.

In der GNU-Dokumentation heißt es:

Datentyp: pid_t

Der pid_tDatentyp ist ein vorzeichenbehafteter Integer-Typ, der eine Prozess-ID darstellen kann. In der GNU C Library ist dies ein int.

In der Praxis erzwingt der Kernel normalerweise eine Obergrenze, die unter dieser Grenze liegt. Auf einem Linux-System wird dies von gesteuert. Der /proc/sys/kernel/pid_maxStandardwert ist 32768. Wenn Sie ein Linux-System haben, können Sie in dieser Datei nachsehen, wie hoch das aktuelle Limit ist.

Das Limit kann auf verschiedenen Betriebssystemen unterschiedlich sein. Beispielsweise scheint es, dass unter macOS der PID_MAXWert 99999 fest codiert ist .


3
Linux hat grundlegende API-Gründe, weshalb PIDs keinen 31-Bit-Raum füllen können. Die oberen 2 Bits (zusätzlich zum Vorzeichenbit) sind für spezielle Zwecke in den robusten Futex- und PI-Futex-Schnittstellen reserviert. Damit bleiben nur 29 Bit für einen PID-Speicherplatz von 512 MB.
R .. GitHub STOP HELPING ICE

1
@R .: Sicher, das stimmt für Linux. Aber als ich diese Antwort schrieb, gab die Frage kein Linux an und so gab ich eine Antwort für jedes Unix. Soweit ich weiß, enthält der POSIX-Standard nichts, was eine bestimmte Größe für Pids erfordert. es scheint jetzt unnötig, aber ich könnte mir ein zukünftiges System pid_tmit 64-Bit-Größe vorstellen .
Daniel Pryden

In der Tat ist das alles wahr.
R .. GitHub STOP HELPING ICE
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.