Veo pids por encima de 400,000 ¿por qué es eso? ¿Indica que algo está mal?


14

Hoy me acabo de dar cuenta de que mis ID de proceso son muy altas, de 400,000 (es decir, 449624). Cuando corro ps -ef | more, es cuando me di cuenta. ¿Es eso normal o eso indica un problema? De lo contrario, los scripts se ejecutan bien.

Estoy usando Redhat 7.3 x64 bit.

Otra cosa que noté es que también tenemos Redhat 7.2 y los pids no son tan altos, solo en sistemas operativos más nuevos. ¿Por qué sería eso? ¿Significa que está relacionado con el sistema operativo y es normal?

No tengo eso kernel_pid_maxen mi sysctl.conf. Corrí gato /proc/sys/kernel/pid_maxy ya veo 458752.


No tienes kernel_pid_maxen tu sysctl.confporque debería ser kernel.pid_max.
JRFerguson

Las ID de proceso grandes solo significan que ha iniciado muchos procesos desde que se inició la máquina. Cada vez que se inicia un proceso, el núcleo asigna la siguiente ID de proceso disponible más grande que la utilizada más recientemente, volcando cuando alcanza el máximo.
chepner

Respuestas:


19

En el arranque, el núcleo ajusta el valor predeterminado pid_maxsegún la cantidad de CPU disponibles. Cuando el número es bajo, se selecciona el 32768 habitual. De lo contrario, el cálculo se realiza de la siguiente manera (mostrando aquí que un kernel 3.10 es similar a RHEL, pero además de algunas variaciones es el mismo para cualquier kernel de Linux reciente):

include/linux/threads.h:

/ *
 * Esto controla el pid máximo predeterminado asignado a un proceso
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 es el valor habitual utilizado en sistemas con menos de 32 subprocesos de CPU disponibles.

y después:

#define PIDS_PER_CPU_DEFAULT 1024

Esos valores luego se usan en kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

y más adelante :

    / * valor predeterminado y mínimo pid_max basado en el número 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: predeterminado:% u mínimo:% u \ n", pid_max, pid_max_min);

Entonces, desde OP esto debería significar un total de 458752/1024 = 448 hilos simultáneos disponibles: bastante. El otro sistema probablemente no tiene tantas CPU / núcleos / hilos, etc., por lo que tiene un valor predeterminado más bajo pid_max.


1
ejemplo: SuperServer 7089P-TR4T tiene 224 núcleos, por lo que 448 hilos.
AB

16

Desde el procdocumentaton :

En plataformas de 32 bits, 32768 es el valor máximo para pid_max. En sistemas de 64 bits, pid_max se puede establecer en cualquier valor hasta 2 ^ 22 (PID_MAX_LIMIT, aproximadamente 4 millones).

Puedes ver el con cat /proc/sys/kernel/pid_max. También puede consultar esto con sysctl.

sudo sysctl -a | grep kernel.pid_max

O:

sysctl -n kernel.pid_max

Modifique /etc/sysctl.confpara cambiar el valor permanentemente y vuelva a cargar con sysctl -p.


7

Una ID de proceso puede ser cualquier valor representado por el pid_ttipo, que es específico de su sistema operativo. En la práctica, generalmente es un entero con signo de 32 bits, lo que significa que la ID de proceso máxima sería 2147483647, o aproximadamente 5000 veces más grande que las ID de proceso que está observando.

La documentación de GNU dice:

Tipo de datos: pid_t

El pid_ttipo de datos es un tipo entero con signo que es capaz de representar una ID de proceso. En la Biblioteca GNU C, esto es un int.

En la práctica, el núcleo generalmente impondrá un límite superior que es más bajo que eso. En un sistema Linux, esto se controla mediante /proc/sys/kernel/pid_maxel valor predeterminado de 32768. Si su sistema es Linux, puede verificar ese archivo para ver cuál es el límite actual.

El límite puede ser diferente en diferentes sistemas operativos; por ejemplo, parece que en macOS PID_MAXestá codificado como 99999 .


3
Linux tiene razones fundamentales de API por las que los pids no pueden llenar un espacio de 31 bits; los 2 bits superiores (además del bit de signo) están reservados para propósitos especiales en las interfaces robustas futex y PI futex. Eso deja solo 29 bits, para un espacio pid de 512M.
R .. GitHub DEJA DE AYUDAR A ICE

1
@R .: Claro, eso es cierto para Linux. Pero cuando escribí esta respuesta, la pregunta no especificaba Linux, por lo que di una respuesta para cualquier Unix. Hasta donde yo sé, no hay nada en el estándar POSIX que requiera un tamaño particular para los pids; Parece innecesario ahora, pero podría imaginar un sistema futuro con un pid_ttamaño de 64 bits.
Daniel Pryden

De hecho, eso es todo cierto.
R .. GitHub DEJA DE AYUDAR A HIELO
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.