Apache жрет всю память

Обновлено: 06.07.2024

Примечание: Некоторые рекомендации, перечисленные в этом руководстве, могут не сработать в новых версиях системы Ubuntu. Возможно, в настройке вам также пригодятся статьи:

Apache – очень производительный веб-сервер. Чтобы упростить начальную настройку, он предлагает большое количество предварительно установленных модулей. Потому Apache отлично подходит для развертывания новых проектов – с его помощью можно быстро настроить надежную среду производства. Однако по мере роста сайта (и, соответственно, объема трафика) вы можете столкнуться с проблемами.

Это руководство поможет увеличить производительность Apache на вашем виртуальном сервере.

1: Отключите ненужные модули

В Ubuntu и Debian-подобных системах есть каталоги etc/apache2/mods-enabled и /etc/apache2/mods-available/. В последнем хранится список всех модулей, установленных на данном сервере. А в каталоге mods-enabled находятся модули, включенные в данный момент.

Ситуация по умолчанию может отличаться на каждом сервере. Предположим, что на сервере по умолчанию включено 17 модулей. Как правило, этого слишком много для среднестатистического приложения. Кроме того, довольно сложно сразу определить ненужные модули, которые можно отключить, так как отдельные модули являются зависимостями других.

Для начала рекомендуется сохранить список модулей, активных по умолчанию, чтобы в дальнейшем иметь возможность использовать его для восстановления стандартных параметров. Затем вы можете просто отключить все ненужные модули по одному, перезапуская Apache после отключения каждого модуля, чтобы убедиться, что в системе не возникло ошибок.

В Ubuntu и Debian модули отключаются с помощью этой команды:

sudo a2dismod autoindex

Отдельные модули потребляют очень много ресурсов; если вы не используете следующие модули, просто отключите их:

  • PHP
  • SSL
  • Rewrite
  • Perl
  • Python
  • Rack / Ruby / Passenger

Не все эти модули включены по умолчанию, однако ситуация индивидуальна для каждого сервера.

Примечание: Обычно Apache по умолчанию включает модуль rewrite, хотя его можно заменить модулем alias. Если вашему приложению подходит alias, отключите rewrite – это один из самых тяжелых модулей. Чтобы перейти с rewrite на alias, обратитесь к документации модуля. Даже если вы не сможете полностью отключить rewrite, вы сможете оптимизировать отдельные правила модуля.

Отключив модуль, перезапустите Apache, а затем проверьте лог ошибок, чтобы убедиться, что отключение модуля не навредило работе веб-сервера.

К примеру, вы можете получить такую ошибку:

Syntax error on line 6 of /etc/apache2/sites-enabled/site1:
Invalid command 'DAVLockDB', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.

Это значит, что отключенный модуль необходим для корректной работы веб-сервера. Включите его.

sudo a2enmod dav_fs

2: Переместите код

На сайтах PHP часто используется популярный модуль mod_php, а на сайтах ruby – Passenger Phusion (модули mod_rails или mod_rack).

Включение модуля mod_php может привести к тому, что на обслуживание одного дочернего процесса Apache будет требоваться 100 Мб RAM. Чем больше процессов Apache будет запущено на сервере, тем сложнее их будет обрабатывать.

Чтобы устранить эту проблему, можно использовать такие инструменты:

  • Для PHP можно установить php-fpm, который является отдельным процессом на основе протокола fastcgi.
  • В Python используйте uWSGI или gnunicorn
  • Для Rails используйте Unicorn.

Сначала запускается процесс для PHP, Python или Ruby, а затем Apache перенаправляет вызовы динамического контента на этот процесс вместо того, чтобы пытаться обработать его с помощью вложенного кода.

После удаления модуля mod_php размер процессов Apache может измениться с 90-120 Мб до всего 10 Мб. Весь динамический контент обслуживается всего двумя процессами на бэкэнде.

3: Ограничьте количество процессов Apache

Многие операционные системы используют конфигурации по умолчанию, которые не очень подходят маленьким серверам – 25 дочерних процессов. Если каждый дочерний процесс Apache требует 120 Мб RAM, то сервер будет тратить 3 Гб только на Apache.

