Понимание различий между pid_max, ulimit -u и thread_max

Понимание различий между pid_max, ulimit -u и thread_max

Я пытаюсь понять процессы Linux. Я запутался в соответствующих терминах pid_max, ulimit -uи thread_max.

В чем именно разница между этими терминами? Может кто-нибудь объяснить разницу?

решение1

Извините, принятый ответ — неверная информация по нескольким направлениям.

/proc/sys/kernel/pid_maxне имеет ничего общего с максимальным числом процессов, которые могут быть запущены в любой момент времени. Это, по сути, максимальный числовой ИДЕНТИФИКАТОР ПРОЦЕССА, который может быть назначен ядром.

В ядре Linux процесс и поток — это одно и то же. Они обрабатываются ядром одинаково. Они оба занимают слот в структуре данных task_struct. Поток, согласно общепринятой терминологии, в Linux — это процесс, который разделяет ресурсы с другим процессом (они также будут разделять идентификатор группы потоков). Поток в ядре Linux — это в значительной степени концептуальная конструкция, если говорить о планировщике.

Теперь, когда вы понимаете, что ядро ​​в значительной степени не различает поток и процесс, должно быть более понятно, что /proc/sys/kernel/threads-maxна самом деле это максимальное количество элементов, содержащихся в структуре данных task_struct. Это структура данных, которая содержит список процессов, или, как их можно назвать, задач.

ulimit, как следует из названия, является ограничением для каждого пользователя. Флаг -uопределяется как «Максимальное количество процессов, доступных одному пользователю». Элемент task_struct содержит uid пользователя, создавшего задачу. Счетчик per-uid поддерживается и увеличивается/уменьшается каждый раз, когда задача добавляется/удаляется из task_struct. Таким образом, ulimit -uуказывает максимальное количество элементов (процессов), которые одному конкретному пользователю разрешено иметь в task_struct в любой момент времени.

Надеюсь, это прояснит ситуацию.

решение2

Давайте разберемся в разнице между процессом и потоком. Согласноэтотсвязь,

Типичное отличие состоит в том, что потоки (одного и того же процесса) работают в общем пространстве памяти, тогда как процессы работают в отдельных пространствах памяти.

Теперь у нас есть pid_maxпараметр, который можно определить следующим образом.

cat /proc/sys/kernel/pid_max

Итак, приведенная выше команда возвращает32,768что означает, что я могу выполнить32,768процессов одновременно в моей системе, которые могут выполняться в отдельных областях памяти.

Теперь у нас есть threads-maxпараметр, который можно определить следующим образом.

cat /proc/sys/kernel/threads-max

Приведенная выше команда возвращает мне вывод в виде126406что означает, что я могу иметь126406потоки в общем пространстве памяти.

Теперь давайте возьмем 3-й параметр ulimit -u, который говорит общее количество процессов, которые пользователь может иметь в определенное время. Команда выше возвращает мне вывод как63203. Это означает, что для всех процессов, которые пользователь создал в определенный момент времени, пользователь может иметь63203процессы запущены.

Гипотетический случай

Итак, если предположить, что два пользователя одновременно выполняют два процесса и каждый из них потребляет много памяти, то оба процесса будут эффективно использовать память.63203Ограничение пользователя на процессы. Так что, если это так, то 2 пользователя фактически израсходовали весь126406 threads-maxразмер.

Теперь мне нужно определить, сколько процессов пользователь может запустить в любой момент времени. Это можно определить из файла, /etc/security/limits.conf. Итак, в этом файле есть по сути 2 настройки, как объяснялось вышездесь.

Амягкий пределэто какпредупреждениеижесткий пределэтореальный максимальный предел. Например, следующее не позволит никому в студенческой группе иметь более 50 процессов, а при достижении 30 процессов будет выдано предупреждение.

@student        hard    nproc           50
@student        soft    nproc           30

Жесткие ограничения поддерживаются ядром, а мягкие ограничения применяются оболочкой.

Связанный контент