Я держу виртуальную машину Ubuntu 7.04, работающую на Linode.com, для размещения нескольких веб-сайтов, списков электронной почты и т.д. Долгое время она работала безупречно. Я не патчую и не особо обращаю на это внимание.
В последнее время (последние несколько месяцев) все чаще и чаще в коробке заканчивается память, и мне приходится его перезагружать. Он сконфигурирован с 350 МБ реальной памяти плюс 64 МБ подкачки. Он запускает Apache, Mysql, Postfix и mailman.
Признаки нехватки памяти очевидны, и я вижу их в файле kernel.log:
Jul 21 10:16:42 grendel kernel: Out of memory: kill process 30364 (apache2) score 11205 or a child
Jul 21 10:16:42 grendel kernel: Killed process 30364 (apache2)
Jul 21 10:16:42 grendel kernel: apache2 invoked oom-killer: gfp_mask=0xa01d2, order=0, oomkilladj=0
Есть ли метод серебряной пули, чтобы определить, что здесь происходит? Я смотрю «верх», и, хотя я вижу, что доступная реальная память со временем уменьшается, я не вижу очевидной причины.
Возможно, настройте задание cron для отправки по почте вывода чего-то вроде ps auxh | sort -r --key=4 | head -5
каждые 30 минут или около того?
Это позволит вам узнать о 5 основных потребителях памяти, что может помочь отследить виновный процесс. Четвертый столбец - это процент памяти, потребляемой процессом.
Вы можете заметить тенденцию с течением времени.
Вверху попробуйте команды F o для сортировки по виртуальному (общему) размеру изображения. Тогда вы увидите вверху самые крупные процессы.
Если процессы Apache становятся большими, например, если вы запускаете сценарии PHP через mod_php, которые время от времени работают с достаточным объемом данных, вы можете не заметить, что какой-либо один процесс массово растет (но каждый процесс Apache немного растет с течением времени ). В этом случае вы можете попробовать следующее:
Вы также можете убрать требование перезагрузки, установив swapd, который автоматически создаст файлы подкачки в случае нехватки памяти.