Мой тарифный план 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