Почему _beginthread возвращает ошибку ENOMEM

У меня есть сервер, который реализован на C ++ и работает на предприятии Windows 2003 с оперативной памятью 25 ГБ.

Во время стресс-теста я вижу, когда он пытается создать новый поток, вызывая _beginthread, я получаю ENOMEM, что означает «Недостаточно памяти».

Но я не понимаю, почему не хватает памяти, данные perfmon показывают, что в то время процесс использовал 1,2 ГБ виртуальной машины и аналогичную физическую память, в которой было только 250 потоков.

Может кто-нибудь помочь мне проанализировать или объяснить, почему я все еще получил эту ошибку?

1

Решение

Поток обычно требует 1 МБ нефрагментарный адресное пространство. Если ваш стресс-тест имеет фрагментированную память до такой степени, что нет доступных 1 МБ растяжек, вы не сможете создавать новые потоки. Это может быть достигнуто всего за 2000 выделений по одному байту в худшем случае.

2

Другие решения

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

Постскриптум Существует опция (по крайней мере, для Windows), чтобы настроить ОС для резервирования до 3 ГБ виртуального адресного пространства в пользовательском режиме.

0

Это закончилось из-за утечки памяти в нашем приложении.

0
По вопросам рекламы [email protected]