Vedo pids superiori a 400.000 perché? Indica che qualcosa non va?


14

Oggi ho appena notato che i miei ID di processo sono molto alti, nei 400.000 (ovvero 449624). Quando corro ps -ef | more, è quando l'ho notato. È normale o indica un problema? Altrimenti gli script funzionano bene.

Sto usando Redhat 7,3 x64 bit.

Un'altra cosa che ho notato è che abbiamo anche Redhat 7.2 e i pids non sono così alti, solo su un nuovo sistema operativo. Perché dovrebbe essere? Significa che è legato al sistema operativo e normale?

Non ce l'ho kernel_pid_maxnel mio sysctl.conf. Ho corso gatto /proc/sys/kernel/pid_maxe vedo 458752.


Non hai kernel_pid_maxnel tuo sysctl.confperché dovrebbe essere kernel.pid_max.
JRFerguson,

Gli ID di processo di grandi dimensioni indicano solo che hai avviato molti processi da quando la macchina è stata avviata. Ogni volta che viene avviato un processo, il kernel assegna il successivo ID processo disponibile più grande di quello utilizzato più di recente, scorrendo quando si raggiunge il massimo.
Chepner,

Risposte:


19

All'avvio, il kernel regola il valore predefinito in pid_maxbase al numero di CPU disponibili. Quando il numero è basso, viene selezionato il solito 32768. Altrimenti il ​​calcolo viene eseguito come segue (mostrando qui un kernel 3.10 simile a RHEL ma a parte alcune variazioni è lo stesso per qualsiasi kernel Linux recente):

include/linux/threads.h:

/ *
 * Controlla il pid massimo predefinito assegnato a un processo
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 è il solito valore utilizzato sui sistemi con meno di 32 thread CPU disponibili.

e più tardi:

#define PIDS_PER_CPU_DEFAULT 1024

Tali valori vengono quindi utilizzati in kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

e più tardi :

    / * bump default e minimo pid_max basato sul numero di 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: default:% u minimo:% u \ n", pid_max, pid_max_min);

Quindi da OP questo dovrebbe significare un totale di 458752/1024 = 448 thread simultanei disponibili: abbastanza. L'altro sistema probabilmente non ha altrettante CPU / core / thread ecc., Quindi ha un valore predefinito inferiore pid_max.


1
esempio: SuperServer 7089P-TR4T ha 224 core e 448 thread.
AB

16

Da l' procdocumentaton :

Su piattaforme a 32 bit, 32768 è il valore massimo per pid_max. Sui sistemi a 64 bit, pid_max può essere impostato su qualsiasi valore fino a 2 ^ 22 (PID_MAX_LIMIT, circa 4 milioni).

Puoi vedere il con cat /proc/sys/kernel/pid_max. Puoi anche interrogare questo con sysctl.

sudo sysctl -a | grep kernel.pid_max

O:

sysctl -n kernel.pid_max

Modifica /etc/sysctl.confper modificare il valore in modo permanente e ricaricare con sysctl -p.


7

Un ID processo può essere qualsiasi valore rappresentato dal pid_ttipo, specifico per il tuo sistema operativo. In pratica, di solito è un numero intero con segno a 32 bit, il che significa che l'ID processo massimo sarebbe 2147483647, o circa 5000 volte più grande degli ID processo che stai osservando.

La documentazione GNU dice:

Tipo di dati: pid_t

Il pid_ttipo di dati è un tipo intero con segno che è in grado di rappresentare un ID processo. Nella libreria GNU C, questo è un int.

In pratica, il kernel di solito impone un limite superiore che è inferiore. Su un sistema Linux, questo è controllato da /proc/sys/kernel/pid_max, che per impostazione predefinita è 32768. Se il tuo sistema è Linux, puoi controllare quel file per vedere qual è il limite attuale.

Il limite può essere diverso su diversi sistemi operativi; ad esempio, sembra che su macOS PID_MAXsia codificato come 99999 .


3
Linux ha ragioni API fondamentali per cui i pid non possono riempire uno spazio a 31 bit; i primi 2 bit (oltre al bit di segno) sono riservati per scopi speciali nelle robuste interfacce futex e PI futex. Ciò lascia solo 29 bit, per uno spazio pid di 512 M.
R .. GitHub smette di aiutare ICE il

1
@R .: Certo, è vero per Linux. Ma quando ho scritto questa risposta, la domanda non specificava Linux, e quindi ho dato una risposta per qualsiasi Unix. Per quanto ne so, non c'è nulla nello standard POSIX che richiede una dimensione particolare per i pid; sembra inutile ora, ma potrei immaginare un sistema futuro con dimensioni di pid_t64 bit.
Daniel Pryden,

In effetti è tutto vero.
R .. GitHub smette di aiutare ICE il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.