Je vois des pids supérieurs à 400 000, pourquoi? Cela indique-t-il que quelque chose ne va pas?


14

Aujourd'hui, je viens de remarquer que mes identifiants de processus sont très élevés, dans les 400 000 (soit 449624). Quand je cours ps -ef | more, c'est là que je l'ai remarqué. Est-ce normal ou cela indique-t-il un problème? Sinon, les scripts fonctionnent correctement.

J'utilise le bit Redhat 7.3 x64.

Une autre chose que j'ai remarquée est que nous avons également Redhat 7.2 et les pids ne sont pas si élevés, juste sur les nouveaux OS. Pourquoi serait-ce? Est-ce que cela signifie que c'est lié au système d'exploitation et normal?

Je n'ai pas ça kernel_pid_maxen moi sysctl.conf. J'ai couru chat /proc/sys/kernel/pid_maxet je vois 458752.


Vous n'avez pas kernel_pid_maxdans votre sysctl.confcar cela devrait l'être kernel.pid_max.
JRFerguson

Les ID de processus volumineux signifient simplement que vous avez démarré de nombreux processus depuis le démarrage de la machine. Chaque fois qu'un processus est démarré, le noyau attribue le prochain ID de processus disponible plus grand que le dernier utilisé, en se déplaçant lorsque vous atteignez le maximum.
chepner

Réponses:


19

Au démarrage, le noyau ajuste la valeur par défaut en pid_maxfonction du nombre de CPU disponibles. Lorsque le nombre est faible, le 32768 habituel est sélectionné. Sinon, le calcul se fait comme suit (montrant ici un noyau 3.10 similaire à RHEL mais à côté de certaines variantes, il est le même pour tout noyau Linux récent):

include/linux/threads.h:

/ *
 * Ceci contrôle le pid maximum par défaut alloué à un processus
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 est la valeur habituelle utilisée sur les systèmes avec moins de 32 threads de processeur disponibles.

et ensuite:

#define PIDS_PER_CPU_DEFAULT 1024

Ces valeurs sont ensuite utilisées dans kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

et plus tard :

    / * bump default et minimum pid_max basé sur le nombre de cpus * /
    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: par défaut:% u minimum:% u \ n", pid_max, pid_max_min);

Donc, de l'OP, cela devrait signifier un total de 458752/1024 = 448 threads simultanés disponibles: beaucoup. L'autre système n'a probablement pas autant de processeurs / cœurs / threads, etc., donc a une valeur par défaut inférieure pid_max.


1
exemple: SuperServer 7089P-TR4T a 224 cœurs donc 448 threads.
AB

16

De la procdocumentation :

Sur les plates-formes 32 bits, 32768 est la valeur maximale de pid_max. Sur les systèmes 64 bits, pid_max peut être défini sur n'importe quelle valeur jusqu'à 2 ^ 22 (PID_MAX_LIMIT, environ 4 millions).

Vous pouvez voir le avec cat /proc/sys/kernel/pid_max. Vous pouvez également l'interroger avec sysctl.

sudo sysctl -a | grep kernel.pid_max

Ou:

sysctl -n kernel.pid_max

Modifiez /etc/sysctl.confpour changer la valeur de façon permanente et rechargez avec sysctl -p.


7

Un ID de processus peut être n'importe quelle valeur représentée par le pid_ttype, qui est spécifique à votre système d'exploitation. En pratique, il s'agit généralement d'un entier signé 32 bits, ce qui signifie que l'ID de processus maximal serait 2147483647, soit environ 5000 fois plus grand que les ID de processus que vous observez.

La documentation GNU dit:

Type de données: pid_t

Le pid_ttype de données est un type entier signé qui est capable de représenter un ID de processus. Dans la bibliothèque GNU C, c'est un int.

En pratique, le noyau appliquera généralement une limite supérieure qui est inférieure à cela. Sur un système Linux, cela est contrôlé par /proc/sys/kernel/pid_max, qui est par défaut 32768. Si votre système est Linux, vous pouvez vérifier ce fichier pour voir quelle est la limite actuelle.

La limite peut être différente sur différents systèmes d'exploitation; par exemple, il apparaît que sur macOS, PID_MAXest codé en dur comme 99999 .


3
Linux a des raisons fondamentales pour l'API que les pids ne peuvent pas remplir un espace 31 bits; les 2 bits supérieurs (en plus du bit de signe) sont réservés à des fins spéciales dans les interfaces robustes futex et PI futex. Cela ne laisse que 29 bits, pour un espace pid de 512 Mo.
R .. GitHub STOP HELPING ICE

1
@R .: Bien sûr, c'est vrai pour Linux. Mais quand j'ai écrit cette réponse, la question ne spécifiait pas Linux, et j'ai donc donné une réponse pour tout Unix. Pour autant que je sache, il n'y a rien dans la norme POSIX qui nécessite une taille particulière pour les pids; cela semble inutile maintenant, mais je pourrais imaginer un futur système avec une pid_ttaille de 64 bits.
Daniel Pryden

En effet, tout cela est vrai.
R .. GitHub STOP HELPING ICE
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.