Почему я могу создать больше потоков, чем "свободная память" / "размер стека потоков"? - PullRequest
2 голосов
/ 10 апреля 2019

В Linux максимальное количество потоков определяется как max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);, и его можно получить, вызвав cat /proc/sys/kernel/threads-max.Это возвращает около 14 000 для моего Raspberry Pi 3. Однако, когда я просто создаю потоки в цикле с pthread_create() (которые пусты), я могу создать только 250, прежде чем я получу ENOMEM (Cannot allocate memory).

Теперь я посмотрел на стек по умолчанию, который выделен для процесса или потока, и это 8192k.Таким образом, около 250 потоков я бы использовал 2 ГБ памяти.Однако, на мой взгляд, это также не складывается, потому что вызов free -m показывает, что я получил всего 1 ГБ памяти.

Поскольку у меня есть 1 ГБ оперативной памяти, я ожидал, что смогу создать только 125Максимальное количество потоков: не 250 и не 14000.

Почему я могу создать 250 потоков?

1 Ответ

2 голосов
/ 10 апреля 2019

По умолчанию Linux выполняет избыточную память. Это означает, что вы можете выделить больше анонимной, доступной для записи памяти, чем физической памяти.

Вы можете отключить переполнение памяти, используя:

# sysctl vm.overcommit_memory=2

Это приведет к сбою некоторых рабочих нагрузок, которые прекрасно работают в режиме vm.overcommit_memory=0. Некоторые подробности можно найти в документации overcommit .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...