LINUX.ORG.RU

проблемы с пооками и памятью


0

0

Здравствуйте. Знаю, что архитектура приложения кривая, но тем не менее может кто сможет объяснить мою проблему:

сервер мощный - 2 процессорный с 2 гигами памяти. Но почему то на создании 300 потока выдает, что не может выделить память. Проверил программу - утечек памяти нет (valgrind). ulimit поставил явно больше, чем может понадобится (поставил большое количество процессов и открытых файлов). Потоки в detached состоянии. Если игорировать эти ошибки (о невозможности создания потока) - и пытаться создавать потоки - программа вылетает, в логах пусто (как системных, так и програамных, как будто ОС просто убила ее тихо). Куда копать?

Кол-во процессов останавливается на 300

anonymous

Ответ на: комментарий от Dead

2.4 NPTL P.S. на 2.6 вроде такого не наблюдается, но точно проверить еще не могу

anonymous
()

Тихо убить она её не может, oom громко убивает :)

Во вторых 300 * 8 = 2400Mb, это стек для всех потоков. Уже 2,5 гига почти. Образ приложения в линуксе если нет HighMem будет 3Gb. Вероятнее всего кончается линейное пространство потому и не удаётся выделить.

ms
()
Ответ на: комментарий от ms

>Образ приложения в линуксе если нет HighMem будет 3Gb.

а разве HighMem может в линуксе изменить размер образа приложения?? желательно поподробней и слинками

cvv ★★★★★
()
Ответ на: комментарий от ms

8 Мб - стек у потока?! А если мне столько не надо? :) Допустим мне 100KB хватит, как это сделать?

anonymous
()
Ответ на: комментарий от anonymous

Прогнал, сори, не жочитал нормально до конца. Тогда вопрос по уменьшению стека снимается :)

anonymous
()
Ответ на: комментарий от ms

А вообще написано что дефолтный стек для native threads 128 килобайт. Во время работы прграммы в системе остается не меньше 500 метров. (именно что показывает free)

anonymous
()
Ответ на: комментарий от anonymous

free показывает обьём незадействованных страниц а у тебя скорее всего закончилось адресное пространство

cvv ★★★★★
()
Ответ на: комментарий от cvv

А можно поподробнее? Если честно не совсем понятно. Как может закончится адресное пространство и остаться весьма внушительный объем незадействованных страниц? Или имеется ввиду, что память выделена вся, но еще не заюзалась приложением?

P.S. А вообще это в принципе нереально наплодить пару тысяч процессов использовав при этом не болльше гига памяти? Просто вроде с fork() получалось создать несколько тысяч процессов. Сервер справлялся, кряхтя, но все же. А на потоках упирается все в память. Или это из-за COW технологии fork() в лине?

anonymous
()
Ответ на: комментарий от cvv

> а разве HighMem может в линуксе изменить размер образа приложения?? желательно поподробней и слинками

HighMem не может, это я просто опечатался, хаймем расширяет пространство ядра, а то таблицы страниц не влазют когда памяти много :)

ms
()
Ответ на: комментарий от anonymous

>А можно поподробнее? Если честно не совсем понятно. Как может закончится адресное пространство и остаться весьма внушительный объем незадействованных страниц? Или имеется ввиду, что память выделена вся, но еще не заюзалась приложением?

>P.S. А вообще это в принципе нереально наплодить пару тысяч процессов использовав при этом не болльше гига памяти? Просто вроде с fork() получалось создать несколько тысяч процессов. Сервер справлялся, кряхтя, но все же. А на потоках упирается все в память. Или это из-за COW технологии fork() в лине?

упрощённо:в линуксе есть два понятия: "память доступная процессу" и "память доступная ядру" которые между собой связаны весьма условно.

так вот у тебя закончилась память доступная процессу а памяти доступной ядру у тебя ещё предостаточно что собственно и показывают всякие top, meminfo,....

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.