Методы анализа и устранения нагрузки Mysql

Быстрый старт

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

Вот что необходимо сделать в первую очередь:

  • просмотрите логи на наличие очевидных ошибок или явных причин нагрузки;
  • поищите простые ошибки - бесконечная рекурсия, неработающие ограничители перебора списка и т.д.;
  • отключите ненужные разделы сайта, например, забытый форум;
  • создайте robots.txt, ограничивающий поисковых роботов;
  • воспользуйтесь командой time для определения времени выполнения скриптов на платном хостинге;
  • примените на сайте простейшее кэширование страниц;
  • оптимизируйте запросы SQL и создайте индексы для таблиц.

Рассмотрим теперь анализ и оптимизацию сайта более подробно.

Анализ нагрузки

Для анализа нагрузки существует несколько методов: изучение логов, аудит кода, профилирование.

Изучение логов позволяет провести статистическое исследование того, какие запросы чаще всего используются при обращении к сайту, кто именно больше всего скачивает страниц и к каким страницам вообще есть обращения. Для получения приблизительной статистики по логу можно было бы воспользоваться средствами вроде Webalizer и AWStats, но они предназначены для сбора более долговременной статистики посещаемости сайта, поэтому для более детального анализа в любом случае придётся просматривать логи вручную.

Посмотрите данные о нагрузке, приведённые в панели управления и сравните, чем отличаются участки лога во время небольшой нагрузки от участков с высокой или критической нагрузкой. Обычно становится ясно видно, что именно изменяется: либо приходит робот и начинает выкачивать сайт, либо на сайт начинает заходить много посетителей, либо в это время в логах присутствуют какие-то ошибки, либо чаще происходят обращения к какому-либо скрипту, который может требовать ресурсы и т. д.

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

Профилирование - это изучение времени выполнения небольших участков кода, подсчёт количества вызовов функций. Это делается для того, чтобы выявить те части скрипта, которые в первую очередь нуждаются в оптимизации. Для изучения времени выполнения какой-либо функции можно выставить снятие данных таймера до и после её вызова и вычислить разницу между засечками.

Команда time - определение процессорного времени, затраченного на выполнение скрипта

Команда time позволяет определить, сколько реального и сколько процессорного времени было затрачено на выполнение программы. Для того, чтобы определить время выполнения конкретного скрипта, нужно задать команду его запуска в качестве аргумента команде time:

$ time /usr/local/php4/bin/php-cgi -f test.php

real    0m8.850s
user    0m8.677s
sys     0m0.156s

Если нужно имитировать работу скрипта при передаче ему какого-либо запроса, можно в его начале присвоить нужные значения массивам $_GET или $_POST.

Устранение нагрузки

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

Кэширование данных

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

В Google можно найти много статей, посвящённых кэшированию в php.

Ограничение скорости отдачи страниц

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

Простые ошибки

Исследуйте код на наличие простых ошибок. Бесконечная рекурсия SSI. Условие, которое должно было бы ограничивать перебор миллиона вариантов, но не ограничивает из-за ошибки. Вечный редирект mod_rewrite. И так далее.

И загляните в error_log, возможно, проблема очевидно отражена именно там.

Избавление от ненужного кода

Посмотрите, нет ли в ваших скриптах ненужного старого кода, который, например, использовался когда-то для ведения статистики, которую так никто и не стал смотреть (статистику всё равно лучше собирать с помощью Google Analytics), или который пытается просчитать и вывести данные, которых уже нет, или которые морально устарели. Бывает, в каком-нибудь скрипте вызывается функция, которая получает и формирует какие-либо данные, но эти данные впоследствии нигде не выводятся. Проверьте, весь ли код является полезным на вашем сайте.

Может быть, на сайте есть забытый форум, которым пользуются только спамеры и поисковые роботы? Возможно, такой форум можно будет безболезненно удалить и заменить его блогом. Практика показывает, что даже редко обновляемый блог лучше и интереснее для посетителей, чем потерянный форум.

Оптимизация и рефакторинг кода

Если движок был написан быстро, то наверняка не все использованные алгоритмы идеальны. Возможно, какие-то части работают довольно медленно, потому что были реализованы первым пришедшим в голову способом. Возможно, то же самое можно сделать проще и быстрее, нужно просто придумать более совершенный алгоритм. Или вы узнали о том, что существует специальная функция, которая за один вызов делает всё то, для чего в движке используется несколько вложенных циклов обработки трёхмерных массивов.

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

Особое внимание стоит уделить оптимизации запросов SQL, созданию индексов в базе. Язык SQL может быть очень эффективным для получения данных. Иногда одним сложным SQL-запросом можно заменить кусок из нескольких страниц кода на php, обрабатывающим данные, полученные простым запросом. И это будет гораздо эффективнее, потому что sql-сервер предназначен для выборки и обработки табличных данных, а php - нет.

На нашем сайте есть отдельная страница, целиком посвящённая оптимизации MySQL.

Ограничение поисковых роботов

Не все разделы сайта нуждаются в индексации поисковыми системами. В самом деле, постарайтесь оценить для каждого раздела насыщенность информацией, которую бы вы хотели видеть в выдаче поисковика. Например, содержание гостевой книги или небольшого форума, прицепленного к сайту, вряд ли будет настолько же интересно, как тематические статьи, размещённые в специализированном разделе. Части сайта с низкой концентрацией полезной информации можно (и даже полезно!) исключить из индексации. В конце концов, самые интересные посты с форума всегда можно перенести в постоянный раздел сайта со статьями.

Индексация разделов сайта регулируется с помощью файла robots.txt, подробно о котором написано на сайте robotstxt.org.ru.

Создание структуры сайта

Посмотрите на сайт и составьте карту всей информации, которая на нём находится. Возможно, сразу окажется, что нужно что-то реорганизовать, переместить в более подходящий раздел, просто сгруппировать. Обратите внимание на навигацию, на ссылки, по которым доступна информация: все ли они сгенерированы по одинаковому принципу? Возможно, одни и те же страницы доступны по нескольким разным ссылкам, и все они используются для навигации. Такие ссылки лишь "раздувают" сайт повторяющейся информацией, и уникальность информации на страницу сайта падает. При этом поисковики, качалки, да и просто браузеры пользователей считают такие страницы разными и выкачивают дубли, что, естественно, повышает нагрузку на сайт.

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

Тоже выход

Впрочем, всё это может быть вам не интересно. Иногда проще купить тариф с большими лимитами или сервер помощнее и не заботиться об оптимизации. Тоже выход.

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

Успехов в развитии!