Я вижу pids выше 400 000, почему это? Означает ли это, что что-то не так?


14

Сегодня я только что заметил, что мои идентификаторы процессов очень высоки - 400 000 (т. Е. 449624). Когда я бегу ps -ef | more, вот когда я это заметил. Это нормально или это указывает на проблему? В противном случае сценарии работают нормально.

Я использую Redhat 7.3 x64 bit.

Еще одна вещь, которую я заметил, это то, что у нас также есть Redhat 7.2, и pids не такой высокий, просто на более новой ОС. С чего бы это? Означает ли это, что это связано с ОС и нормально?

У меня нет этого kernel_pid_maxв моем sysctl.conf. Я запустил кошку, /proc/sys/kernel/pid_maxи я вижу 458752.


Вы не имеете kernel_pid_maxв своем, sysctl.confпотому что это должно быть kernel.pid_max.
JRFerguson

Большие идентификаторы процессов означают, что вы запустили много процессов с момента загрузки машины. Каждый раз, когда процесс запускается, ядро ​​назначает следующий доступный идентификатор процесса, больший, чем последний использованный, и переворачивается, когда вы достигаете максимума.
chepner

Ответы:


19

При загрузке ядро ​​корректирует настройки по умолчанию в pid_maxзависимости от количества доступных процессоров. Когда число низкое, выбирается обычный 32768. В противном случае вычисления выполняются следующим образом (здесь показано, что ядро ​​3.10 похоже на RHEL, но, за исключением некоторых вариантов, то же самое для любого недавнего ядра Linux):

include/linux/threads.h:

/ *
 * Это контролирует максимальный pid по умолчанию, назначенный процессу
 * /
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL? 0x1000: 0x8000)

0x8000 = 32768 - это обычное значение, используемое в системах с менее чем 32 доступными потоками процессора.

и позже:

#define PIDS_PER_CPU_DEFAULT 1024

Эти значения затем используются в kernel/pid.c:

int pid_max = PID_MAX_DEFAULT;

и позже :

    / * увеличить значение по умолчанию и минимальное значение pid_max в зависимости от количества процессоров * /
    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: по умолчанию:% u минимум:% u \ n", pid_max, pid_max_min);

Таким образом, из OP это должно означать в общей сложности 458752/1024 = 448 одновременно доступных потоков: довольно много. Другая система, вероятно, имеет не так много процессоров / ядер / потоков и т. Д., Поэтому имеет более низкое значение по умолчанию pid_max.


1
пример: SuperServer 7089P-TR4T имеет 224 ядра и 448 потоков.
AB

16

Из в procdocumentaton :

На 32-битных платформах максимальное значение для pid_max составляет 32768. В 64-битных системах pid_max можно установить на любое значение до 2 ^ 22 (PID_MAX_LIMIT, приблизительно 4 миллиона).

Вы можете увидеть с cat /proc/sys/kernel/pid_max. Вы также можете запросить это с sysctl.

sudo sysctl -a | grep kernel.pid_max

Или:

sysctl -n kernel.pid_max

Изменить, /etc/sysctl.confчтобы изменить значение навсегда и перезагрузить с sysctl -p.


7

Идентификатором процесса может быть любое значение, представленное pid_tтипом, специфичным для вашей операционной системы. На практике это обычно 32-разрядное целое число со знаком, что означает, что максимальный идентификатор процесса будет 2147483647 или примерно в 5000 раз больше, чем идентификаторы процесса, которые вы наблюдаете.

Документация GNU гласит:

Тип данных: pid_t

Тип pid_tданных - это целочисленный тип со знаком, который может представлять идентификатор процесса. В библиотеке GNU C это int.

На практике ядро ​​обычно устанавливает верхний предел, который ниже этого. В системе Linux это контролируется с помощью по /proc/sys/kernel/pid_maxумолчанию 32768. Если ваша система Linux, вы можете проверить этот файл, чтобы увидеть текущий предел.

Ограничение может быть различным в разных операционных системах; например, похоже, что в macOS PID_MAXкодируется как 99999 .


3
У Linux есть фундаментальные причины API, потому что pids не может заполнить 31-битное пространство; 2 верхних бита (в дополнение к знаковому биту) зарезервированы для специальных целей в надежных интерфейсах futex и PI futex. Это оставляет только 29 бит, для 512-мегапиксельного пространства.
R .. GitHub ОСТАНОВИТЬ ЛЬДА

1
@R .: Конечно, это верно для Linux. Но когда я написал этот ответ, в вопросе не указывалось Linux, и поэтому я дал ответ для любого Unix. Насколько я знаю, в стандарте POSIX нет ничего, что требовало бы определенного размера для pids; сейчас это кажется ненужным, но я мог бы представить будущую систему, pid_tразмер которой составлял бы 64 бита.
Даниэль Приден

На самом деле это все правда.
R .. GitHub ОСТАНОВИТЬ ЛЬДА
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.