Веб-браузер одного пользователя может запрашивать 4 элемента сайта за раз, а значит всего 7-8 человек способны перенагрузить сервер. Веб-страницы зависают или грузятся очень медленно.

Сервер часто поддерживает такие мертвые процессы Apache в активном состоянии, пытаясь обслужить запрашиваемый контент, а это снижает количество доступных процессов для обслуживания пользователей и объем памяти. В результате вы получаете плохой пользовательский опыт.

Определите, сколько RAM требуется вашему приложению и сколько памяти остается, а затем выделите большую часть оставшейся памяти для Apache.

К примеру, у вас есть три процесса php-fpm для обработки динамического контента, где каждый процесс использует до 70 Мб памяти, а также сервер MySQL, который берет до 120 Мб RAM. В результате получается, что приложение использует 330 Мб памяти. Если у вас маленький сервер, вы можете выделить для Apache около 150 Мб памяти.

Когда веб-сервер Apache запущен, запустите команду top. Она выводит множество полезной информации. Ниже приведен фрагмент ее результата:

top -bn 1
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
[. ] 15015 www-data 20 0 232m 9644 1900 S 0.0 1.6 0:00.02 apache2
15016 www-data 20 0 232m 9644 1900 S 0.0 1.6 0:00.01 apache2
15017 www-data 20 0 232m 9644 1900 S 0.0 1.6 0:00.02 apache2

Найдите значение в столбце RES для Apache (например, 9 644) и запишите его. На данный момент веб-сервер использует почти 10 Мб памяти. Если ограничить количество дочерних процессов Apache до 15, 150 Мб выделенной памяти будет вполне достаточно.

Отредактируйте конфигурационный файл Apache (в Ubuntu и Debian это /etc/apache2/apache2.confand) и найдите раздел mpm_prefork_module. Найдите строку MaxClients и введите 15, а затем сохраните файл и перезапустите веб-сервер.

<IfModule mpm_prefork_module>
StartServers 3
MinSpareServers 3
MaxSpareServers 5
MaxClients 30
MaxRequestsPerChild 0
</IfModule>

По умолчанию значение MaxClients может быть очень большим. Его нужно уменьшить.

Когда количество клиентов достигает предела, новые клиенты получат ошибку. Перезагрузив страницу, они смогут получить доступ к сайту.

Это звучит плохо, но все же лучше быстро закрыть эти соединения и сохранить нормальную работу сервера, чем ждать, пока сервер перестанет виснуть.

В некоторых ситуациях меньшее количество дочерних процессов помогает увеличить производительность сервера.

4: Рассмотрите альтернативные конфигурации mpm.

Часто в конфигурациях Apache используется предварительная настройка prefork mpm, которая считается безопасной и подходящей для PHP и других языков.

Если вы избавитесь от внешних модулей (PHP или Rails), вы можете рассмотреть worker MPM в качестве альтернативы.

Чтобы включить этот модуль, введите:

sudo apt-get install apache2-mpm-worker
The following packages will be REMOVED:
apache2-mpm-prefork libapache2-mod-php5
The following NEW packages will be installed:
apache2-mpm-worker
0 upgraded, 1 newly installed, 2 to remove and 2 not upgraded.
Need to get 2,284 B of archives.
After this operation, 8,718 kB disk space will be freed.
Do you want to continue [Y/n]?

Внимание! В Ubuntu при установке модуля worker удаляется prefork mpm, mod_php и другие несовместимые модули.

Попробуйте применить эти рекомендации в комплексе на своем сервере производства.

Сервер на DigitalOcean, конфигурация:

В панели сейчас 1 сайт на wordpress с трафиком 6к в сутки, шаблон apache дефолтный.
В сервисах:


Переодически падает служба mysql, недавно было добавлено еще 5 сайтов на wp (стоит просто движок и пару записей, без трафика).
При дефолтном шаблоне когда использование оперативки становится больше 900, опять таки падает мускл
Сервак грузится невероятно медленно(даже панелька секунд по 20 грузится), постоянно отдает ошибку о падении мускула.

