LINUX.ORG.RU

Процесс убивается ядром по OOM! Что делать?


0

0

Процесс, активно жрущий память вдруг умирает с месседжом Killed.
В /var/log/messages появляется запись: process killed, oom.

А собственно вопрос: как же заранее узнать, когда памяти не хватит?
Ведь этот же не дело: был процесс, работал, выделял память, и вдруг беспричинно умирает!

Что тут можно сделать?


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

Да дело-то не только в malloc. Есть ещё и mmap. Да и что же мне, каждого своего пользотеля просить, чтобы ядро пересобирали?!

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

ну и что???

в ядре есть brk враппером для которого собственно и является malloc.

в конечном итоге и brk и mmap делают одно и тоже

cvv ★★★★★
()

>Что тут можно сделать?

Для начала привести вывод ulimit -a.

Я думаю, что процесс сначала пытаются прибить каким-нибудь гуманным сигналом; соответственно, включить отбрасывание core, и посмотреть на получившийся core отладчиком, чтобы понять, где конкретно программа выпала.

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

>Для начала привести вывод ulimit -a.

скорее всего это не поможет.

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

>так есть маллок в ядре или нет?

посмотри strace на хужий случай

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

малыш,

malloc это обертка над brk,

когда говорят что надо собрать ядро чтобы malloc возвращал NULL,
имеется ввиду собрать чтобы brk возращал NULL, а malloc передавал это дальше.

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

Не надо делать умный вид путём вкладывания тайного смысла в междустрочия предыдущих сообщений, хорошо?

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

>Не надо делать умный вид путём вкладывания тайного смысла в междустрочия >предыдущих сообщений, хорошо?

это не тайный смысл, а очевидные вещи, и если ты их не понимаешь,
нафига тебе раздел development, вали отсюда.

anonymous
()

да уж сколько раз эта тема пережевывалась здесь,
поищите про overcommit.

ядро пересобирать, разумеется не надо, а короткого
ответа не существует.

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

> малыш,

> malloc это обертка над brk,

дяденька, это неправда.

> имеется ввиду собрать чтобы brk возращал NULL

не получится. то есть, он и так возвращает NULL,
когда считает нужным.

sys_brk, кстати говоря, обертка (почти) над mmap.

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

>> малыш,

>> malloc это обертка над brk,

>дяденька, это неправда.

а если грубо???

то что malloc делает существенно больше чем brk мы эт понимаем.

PS:там требуется ваша помощь в соседнем треде а тоя кажись тама дров наламал

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

> то что malloc делает существенно больше чем brk мы эт понимаем.

да нет, я имел в виду что malloc вовсю использует mmap.

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

>> то что malloc делает существенно больше чем brk мы эт понимаем.

>да нет, я имел в виду что malloc вовсю использует mmap.

значит я просто вас неправильно понял

cvv ★★★★★
()

OOM кажется можно через /proc управлять.

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

может я конечно отстал от жизни, но
> да нет, я имел в виду что malloc вовсю использует mmap.
не поленитесь,
привидите код с malloc`ом и вывод strace который это продемонстирует..

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

> не поленитесь,

поленюсь :)

у меня манов нету (оооооооосень старые), поищите
что-нибудь про MMAP_THRESHOLD.

все, что больше - через mmap.

но это даже и не важно. в конце концов, у вас может
быть libc с другой реализацией malloc, или у вас своя
реализация malloc.

повторяю, brk() - это тот же mmap(), только специализированный,
то есть c ограниченным набором возможностей как бы.

уж мне вы поверьте :)

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

idle, разрешите немного не поверить ;-)
 все-же brk() и mmap() - два РАЗЛИЧНЫХ системных вызова,
и в разных системах действительно реализуются по разному.
 НО (по моим сведениям) библиотечная функция malloc использует классический unix-подход и использует brk(), поэтому встретить 
mmap в трассировке malloc - весьма проблематично.
 Хотя действительно реализация mmap  brk на уровне ядра linux весьма схожа. но это уже не относится к топику - вроде ведь обсуждается прикладная задача ;-)

p.s. щас гляну исходник malloc - если я не прав, принесу извенения

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

частично извинясь ;-)
malloc, который в glibc в зависимости от того,
что configure нароет при тестах, может использовать 
brk(), mmap(ANONYMOUS) mmap(/dev/zero)..

p.s. надо-же как прогресс шагнул ;-)
p.p.s. если кому-то интерестно,
описание алгоритма malloc :http://gee.cs.oswego.edu/dl/html/malloc.html
старенькое, но полненькое ;-))

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