Как профилировать сервер Linux + Apache + Mysql + Php для повышения скорости?
У меня есть сервер с сильно модифицированным экземпляром MediaWiki, работающий на Ubuntu 8.04. Это немного вяло - я еще ничего не сделал для его оптимизации, поэтому я уверен, что есть много низко висящих фруктов, чтобы сделать его немного быстрее.
Но чтобы оптимизировать, нужно сначала измерить. Как узнать, какие компоненты (Apache, Php, Mysql) занимают больше всего времени для обслуживания страницы?
Что ж, когда вы профилируете что-либо подобное, чтобы найти узкое место, вам нужно исключать все одно за другим. Вам понадобится базовый уровень для сравнения. Если у вас установлен инструмент «ab» (он поставляется с apache), вы можете использовать его.
Чтобы получить базовый уровень, я рекомендую получить в среднем не менее пары сотен запросов. Вот пример:
$ ab -n 400 http://yousite/
Найдите в результатах строку «Время на запрос», она будет выглядеть примерно так:
Time per request: 96.031 [ms] (mean)
Обратите внимание на это время, так как это базовый уровень.
Чтобы исключить apache как виновника, создайте статическую страницу на своем сервере (просто сохраните html страницы, которую вы считаете медленной / вялой) и снова запустите ab против нее.
Добавьте PHP на статическую страницу. Необязательно, чтобы его было много, но он должен действительно работать. MediaWiki - довольно хороший код, поэтому, если в вашей системе есть узкое место PHP, мои деньги будут на фактическую загрузку стека PHP в память и повторное выполнение теста.
Посмотрите на три числа и посмотрите, где самый большой скачок между следующим шагом вверх. Я бы сделал ставку на то, что MySQL будет самым медленным из трех, но вполне может быть, что вы загружаете много изображений на страницу, которая замедляет общее время запроса, и в этом случае вы можете захотеть переосмыслить дизайн страница.
Мы запустили установку MediaWiki хорошего размера и быстро заметили, что MediaWiki очень выигрывает от наличия экземпляра memcached. В противном случае ему придется загружать множество языковых файлов и пользовательских данных при каждом запросе.
Также чрезвычайно важна конфигурация модуля prefork .. я резко уменьшил числа в конкретном разделе /etc/apache2/apache2.conf .. с тех пор у меня была большая задержка, когда страница зависала до минуты перед завершением загрузки ... трассировка с помощью модулей трассировки и разработки drupal, а также профилирование с помощью xdebug оставили меня в неведении .. Я настроил APC и модифицировал конфигурацию MYSQL, но на самом деле виновником были слишком маленькие значения для модуля prefork .. я поднял до умеренного И достаточного уровня, и теперь сервер вернулся к работе молниеносно. Следите за этими числами, если у вас необъяснимо высокое время выполнения страницы ....
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
# original values:
# MaxSpareServers 10
# MaxClients 150
# far too conservative experimental values:
# MaxSpareServers 5
# MaxClients 5
# good compromise:
MaxSpareServers 10
MaxClients 20
MaxRequestsPerChild 0
</IfModule>
Эти значения предназначены для среды виртуального хоста с 512 МБ ОЗУ + 256 МБ подкачки .. удачи в поиске оптимального варианта для вашего сервера;)
Зомбат и Фрэнк Фармер есть пара хороших предложений (мне нравится предложение медленного запроса) на Переполнение стека 697802. ab for apache также весьма полезен для тестирования вносимых вами изменений.