Если сделать шаблон Apache php+cgi, то падения прекращаются, память расходуется в районе 600-700. но тогда переодически отдает 504 и скорость загрузки становится еще дольше. Процессор при этом шаблоне перестает грузиться, но память в половину меньше расхдуется.

Такой вопрос, это мои кривые руки ео так настроили, или что то не ладное с серваком, или просто нужно мощнее процессор?

Alex Connor Support team Posts: 1047 Joined: Fri Mar 21, 2014 7:49 am Contact:
Os: CentOS 7x Web: apache + nginx

Post by Alex Connor » Mon Mar 16, 2015 4:41 pm

awerdds Posts: 18 Joined: Wed Sep 04, 2013 4:26 pm

Post by awerdds » Mon Mar 16, 2015 4:46 pm

Увеличил ресурсы сервера (в 2 раза, тариф за 20), но процессор по прежнему занят на 70-90 процентов, смотрю по панельке digitalocean.
До увеличения посещаемости падений не было, хотя он и проработал неделю после такого скачка. skurudo VestaCP Team Posts: 8099 Joined: Fri Dec 26, 2014 2:23 pm Contact:

Post by skurudo » Mon Mar 16, 2015 4:53 pm

Когда ресурсов немного, то в конфигах имеет смысл быть скромнее - как пример:

MySQL Low-Memory Settings (typically found in /etc/mysql/my.cnf)
key_buffer = 16K
max_allowed_packet = 1M
thread_stack = 64K
table_cache = 4
sort_buffer = 64K
net_buffer_length = 2K

Apache 2 Low-Memory Settings (typically found at /etc/apache2/apache2.conf)
StartServers 1
MinSpareServers 3
MaxSpareServers 6
ServerLimit 24
MaxClients 24
MaxRequestsPerChild 3000

awerdds Posts: 18 Joined: Wed Sep 04, 2013 4:26 pm

Post by awerdds » Mon Mar 16, 2015 5:21 pm

Изменил как вы написали:


Памяти столько теперь не ест, но проц грузит, я правильно вписал надлеюсь?)

Apache использует слишком много памяти моего сервера, что приводит к сбою. У меня 4 ГБ оперативной памяти на сервере.

Я пытаюсь отрегулировать настройки Apache, чтобы улучшить его производительность, но я довольно нов в этом.

Я пытался следовать советам этой статьи, но я не уверен, как рассчитать вещи, и, кажется, я делаю это еще хуже.

Мой топ читает как:

Это правильно? Кроме того, какими должны быть значения для других параметров, таких как MinSpareServers, MaxSpareServers, MaxRequestsPerChild, StartServers, MinSpareThreads, MaxSpareThreads, ThreadsPerChild, MaxRequestsPerChild?

Кто-нибудь, пожалуйста, помогите мне?

Обновить

Я попробовал то, что вы, ребята, предложили. Это работает, но ненадолго. Через некоторое время после запуска сервера потребление памяти продолжает увеличиваться и никогда не снижается.

Я имею в виду, что после запуска сервера предположим, что в сети 500 пользователей. Сервер будет использовать X RAM. Через 2 часа после того, как те же 500 пользователей в сети, сервер будет использовать 10X RAM.

Есть ли способ избежать этого, или мне придется постоянно наблюдать за сервером и перезапускать его время от времени?

при добавлении обновлений к вашему вопросу, пожалуйста, отредактируйте оригинал, а не размещайте ответ. Это также имеет дополнительный бонус - снова поднимает вопрос в верхней части первой страницы.

Основным параметром для настройки использования памяти Apache будет MaxClients . Слишком низкое значение, и у вас закончатся свободные слоты для обслуживания клиентских запросов. Слишком много, и вы израсходуете всю свою оперативную память и начнете использовать пространство подкачки, что снизит производительность (это может выглядеть как сбой сервера).

Один из способов настройки MaxClients состоит в том, чтобы наблюдать за использованием памяти системы и при необходимости изменять настройки. Если сервер начинает менять местами, отредактируйте его. Если на сервере есть свободная память, поднимите ее.

Вы также можете оценить максимальное значение, посмотрев на использование памяти Apache. Запустите top и нажмите, M чтобы отсортировать процессы по памяти. Вы должны увидеть что-то вроде:

