Виртуальная машина Ubuntu 7.04 не хватает памяти
Я поддерживаю виртуальную машину Ubuntu 7.04 на Linode.com для размещения нескольких веб-сайтов, списков адресов электронной почты и т. Д. Она долгое время работала без нареканий. Я не исправляю это или действительно обращаю на это внимание.
В последнее время (последние несколько месяцев) и с возрастающей частотой в коробке заканчивается память, и мне приходится ее перезагружать. Он сконфигурирован с реальной памятью 350 МБ плюс 64 МБ подкачки. Это работает Apache, Mysql, Postfix и почтальон.
Симптомы нехватки памяти очевидны, и я вижу их в 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
Есть ли метод серебряной пули, чтобы определить, что здесь происходит? Я наблюдаю за "вершиной", и хотя я вижу, как со временем уменьшается реальная память, я не вижу явного виновника.
4 ответа
Возможно, сконфигурируйте задание cron для отправки по почте чего-нибудь ps auxh | sort -r --key=4 | head -5
Вам каждые 30 минут или около того?
Это позволит вам узнать 5 главных потребителей памяти, что может помочь отследить преступный процесс. The 4th column is the percentage of memory consumed by the process.
You might be able to spot a trend over time.
Вверху попробуйте команды F o, чтобы отсортировать по виртуальному (общему) размеру изображения. Тогда вы увидите самые большие процессы наверху.
Вы также можете удалить требование перезагрузки, установив swapd, который автоматически создаст файлы подкачки в случае нехватки памяти.
Если процессы Apache становятся большими, например, если вы запускаете PHP-скрипты через mod_php, которые время от времени работают с достаточным количеством данных, вы можете не заметить, что какой-то один процесс массово растет (но каждый процесс Apache немного растет со временем). Если это так, то вы можете попробовать следующее:
- ограничьте число дочерних процессов, используемых Apache, путем настройки параметров:
- StartServers
- MinSpareServers
- MaxSpareServers
- MaxClients
- рассмотрите возможность использования mpm_worker вместо mpm_perfork, если все, что вы делаете с Apache, является поточно-ориентированным
- убедитесь, что KeepAliveTimeout не слишком высокий (это останавливает ошибочного клиента, который слишком долго удерживает процессы, особенно это важно, если вы резко ограничили число детей
- Уменьшение максимального времени жизни каждого процесса с помощью параметра MaxRequestsPerChild поможет, если проблема связана с утечкой памяти, хотя может сделать вашу службу заметно менее эффективной, если вы подключите ее слишком далеко.