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

Как я могу оптимизировать Apache для использования 1 ГБ ОЗУ на моем веб-сайте?

Мой тарифный план VPS дает мне 1 ГБ оперативной памяти с возможностью увеличения до 2 ГБ. Конечно, я не могу использовать 2 ГБ или> 1 ГБ каждый день, поэтому я планирую оптимизировать производительность своего веб-сервера.

Среднее количество просмотров в час составляет около 8000-10000. Это означает около 2 соединений в секунду. Максимальное количество просмотров в час, достигнутое на данный момент, составляет около 60 000. Это означает около 16 подключений в секунду.

К сожалению, моя текущая конфигурация apache использует слишком много памяти (когда нет подключенных клиентов - обычно ночью - она ​​использует около 1 ГБ), поэтому я попытался настроить установку apache в соответствии со своими потребностями.

Я использую Ubuntu, ядро ​​2.6.18, с apache2-mpm-worker, так как я читал, что для него требуется меньше памяти, и fcgid (+ PHP). Это мой /etc/apache2/apache2.conf:

Timeout 45
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 10
<IfModule mpm_worker_module>
    StartServer 2
    MinSpareThreads 25
    MaxSpareThreads 75
    MaxClients 100
    MaxRequestsPerChild 0
</IfModule>

Это результат ps aux:

www-data  9547  0.0  0.3 423828  7268 ?        Sl   20:09   0:00 /usr/sbin/apache2 -k start
root     17714  0.0  0.1  76496  3712 ?        Ss   Feb05   0:00 /usr/sbin/apache2 -k start
www-data 17716  0.0  0.0  75560  2048 ?        S    Feb05   0:00 /usr/sbin/apache2 -k start
www-data 17746  0.0  0.1  76228  2384 ?        S    Feb05   0:00 /usr/sbin/apache2 -k start
www-data 20126  0.0  0.3 424852  7588 ?        Sl   19:24   0:02 /usr/sbin/apache2 -k start
www-data 24260  0.0  0.3 424852  7580 ?        Sl   19:42   0:01 /usr/sbin/apache2 -k start

а это ps aux для php5:

www-data  7461  2.9  2.2 142172 47048 ?        S    19:39   1:39 /usr/lib/cgi-bin/php5
www-data 23845  1.3  1.7 135744 35948 ?        S    20:17   0:15 /usr/lib/cgi-bin/php5
www-data 23900  2.0  1.7 136692 36760 ?        S    20:17   0:22 /usr/lib/cgi-bin/php5
www-data 27907  2.0  2.0 142272 43432 ?        S    20:00   0:43 /usr/lib/cgi-bin/php5
www-data 27909  2.5  1.9 138092 40036 ?        S    20:00   0:53 /usr/lib/cgi-bin/php5
www-data 27993  2.4  2.2 142336 47192 ?        S    20:01   0:50 /usr/lib/cgi-bin/php5
www-data 27999  1.8  1.4 135932 31100 ?        S    20:01   0:38 /usr/lib/cgi-bin/php5
www-data 28230  2.6  1.9 143436 39956 ?        S    20:01   0:54 /usr/lib/cgi-bin/php5
www-data 30708  3.1  2.2 142508 46528 ?        S    19:44   1:38 /usr/lib/cgi-bin/php5

Как видите, он использует много памяти. Как я могу уменьшить его до 1 ГБ ОЗУ?

PS: Я также думаю о переходе на nginx, если Apache не подходит для моих нужд ...

ОБНОВЛЕНИЕ 1: Я только что написал несколько строк о конфигурации fcgid, так как раньше не делал этого:

FcgidMaxRequestsPerProcess 1000
FcgidIdleTimeout 15
FcgidBusyTimeout 30
FcgidMaxProcessesPerClass 5

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

С другой стороны, уменьшение объема памяти, используемой CGI / PHP, будет во многом зависеть от ваших PHP-приложений, их эффективности по памяти, а также от того, какую версию PHP вы используете.

По крайней мере, вы можете изменить свой Apache следующим образом, что даст вам 2 процесса Apache с 50 потоками в штуке и гарантирует, что процессы Apache будут перезагружать себя каждые 10 тысяч подключений (не учитывают подключения keepalived), чтобы освободить Память Apache:

<IfModule mpm_worker_module>
    KeepAlive On
    MaxKeepAliveRequests    100
    KeepAliveTimeout        15
    StartServers            2
    ServerLimit             2
    MinSpareThreads         50
    MaxSpareThreads         100 
    ThreadLimit             100
    ThreadsPerChild         50
    MaxClients              100
    MaxRequestsPerChild     10000
</IfModule>

Затем вы можете посмотреть конфигурацию fcgid, чтобы убедиться, что вы ограничиваете количество активных процессов php, и убедитесь, что процессы перезагружаются, чтобы освободить неиспользуемую память. Однако это во многом зависит от вашего веб-приложения и шаблонов использования:

FcgidMaxRequestsPerProcess
FcgidIdleTimeout
FcgidBusyTimeout
FcgidMaxProcesses
FcgidMaxProcessesPerClass

Я решил, скомпилировав apache (используя prefork!) + PHP5 на моем VPS. Теперь он запускается с 50 дочерними процессами и занимает около 6-700 МБ.

Думаю, это лучшее, что я мог сделать: P