Вычтите столбцы RES и SHR, чтобы получить приблизительное использование памяти для каждого экземпляра Apache. В этом случае это около 16 МБ. Если у меня есть 4 ГБ ОЗУ и я хочу, чтобы 3 ГБ было использовано для Apache, мой параметр MaxClients будет примерно таким:

Итак, в этом случае я мог бы начать со значения 150-200, но я бы наблюдал за использованием памяти, и если бы он когда-нибудь начал приближаться к использованию подкачки, я бы уменьшил MaxClients на 10-20%. Также обратите внимание, что значение 3 ГБ является просто случайным примером. На серверах, работающих только под Apache, я мог бы использовать почти все 4 ГБ. В других случаях мне может потребоваться только 1 или 2 ГБ для Apache, а оставшиеся - для других приложений, системы или кеша.

Редактировать: отвечая на дополнительные вопросы

Как правило, нет никаких магических значений MaxClients или других параметров конфигурации Apache, которые сделают ваш сервер внезапно в два раза быстрее. Некоторые серверы будут работать нормально, независимо от того, равен MaxClients 10 или 1000. Существует два основных случая, когда параметр MaxClients «плохой»:

  • Слишком низкий : когда MaxClients слишком низок, вы попадете в ситуацию, когда все клиенты Apache используются, и новые соединения попадают в очередь в ожидании, когда следующий клиент станет доступным. Если вы включите Apache mod_status, вы сможете в реальном времени увидеть, сколько клиентов занято в любой момент времени. Это состояние относительно легко диагностировать, так как сайт будет работать медленно во время большого трафика, и все клиенты могут быть замечены в использовании.
  • Слишком высокий : когда MaxClients слишком высок, вы попадете в случае исчерпания всей оперативной памяти и начнете использовать своп. Когда это произойдет, производительность вашего сайта упадет практически до нуля (учитывайте разницу в скорости между ОЗУ и диском). Это состояние может быть гораздо сложнее наблюдать и диагностировать, так как сервер будет нормально работать с высокими значениями MaxClients, пока не будет наблюдаться всплеск трафика. Например, на сайте, который получает несколько обращений в час, я могу установить MaxClients равным 1000, что гораздо больше, чем поддерживается ОЗУ, но никогда не возникало проблем, поскольку Apache нужно было использовать только одного или двух клиентов одновременно. Я обнаружу проблему только тогда, когда получу всплеск трафика, увеличивая количество одновременно используемых клиентов, пока не исчерпается ОЗУ и не потребуется пространство подкачки.

Хотя я не знаю деталей вашего сервера, приложения или трафика, я могу предложить следующие значения конфигурации в качестве отправной точки. Попробуйте их, следите за загрузкой и использованием сервера и меняйте настройки по мере необходимости.

ecooler » Чт окт 02, 2008 4:57 pm

ls » Чт окт 02, 2008 6:09 pm

1. У вас скорее всего подключены практически все расширения PHP. Отключите ненужные, оставьте только те, которые нужны. Иначе он будет столько памяти жрать.

2. Используйте на сайтах PHP как CGI или как FastCGI (не как модуль apache), второе предпочтительнее.

ecooler » Вс окт 05, 2008 8:34 pm

оставил только:
- Zend Optimizer.so
- eAccelerator.so
- gd.so
- mbstring.so
- mysql.so
- openssl.so
- pcre.so
- session.so
- shmop.so
- standard.so
- xml.so
- zlib.so

на всех доменах включил PHP FastCGI, памяти вообще не осталось! Висит всего 9 доменов (wordpress + 1 joomla + 1 DLE)
Может это специальная политика для того, чтобы народ не засиживался на маленьких тарифах и покупал оперативку?

keeper » Вс окт 05, 2008 8:47 pm

ecooler писал(а): оставил только:
- Zend Optimizer.so
- eAccelerator.so
- gd.so
- mbstring.so
- mysql.so
- openssl.so
- pcre.so
- session.so
- shmop.so
- standard.so
- xml.so
- zlib.so

