Я пытаюсь ускорить работу веб-сайта с большим количеством изображений, которые обслуживаются с отдельного поддомена static.example.com (тот же IP-адрес, что и www.)
Используя инструмент pingdom, вы заметили, что первые 5-6 запросов (на static.example.com) устанавливают полные соединения (DNS + SSL + Send + Wait + Receive + Connect).
Это как-то связано с настройкой prefork?
<IfModule mpm_prefork_module>
StartServers 20
MinSpareServers 20
MaxSpareServers 20
ServerLimit 150
MaxRequestWorkers 150
MaxConnectionsPerChild 10000
MaxRequestsPerChild 500
</IfModule>
Это машина на 4 ГБ с небольшим трафиком.
Средний размер apache:
ps aux | grep 'apache2' | awk '{print $ 6/1024;}' | awk '{avg + = ($ 1 - avg) / NR;} END {print avg "MB";}'
11.2921 МБ
MySQL примерно 500 МБ
KeepAlive On, MaxKeepAliveRequests 100, KeepAliveTimeout 5
Не знаю, как это решить. Помогает ли переход на модуль MPM-Event?
Вы должны переключиться на событие, да.
С prefork каждое соединение занимает 1 процесс. С точки зрения ЦП порождение процессов обходится дороже, чем создание новых потоков, если вы не «предварительно загружаете» их при запуске.
Но все же для обслуживания статического контента и этих спецификаций вы можете легко иметь httpd с событием mpm и легко разрешить 1000 потоков с несколькими процессами.
Пример:
StartServers 1
ServerLimit 5
MinSpareThreads 100
MaxSpareThreads 600
ThreadsPerChild 200
ThreadLimit 200
MaxRequestWorkers 10000
MaxConnectionsPerChild 10000000
Если вы используете prefork, потому что вы вынуждены, например, наличие модуля mod_php, который не является потокобезопасным, рассмотрите возможность перехода на mod_proxy_fcgi -> PHP-FPM.