Назад | Перейти на главную страницу

На виртуальной машине Ubuntu 7.04 не хватает памяти

Я держу виртуальную машину 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 немного растет с течением времени ). В этом случае вы можете попробовать следующее:

  • ограничьте количество дочерних процессов, используемых Apache, настроив параметры:
    • StartServers
    • MinSpareServers
    • MaxSpareServers
    • MaxClients
  • рассмотрите возможность использования mpm_worker вместо mpm_perfork, если все, что вы делаете с Apache, является потокобезопасным
  • убедитесь, что KeepAliveTimeout не слишком велик (это останавливает ошибочный клиент, удерживающий процессы слишком долго, что особенно важно, если вы резко ограничили количество дочерних элементов
  • уменьшение максимального времени жизни каждого процесса с помощью параметра MaxRequestsPerChild поможет, если проблема связана с утечкой памяти, хотя может сделать вашу службу заметно менее эффективной, если вы слишком долго соедините ее

Вы также можете убрать требование перезагрузки, установив swapd, который автоматически создаст файлы подкачки в случае нехватки памяти.