на всех доменах включил PHP FastCGI, памяти вообще не осталось! Висит всего 9 доменов (wordpress + 1 joomla + 1 DLE)
Может это специальная политика для того, чтобы народ не засиживался на маленьких тарифах и покупал оперативку?

Смотрите в сторону настройки eAccelerator скорее всего вы ему дали слишком много памяти для хранения кэша. За размер кэша отвечает параметр eaccelerator.shm_size Всех Благ и Удачи!

garry » Пн окт 06, 2008 9:17 am

ecooler писал(а): на всех доменах включил PHP FastCGI, памяти вообще не осталось! Висит всего 9 доменов (wordpress + 1 joomla + 1 DLE)
Может это специальная политика для того, чтобы народ не засиживался на маленьких тарифах и покупал оперативку?

А с чего вы взяли что такой набор должен работать на минимальном тарифе?

Я бы сказал что минимальный тариф вообще не подходит для веб-хостинга.

ecooler » Пн окт 06, 2008 10:52 am

eAccelerator - отключил, но ничего не изменилось!

А с чего вы взяли что такой набор должен работать на минимальном тарифе?
Я бы сказал что минимальный тариф вообще не подходит для веб-хостинга.

Может решится установкой Апача2 ?

keeper » Пн окт 06, 2008 5:56 pm

ecooler писал(а): eAccelerator - отключил, но ничего не изменилось!

А с чего вы взяли что такой набор должен работать на минимальном тарифе?
Я бы сказал что минимальный тариф вообще не подходит для веб-хостинга.

Может решится установкой Апача2 ?

Вы ничего не обновляли?

ecooler » Пн окт 06, 2008 7:32 pm

нет, ничего не обновлял.
может как раз стоит обновить?

keeper » Пн окт 06, 2008 10:33 pm

ecooler писал(а): нет, ничего не обновлял.
может как раз стоит обновить?

Если не обновляли, то пока и не стоит. Какой у вас шаблон ПО? И как именно ограничение в 8мб не работает, не помогает или не устанавливается?

garry » Вт окт 07, 2008 8:16 am

Значит вы включилои дполнительных расширений пхп


Это ограничение на пхпшный скрипт и никак не влияет на потребляемую апачем память.

keeper » Вт окт 07, 2008 1:20 pm

garry писал(а): Это ограничение на пхпшный скрипт и никак не влияет на потребляемую апачем память.

По-моему мы сейчас говорим про совершенно разные проблемы.

freddy » Чт окт 09, 2008 1:02 am

Скажите, а где посмотреть информацию, про эти все расширения PHP. Что и для чего каждый обозначает. (допустим если мне сайт вообще ненужен на сервере, а процессы htppd занимают каждый по 12 мб, 7 штук. Почитал, это из за модулей расширений этих. Можно ли их все отключить? (и без каких либо последствий нормальной работы сервера) кроме конечно же где знак замка.

garry » Чт окт 09, 2008 2:57 am

если php не исползуете как модуль можете его вообще отключить.
только имейте ввиду что могут отвалиться веб-почта, phpMyAdmin

Лена » Чт окт 09, 2008 7:13 am

garry писал(а): если php не исползуете как модуль можете его вообще отключить.
только имейте ввиду что могут отвалиться веб-почта, phpMyAdmin

openwebmail написан на Perl, у меня работает вообще без PHP.

freddy писал(а): допустим если мне сайт вообще ненужен на сервере, а процессы htppd занимают каждый по 12 мб, 7 штук.

freddy » Чт окт 09, 2008 10:37 am

garry писал(а): если php не исползуете как модуль можете его вообще отключить.

Вопрос в том, а как отключить?

garry писал(а): только имейте ввиду что могут отвалиться веб-почта, phpMyAdmin

Само собой. Спасибо.

Ещё вопрос, про PHP язык скриптов, который в менаджере, его то можно отключить?

Возможно у вас другая OS, у меня такого нет :) Сижу на FreeBSD.

Уж извеняюсь перед вами, за много вопросов ламерских, какими сервисами я не пользуюсь и не пользовался никогда, я в них не лезу, но всё-таки для освобождения памяти, и что бы не гонять их в пустую если они мне ненужны, их нужно собственно отключить..

Читайте также: