Я бачу прищі вище 400 000, чому це? Чи вказує це, що щось не так?


14

Сьогодні я лише помітив, що мої ідентифікатори процесу дуже високі - 400 000 (тобто 449624). Коли я бігаю ps -ef | more, саме тоді я це помітив. Це нормально чи це вказує на проблему? Інакше сценарії працюють нормально.

Я використовую Redhat 7,3 x64 біт.

Ще одна річ, яку я помітив, - це те, що у нас також є Redhat 7.2, і накладки не такі високі, як тільки на новіших ОС. Чому це було б? Це означає, що це стосується ОС і нормально?

Я не маю , що kernel_pid_maxна мою sysctl.conf. Я побіг кота /proc/sys/kernel/pid_maxі бачу 458752.


У вас немає kernel_pid_maxсвоїх, sysctl.confтому що це має бути kernel.pid_max.
JRFerguson

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

Відповіді:


19

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

include/linux/threads.h:

/ *
 * Це контролює максимальний під за замовчуванням, призначений для процесу
 * /
#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;

і пізніше :

    / * bump за замовчуванням та мінімальний pid_max залежно від кількості 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: за замовчуванням:% u мінімум:% u \ n", pid_max, pid_max_min);

Отже, з ОП це повинно означати загальну кількість 458752/1024 = 448 одночасних потоків: досить багато. Інша система, мабуть, має не так багато процесорів / ядер / потоків тощо, тому за замовчуванням є нижчий pid_max.


1
приклад: SuperServer 7089P-TR4T має 224 ядра, тому 448 ниток.
AB

16

З в procdocumentaton :

На 32-бітних платформах 32768 - це максимальне значення для pid_max. У 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, що під-файли не можуть заповнити 31-розрядний простір; перші два біти (крім бітових знаків) зарезервовані для спеціальних цілей у надійних інтерфейсах futex та PI futex. Це залишає лише 29 біт, для 512 М під місця.
R .. GitHub СТОП ДОПОМОГАЙТЕ

1
@ R .: Звичайно, це правда для Linux. Але коли я написав цю відповідь, питання не вказало Linux, і тому я дав відповідь для будь-якого Unix. Наскільки я знаю, у стандарті POSIX немає нічого, що вимагає певного розміру для підключень; зараз це здається непотрібним, але я міг би уявити собі майбутню систему, яка pid_tмала розмір 64 біт.
Даніель Приден

Дійсно, це все правда.
R .. GitHub СТОП ДОПОМОГАЙТЕ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.