
Я пытаюсь понять процессы 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
Жесткие ограничения поддерживаются ядром, а мягкие ограничения применяются оболочкой.