Максимальное количество потоков на процесс в Linux?



какое максимальное количество потоков может быть создано процессом под Linux?



как (если возможно) можно изменить это значение?

1169   16  

16 ответов:

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

cat /proc/sys/kernel/threads-max

по умолчанию используется число страниц памяти/4. Вы можете увеличить это как:

echo 100000 > /proc/sys/kernel/threads-max

существует также ограничение на количество процессов( и, следовательно, потоков), которые может создать один пользователь, см. ulimit/getrlimit для получения подробной информации о эти рамки.

это неправильно говорить, что LINUX не имеет отдельных потоков на предел процесса.

Linux реализует максимальное количество потоков на процесс косвенно!!

number of threads = total virtual memory / (stack size*1024*1024)

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

проверьте вашу машину:

Общая Виртуальная Память:ulimit -v (по умолчанию не ограничено, поэтому вам нужно увеличить память подкачки увеличить это)

Общий Размер Стека: ulimit -s (по умолчанию 8 МБ)

повышение значений:

ulimit -s newvalue

ulimit -v newvalue

*замените новое значение на значение, которое вы хотите поставить как предел.

ссылки:

http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/

на практике предел обычно определяется пространством стека. Если каждый поток получает стек 1 МБ (я не могу вспомнить, если это значение по умолчанию в Linux), то вы 32-разрядная система будет работать из адресного пространства после 3000 потоков (при условии, что последний ГБ зарезервирован для ядра).

тем не менее, вы, скорее всего, испытаете ужасную производительность, если вы используете более нескольких десятков потоков. Рано или поздно вы получите слишком много накладных расходов на переключение контекста, слишком много накладных расходов в планировщик и так далее. (Создание большого количества потоков делает немного больше, чем съедает много памяти. Но много потоков с фактическим работа не будет замедлять вас вниз, как они борются за доступное время процессора)

Что вы делаете, когда этот предел будет еще актуальна?

правильные 100k потоки на linux:

ulimit -s  256
ulimit -i  120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max 

 ./100k-pthread-create-app

2018 обновление от @Фома, системы инициализации по умолчанию:

/etc/systemd/logind.conf: UserTasksMax=100000

@dragosrsupercool

Linux не использует виртуальную память для вычисления максимального потока, но физическая оперативная память, установленная в системе

 max_threads = totalram_pages / (8 * 8192 / 4096);

http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/

ядра/вилки.c

/* The default maximum number of threads is set to a safe
 * value: the thread structures can take up at most half
 * of memory.
 */
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

таким образом, поток max отличается между каждой системой, потому что установленная оперативная память может быть разных размеров, я знаю, что Linux не нужно увеличивать виртуальная память, потому что на 32 бит мы получили 3 ГБ для пользовательского пространства и 1 ГБ для ядра, на 64 бит мы получили 128 ТБ виртуальной памяти, что происходит на Solaris, если вы хотите увеличить виртуальную память, вам нужно добавить пространство подкачки.

чтобы получить это:

cat /proc/sys/kernel/threads-max

для этого:

echo 123456789 > /proc/sys/kernel/threads-max

123456789 = # потоков

ограничение количества потоков:

$ cat /proc/sys/kernel/threads-max 

как это вычисляется:

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

и: x86_64 размер страницы (PAGE_SIZE) - 4K; Как и все другие модели, архитектуру x86_64 имеет стек ядра для каждого активного потока. Эти стеки потоков THREAD_SIZE (2*PAGE_SIZE) большой;

для mempages :

cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+} END {print totalpages}';

так что на самом деле число не связано с ограничением размера стека памяти потока (ulimit -s).

P. S: ограничение стека памяти потока составляет 10 м в моя виртуальная машина rhel и для памяти 1.5 G Эта виртуальная машина может позволить себе только 150 потоков?

вероятно, это не должно иметь значения. Вы получите гораздо лучшую производительность, разрабатывая свой алгоритм для использования фиксированного количества потоков (например, 4 или 8, если у вас есть 4 или 8 процессоров). Вы можете сделать это с помощью рабочих очередей, асинхронного ввода-вывода или чего-то вроде libevent.

использовать nbio неблокирующий ввод-вывод библиотека или что-то еще, если вам нужно больше потоков для выполнения вызовов ввода-вывода, которые блокируют

проверьте размер стека на поток с помощью ulimit, в моем случае Redhat Linux 2.6:

    ulimit -a
...
    stack size              (kbytes, -s) 10240

каждый из потоков получит этот объем памяти (10 МБ), назначенный для его стека. С 32-битной программой и максимальным адресным пространством 4 ГБ, это максимум только 4096 МБ / 10 МБ = 409 потоков !!! Минус программный код, минус кучное пространство, вероятно, приведет к наблюдаемому максимуму. из 300 нитей.

вы должны быть в состоянии поднять это путем компиляции и запуска на 64 бит или настройки ulimit-s 8192 или даже ulimit-s 4096. Но если это целесообразно-другое обсуждение...

зависит от вашей системы, просто напишите пример программы [ путем создания процессов в цикле ] и проверьте с помощью ps axo pid,ppid,rss,vsz,nlwp,cmd. Когда он больше не может создавать потоки, проверьте количество nlwp [ nlwp-это количество потоков ] вуаля, вы получили свой дурацкий ответ вместо того, чтобы проходить через книги

для тех, кто смотрит на это сейчас, в системах systemd (в моем случае, в частности Ubuntu 16.04) есть еще один предел, применяемый pids cgroup.максимальный параметр.

по умолчанию это значение равно 12,288 и может быть переопределено в /etc/systemd/logind.conf

другие советы по-прежнему применяются, включая pids_max, threads-max, max_maps_count, ulimits и т. д.

мы можем видеть максимальное количество потоков, определенных в следующем файле в linux

cat / proc/sys/kernel / threads-max

(или)

sysctl-a | grep threads-max

установить постоянно,

vim /etc/sysctl.conf

и добавить

kernel.threads-max = "value"

вы можете увидеть текущее значение с помощью следующей команды- cat / proc/sys / kernel / threads-max

вы также можете установить значение типа

echo 100500 > /proc / sys / kernel / threads-max

значение, которое вы установили, будет проверено на доступных страницах ОЗУ. Если структуры потоков занимают более 1/8) доступных страниц ОЗУ, thread-max будет соответственно уменьшен.

Да, для увеличения количества потоков необходимо увеличить виртуальную память или уменьшить размер стека. В Raspberry Pi я не нашел способа увеличить виртуальную память, если уменьшить размер стека с 8 МБ по умолчанию до 1 МБ, возможно, получить более 1000 потоков на процесс, но уменьшить размер стека с помощью команды "ulimit-s" сделать это для всех потоков. Итак, мое решение было использовать "pthread_t" экземпляр "thread class", потому что pthread_t позволил мне установить размер стека для каждого потока. Наконец,я могу архивировать более 1000 потоков на процесс в Raspberry Pi каждый с 1 МБ стека.

Comments

    Ничего не найдено.