У меня есть пакет VPS.
Я не могу войти в свой lxadmin, потому что это "недостаточно памяти".
В HyperVM я вижу, что мой VPS использует 240 МБ 256 МБ.
Когда я перезагружаю HyperVM, память опускается до 2 МБ.
Но затем он медленно возвращается назад, минута за минутой, и 15 минут это в 127 МБ и скалолазание.
У меня в основном есть пара Веб-сайты PHP в подкаталогах на сайте, которые собираются один удар в минуту, на этих сайтах довольно много графика на них, сделайте немало анализ текста при каждом ударе, и используется sqlite база данных.
Как вы думаете, по опыту причина об этом быстром расползании памяти?
Что я могу сделать с изолировать причина?
Вот результат сверху, похоже, что все экземпляры apache складываются, что это значит?
альтернативный текст http://tanguay.info/web/external/lxadminMemoryProblemTop.png
альтернативный текст http://tanguay.info/web/external/lxAdminMemoryProblem.jpg
Apache создаст несколько процессов, это нормально. Вы можете контролировать это в конфигурации apache. Настройки зависят от того, какой тип MPM (Multi-Processing Module) вы используете.
Если вы используете Apache MPM worker (http://httpd.apache.org/docs/2.0/mod/worker.html) вы можете управлять им с помощью следующих настроек:
ServerLimit 16 Сколько процессов разрешено одновременно (это должно быть больше или равно MaxClients / ThreadsPerChild)
StartServers 2 Сколько процессов запускать при запуске apache
MaxClients 150 Сколько запросов вы можете одновременно обслуживать
MinSpareThreads 25 Apache попытается оставить хотя бы это количество потоков без работы
MaxSpareThreads 75 Apache будет пытаться оставить меньше, чем это количество потоков, простаивающих
Темы для ребенка 25 Сколько потоков на процесс (один поток может одновременно обслуживать один запрос)
Поэтому, если у вас недостаточно памяти для запуска всех этих процессов, попробуйте уменьшить MaxClients и ServerLimit.
Если вы используете предварительный форк Apache MPM (http://httpd.apache.org/docs/2.0/mod/prefork.html) вы можете управлять им с помощью следующих настроек:
StartServers 20 Сколько процессов запускать при запуске apache
MinSpareServers 10 Apache автоматически настроится, чтобы поддерживать хотя бы это количество незанятых процессов.
MaxSpareServers 20 Apache автоматически настроится, чтобы поддерживать меньше этого количества простаивающих процессов.
ServerLimit 150 Это должно быть равно MaxClient для prefork MPM
MaxClients 150 Это максимальное количество процессов, которые будет запускать apache.
MaxRequestsPerChild 10000 Сколько запросов обработает процесс, прежде чем он будет завершен.
MaxRequestsPerChild нуждается в дополнительном объяснении, скажем, у вас работает много разных PHP-скриптов, и один или два из них используют намного больше памяти, чем остальные. После того, как один из процессов запустил этот конкретный сценарий, процесс будет использовать эту память до тех пор, пока не умрет. С помощью этой опции вы можете установить, как часто вы хотите, чтобы процессы перезапускались.
Так как же узнать, что настроить и эти значения? Во-первых, выясните, сколько у вас свободной памяти, когда apache не работает. Во-вторых, выясните, сколько памяти требуется каждому процессу httpd в среднем. (похоже, что где-то около 15 МБ от вашего топа)
Поэтому, если у вас есть 150 МБ свободного места, когда apache не запущен, вам следует ограничить apache только созданием 150/15 = 10 процессов.
Итак, если вы запустите MPM worker, это может сработать:
ServerLimit 10
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
И если вы используете предварительный форк MPM, это может сработать лучше:
StartServers 5
MinSpareServers 2
MaxSpareServers 8
ServerLimit 10
MaxClients 10
MaxRequestsPerChild 1000
Войдите в оболочку SSH и запустите top
. Это даст вам представление о том, какие именно процессы вызывают здесь проблемы.
Попробуйте использовать
pstree
чтобы узнать, какой процесс apache запускает другие. Я думаю, у вас есть на сайте инструкция, которая раздваивает процесс и порождает несколько экземпляров.
Apache потребляет много памяти, я думаю, это нормально видеть, что apache берет столько оперативной памяти с использованием трафика, как у вас.
Мой совет - обновить свой VPS. Или, если вы хотите получить максимальную отдачу от вложенных средств, откажитесь от Apache и используйте nginx / lighttpd с php-fpm. Я лично использую стандартную версию Litespeed Webserver на своем VPS, и это здорово. Единственным недостатком является то, что если ваши сайты превышают лимит Litespeed (150 одновременных подключений), вам придется платить за Enterprise Edition или переключаться на другие веб-серверы.
Здесь есть две проблемы:
memory_limit
размер в PHP.mod_php
для запуска PHP.Чтобы решить первую проблему, вы должны установить memory_limit
размер в php.ini
, или .htaccess
файл, который может перезаписать значения по умолчанию. Сообщение об ошибке, которое вы видите, может быть легко вызвано настройкой ограничения памяти PHP, а не ограничением VPS.
Вы легко можете увеличить лимит. Истинное исправление требует исправления кода приложения.
Вторая проблема связана с mod_php
является более сложным и требует изменения настроек Apache. В mod_php
Расширение добавляет использование памяти каждому процессу Apache, который начинает обслуживать PHP. Сначала у вас есть изначальные процессы Apache, которые обслуживают файлы, и несколько процессов, которые обслуживают PHP. Когда количество запросов увеличивается, более устаревшие процессы начинают загружать PHP. В какой-то момент вы излишне потребляете много памяти.
Поэтому я бы рекомендовал избегать бега mod_php
и вместо этого запустите PHP как процесс FastCGI.
Таким образом, вы контролируете количество процессов, обслуживающих PHP, и все процессы apache остаются чистыми с низким использованием памяти. Весь мой сервер разработки работает в пределах 250 МБ, на нем размещаются веб-сайты, базы данных, электронная почта и Redmine.
Конфигурационные файлы Apache должны иметь следующее содержимое:
<IfModule fcgid_module>
FcgidIPCDir /var/lib/apache2/fcgid/
FcgidProcessTableFile /var/lib/apache2/fcgid/shm
FcgidMaxProcessesPerClass 1
FcgidIOTimeout 600
AddHandler fcgid-script .fcgi
<FilesMatch "\.php$">
AddHandler fcgid-script .php
Options +ExecCGI
FcgidWrapper /srv/www/cgi-bin/php5-wrapper.sh .php
</FilesMatch>
# Added explicitly, by default it was added by mod_php.conf
DirectoryIndex index.php
</IfModule>
И php5-wrapper.sh
сценарий выглядит так:
#!/bin/sh
#export PHPRC=/etc/php/fastcgi/
export PHP_FCGI_CHILDREN=5
export PHP_FCGI_MAX_REQUESTS=5000
exec /usr/bin/php-cgi5
В некоторых дистрибутивах php-fastcgi
это отдельный пакет от php-cgi
.
В какой-то момент вы можете пойти еще дальше и изменить рабочую модель Apache на многопоточную (поскольку PHP сейчас отсутствует) или переключиться на облегченный сервер, такой как nginx.