Размер стека потока Java на 64-битной Linux - PullRequest
3 голосов
/ 03 августа 2011

Моя цель состоит в том, чтобы придумать число максимальных потоков, которые могут работать параллельно.Я указал на многие ссылки Google, где они дают простую математику, разделяя RAM / StackSize.В 64-битном Linux у нас размер стека потоков определен как 10 МБ (ulimit -s = 10240 КБ), а ОЗУ составляет 4 ГБ, оставляя 1 ГБ для ОС, и, исходя из этой математики, я могу иметь ~ 300 потоков или около того, но небольшое тестовое приложение,пишет идет до ~ 32297, а затем выдает ошибку памяти.

Я пробовал разные значения с -Xss, но эти значения почти не влияют на количество потоков, оно остается таким же, как ~ 32297).

Это создало у меня впечатление, что размер стека является переменным и определяется ОС и достигает максимального значения, определенного нами при необходимости, но везде, где я читаю, размер стека является статическим

Что именно яздесь отсутствует?

Ответы [ 5 ]

4 голосов
/ 03 августа 2011

Попробуйте проверить / изменить максимальный размер стека Linux, используя

ulimit -s

Также проверьте ограничение потоков Linux

cat /proc/sys/kernel/threads-max  
3 голосов
/ 09 февраля 2012

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

number of threads = total virtual memory / (stack size1024)

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

Проверьте свой компьютер:

ВсегоВиртуальная память: ulimit -v (значение по умолчанию не ограничено, поэтому вам необходимо увеличить объем подкачки, чтобы увеличить его)

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

Командачтобы увеличить эти значения:

ulimit -s newvalue

ulimit -v newvalue
*1024** Замените новое значение значением, которое вы хотите установить в качестве предела.

Ссылки:

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

3 голосов
/ 03 августа 2011

Я также нашел ограничение около 32 КБ для потока в Java. Если у вас столько потоков, обычно лучше использовать другой подход. На моей машине 32K-поток, выполняющий while(true) Thread.sleep(1000), будет потреблять 3 ядра, просто переключая контекст.

Java: какое количество потоков вы можете создать?

0 голосов
/ 08 марта 2018

Это из-за переменной ядра pid_max, которая по умолчанию составляет 32768, но для 64-битных систем может быть увеличена до 4 миллионов.Объяснение простое: 1 поток = 1 процесс, который будет иметь 1 PID (идентификатор процесса), поэтому больше нет ни пидов, ни потоков.

0 голосов
/ 03 августа 2011

То, что вы прочитали, действительно только в 32-битной архитектуре, когда пределом является адресное пространство (2 ^ 32). По сути, у вас есть что-то вроде этого: Xmx + MaxPermSize + (Xss * количество потоков) <Макс. Адресное пространство ОС допускает пользовательский процесс. В зависимости от ОС и физического оборудования у вас есть что-то вроде 3Go, как вы сказали. Но это не имеет ничего общего с оперативной памятью. </p>

Для 64-битной архитектуры адресное пространство не будет ограничением (2 ^ 64). Вы должны посмотреть на ограничения ОС, как кто-то сказал выше.

...