LINUX.ORG.RU
решено ФорумAdmin

Cannot allocate memory

 ,


0

1

Есть маленький сервачек на Атоме с 1G оперативки. В какой-то момент начинает сильно тормозить и на любую консольную команду получаю «Cannot allocate memory». Ни ps ни top не вызвать и не посмотреть какой процесс отожрал всю память. Вопрос как этого избежать? Как настроить систему что бы она убивала процесс который угрожает работоспособности системы исчерпыванием памяти или CPU или обращением к диску?

fork-bomb

congrats!

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

Судя по строчкам в syslog «Out of memory: Kill process» OOM срабатывает но сервак к этому моменту уже даже на ping не отвечает не говоря уже о ssh.

Spinel ()

сделай небольшой своп, хотя-бы на 512Мб.

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

Для конкретного - никак, это общесистемная настройка. Для конкретного процесса можно попробовать ulimit на память.

tailgunner ★★★★★ ()
Ответ на: комментарий от post-factum

Вроде ж OOM не сразу по окончании свободной памяти начинает убивать процессы, а спустя какое-то время, около получаса, пока он соберет статистику по процессам? Или нет? // просто мимо проходил, вспомнил заявление одного анонимуса

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

overcommit это стратегия ядра, она для процессов не имеет смысла.

Процессы всегда разные.

ещё раз: своп сделай. Тогда ООМ будет лучше работать, а не пальцем в небо.

ЗЫЖ возможно overcommit не нужно выключать, а может и нужно. Сначала разберись в проблеме, а потом всё остальное.

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

а спустя какое-то время, около получаса, пока он соберет статистику по процессам? Или нет?

конечно нет.

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

Это мешает тебе поставить ulimit или отключить overcommit?

Можешь еще залогиниться по ssh и запустить там в цикле ps - может, успеешь увидеть, какой процесс резко растолстел. Хотя это может быть не утечка памяти, а форк-бомба.

tailgunner ★★★★★ ()

Вообще оч. странно что простой процесс от простого пользователя может уложить систему просто исчерпанием памяти.Как сделать работе OOM более жесткой?

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

Впервые такое слышу. Да и что система будет в эти полчаса делать, если резерва памяти уже нет? Какую память выделять процессам?

MrClon ★★★★★ ()

В какой-то момент начинает сильно тормозить и на любую консольную команду получаю «Cannot allocate memory».

На сколько быстро это происходит ? Можно попробовать алерт какой-нибудь настроить на некий оставшийся объём и успеть зайти по алерту.

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

Ок,а что у линукс нет защиты от форк-бомб?

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

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

Это не важно что крутится, меня возмущает что простой пользователь может запустить кривое приложение и уложить сервак. Вера в Линукс тает.

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

Пока я не отключил своп, OOM кил вообще не было, сервак просто умирал.

он не «умирал», а начинал дико тормозить. Наверное своп очень большой был, ну и пока оно всё не заполнится, ООМ не почешется. Тут либо своп надо делать маленький, либо подождать. Оно работает, только дико тормозит. Но обычно можно дождаться ответа.

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

Ок,а что у линукс нет защиты от форк-бомб?

тебе обязательно давать шелл потенциальны врагам?

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

Как то тяжело начальству объяснить что сервак не умер а дико тормозит. И ответа можно ждать минут 20-30, а это не приемлемо. А зачем делать своп? если нет свопа ООМ быстрее отработает. Если процесс начал жрать память то надежда слабая что он остановится пока она вся не кончится, его как можно быстрее нужно прибить как бешенную собаку.

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

Линукс тебе лишние гигабайты памяти из ниоткуда не нарисует, впрочем как и другие ОС

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

Если процесс начал жрать память то надежда слабая что он остановится
пока она вся не кончится, его как можно быстрее нужно прибить как
бешенную собаку.

Проблема ещё в том, что процесс может быть не тот. ООМ killer убивает, исходя из активности процесса, а не объёма памяти. Если тот, кто съедает память, делает это неторопливо, OOM killer может и не обратить внимание на него.

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

Как то тяжело начальству объяснить что сервак не умер а дико тормозит.

Да, тяжело, особенно, если пять минут назад узнал про лимиты и про то, что их настраивать нужно, да ещё веру в Линукс потерял :-)

Если процесс начал жрать память то надежда слабая что он остановится пока она вся не кончится

Это очень сильно зависит от процесса. Если у процесса медленно потекла память, но при этом он работает, то можно просто отслеживать уровень использования swap'а и принимать меры. При этом, если процесс жрёт и память и процессорное время, то не факт, что OOM-killer выберет именно его, а не какой-нибудь другой, нормальный процесс, который не нужно убивать.

В отсутствии лишней памяти в swap вытесняются не особо нужные процессы, например, udevd. Кроме того без swap трудно отключить overcommit памяти.

И ваш случай больше похоже на fork-bomb, а не на утечку памяти.

А то, что система перестаёт отвечать на ping вобще подозрительно.

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

Как то тяжело начальству объяснить что сервак не умер а дико тормозит.

дык это для поиска причины нужно. А начальству потом отрапортуешь: УМВР. Ну или «для приложения XYZ нужно добавить N памяти».

А зачем делать своп? если нет свопа ООМ быстрее отработает. Если процесс начал жрать память то надежда слабая что он остановится пока она вся не кончится, его как можно быстрее нужно прибить как бешенную собаку.

если не делать своп, то у ООМ нет времени набрать статистику, и выяснить, КТО жрёт память. Вот он и рубит пальцем в небо.

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

Если тот, кто съедает память, делает это неторопливо, OOM killer может и не обратить внимание на него.

тогда это должен смотреть администратор. Если какое-то приложение пожрало 70% RES, то конец немного предсказуем, и тут уже ничего не поможет, кроме покупки RAM(да и то, если приложение нормально написано. Возможно этот быдлокод просто течёт).

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

тогда это должен смотреть администратор.

Так вот и речь у ТС о том, как поймать вредителя. Кстати, можно попробовать поставить collectd и перечислить подозрительные процессы в Plugin processes. Кажется, там занимаемая память тоже пишется.

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

а что у линукс нет защиты от форк-бомб?

Есть. Через control groups или.те же самые ulimit.

Что нужно ограничить ulimit?

Объем памяти, скорее всего. Зависит от того, что происходит.

Какие надо вставить параметры и как их рассчитать?

На основании используемого объема памяти, блин.

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

Вроде ж OOM не сразу по окончании свободной памяти начинает убивать процессы, а спустя какое-то время, около получаса, пока он соберет статистику по процессам? Или нет?

Нет, обычно где-то минуты через 2. Если это десктоп - проще зафорсить OOM через SysRQ+F

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

а что у линукс нет защиты от форк-бомб?

Если ты её не настроил - нет

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

меня возмущает что простой пользователь может запустить кривое приложение и уложить сервак

Простой пользователь при НЕНАСТРОЕННЫХ лимитах может: выесть всю память и всё место на жестком диске. Потому что, ВНЕЗАПНО, лимиты не настроены :-)

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

Какие надо вставить параметры и как их рассчитать?

Зависит от того, какие приложения у тебя там крутятся, сколько памяти и какая нагрузка

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

Что нужно ограничить ulimit?

Нужные!

Какие надо вставить параметры и как их рассчитать?

47!!!! Расчитать как 32+15!!!

no-dashi ★★★★★ ()

<libastral>MySQL на сервере есть?</libastral>

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