[Comm] alloc_pages: 0-order allocation failed (gfp=0x1d2/0)

Сергей Афанасьевич =?iso-8859-1?q?demiurg888_=CE=C1_mail=2Eru?=
Ср Окт 25 20:34:27 MSD 2006


Здравствуйте!

Буду искренне признателен, если сможете помочь с ниже изложенной
проблемой:

После штатной работы 4.5 месяцев сервера под управлением master 2.2
(штатное ядро - 2.4.20) произошла выгрузка активных процессов ос и система встала в "частично
рабочее состояние". Т.е. работа по сети Ethernet происходит без
проблем, но попытки запустить какие-либо пользовательские программы -
невозможно (не могут локально присоединиться к нужному сокету).
После перезагрузки - никаких проблем нет - программы
пользователей запустились штатно и все работает.

В логах остались вот такие чудные записи:
Sep 22 16:44:13 vkufs_22 kernel: __alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
Sep 22 16:44:13 vkufs_22 kernel: VM: killing process sh
Sep 22 16:44:16 vkufs_22 kernel: __alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
Sep 22 16:46:40 vkufs_22 kernel: __alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
Sep 22 16:46:40 vkufs_22 kernel: VM: killing process GateCom
Sep 22 16:48:07 vkufs_22 kernel: __alloc_pages: 0-order allocation failed (gfp=0x1d2/0)
Sep 22 16:48:26 vkufs_22 kernel: __alloc_pages: 0-order allocation failed (gfp=0x1d2/0)

и т.д. более 20 процессов были убиты.
Прошерстил поисковики - судя по сообщениям - это ошибка свидетельсвует
о том, что какой-либо процесс желает получить определенный объем
памяти, НО по каким-то причинам памяти больше нет (стоит сказать, что
память сервера - 1 гиг, swap - тоже 1 гиг). И как следствие
данный факт порождает убийство уже созданных процессов.
Но вопрос в другом. Почему памяти не стало? Получается что какой-то
процесс все эти 4 месяца эту память потихоньку съедал и не освобождал.
Если бы памяти было бы больше, то данный зловредный процесс выбрал ее
всю не за 4 месяца а за больший срок.
Написал примитивную утилиту где функция malloc в цикле забирает
память. После того как колличество забранный памяти достигло
критической величины произошло убийство этого процесса и некоторых
других (в зависимости от имени какого пользователя происходил запуск
программы).

Если я прав - то подскажите пожалуйста как поступать дальше (а если я
не прав - намекните пожалуйста где):
1. Моя цель определить что за процесс съел всю память. Каким образом
это сделать? Ничего умнее как по cron запускать "ps -aux" и смотреть
результаты через недельку - месяц?
2. Прочитал про ulimit и про /etc/security/. Как вариант можно
выставить лимиты на память и тот процесс, который первый их нарушит -
тот и виновник?

Извините что много так и немного сумбурно...
Заранее благодарю за любую помощь...
  

-- 
Искренне с уважением,
                    Сергей             mailto:demiurg888 на mail.ru




Подробная информация о списке рассылки community