Оптимизация
Создано Евгений Злобин в января 8, 2010
Сегодня мне хотелось бы затронуть тему оптимизации. Пройтись, так сказать, по основам, чтобы даже новичку было понятно в какую сторону копать. Необходимо, чтобы у вас был доступ к серверу через shell.
Какое программное обеспечение будет затронуто:
- apache
- nginx
- mysql
- lighttpd
- php
- memcached
- CentOS
– Статика-динамика
Для начала давайте разберемся с web-серверами. Разделим все дело на так называемые front-end и back-end или в просторечье на статику-динамику. Статику (CSS, картинки, JS) у нас будет отдавать какой-нибудь легкий и быстрый сервер, например nginx или lighttpd. А вот динамикой (php) займется привычный большинству Apache. Либо же это может быть Apache-Tomkat(если используется Java).
Преимущества подобной схемы можно понять на небольшом примере. Представьте себе, что к вашему web серверу apache необходимо обслужить порядка 1000 запросов одновременно, причем многие из этих клиентов подключены к медленным каналам связи. В случае использования apache мы получим 1000 процессов httpd на каждый из которых будет выделена оперативная память, и эта память не освободится до тех пор, пока клиент не получит запрошенный контент (в идеальном варианте конечно).
В случае схемы с применением front end/back end сервера получим значительную экономию системных ресурсов за счет того, что после того как пришел запрос клиента, nginx передает запрос apache и быстро получает ответ. В итоге apache после того как отдал ответ nginx освобождает память, далее с клиентом взаимодействует web сервер nginx, который как раз и написан для раздачи статического контента, большому количеству клиентов, при незначительном потреблении системных ресурсов.
– Нагрузка на сервер
Нагрузку на сервер можно определять командой top (вводим в командную строку). Данная команда выводит на экран нагрузку сервера в режиме реального времени. Загрузка каждого из процессоров выводится в виде десятичного числа (Например, 0.94 или 15.3).
На экран будет выведено, что-нибудь подобное этому:
top – 20:55:26 up 50 days, 9:50, 3 users, load average: 0.94, 0.76, 1.26
Tasks: 69 total, 1 running, 68 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.9% us, 0.2% sy, 0.0% ni, 76.6% id, 22.4% wa, 0.0% hi, 0.0% si
Mem: 1034692k total, 996636k used, 38056k free, 12484k buffers
Swap: 3068372k total, 176k used, 3068196k free, 933656k cached
Для того, чтобы посмотреть список процессов вводим команду ps.
– Нагрузка на MySQL
Обычно основная нагрузка ложится именно на сервер базы данных. Поэтому этот пункт стоит отметить особо. И уделить внимание оптимизации mysql-сервера тоже нужно особое. Подробнее о том, как подключиться к mysql через командную строку. Подробнее по оптимизации самого mysql можно почитать на этом блоге.
Зайдем через консоль в рабочую базу данных и пишем:
show full processlist;
либо
show processlist;
Данный запрос покажет какие потоки запущены в настоящий момент.
Эта команда очень полезна, если выдается сообщение об ошибке ‘too many connections’ (слишком много соединений) и необходимо выяснить, что происходит. MySQL резервирует одно дополнительное соединение для клиента с привилегией SUPER, чтобы у вас всегда была возможность войти в систему и произвести проверку (предполагается, что вы не станете раздавать эту привилегию всем своим пользователям).
* не забывайте ставить точку с запятой в конце каждой команды!
Также стоить обратить внимание на параметр конфигурации
-log-slow-queries
Если используется этот параметр, в лог-журнал будут записываться все медленные запросы. Вам останется только сделать выводы и найти пути решения.
Теперь разберемся с запросами. Находим через show processlist; или -log-slow-queries «грузящие» процессы и приступаем к оптимизации. Вариантов несколько:
- упрощение запросов;
- кэширование данных в оперативную память (например, memcached).
Еще один немаловажный момент – частые вставки (INSERT). При существенных нагрузках запросы типа INSERT могут не успевать обрабатываться и они будут попросту сбрасываться. Как вариант можно использовать INSERT DELAYED (запрос будует ставится в очередь на выполнение и когда ресурсы освободятся – запрос будет выполнен). Однако стоит отметить, что INSERT DELAYED не поддерживается InnoDB. Как правило INSERT DELAYED стоит использовать в таблицах, где хранится статистическая информация и запросы на INSERT превышают запросы на SELECT.
– Сессии
Сессии являются файловым хранилищем, поэтому обращение к ним следует минимизировать. И по возможности хранить данные в cookie. Только не забывайте о мерах безопасности, т.к. пользовательские куки легко подделать. Как вариант хранить данные сессий в том же memcached.
p.s. здесь не были затронуты такие темы, как шардинг, партиционирование, репликация. Каждая из них заслуживает отдельного внимания и проработки.



Интересно. И вроде как помогло. Тем более эта информация актуальна в связи с анонсом Гугла по поповоду влияния скорости загрузки страниц на выдачу.
Думаю, что самое главное в ускорении процессов – это кэширование данных, хорошая скорость и быстрый переход к другим страницам
Вобщем-то это наверное любой админ делает, но Вам спасибо, объединили всё в одну статейку.
Дома работаю в связке:nginx как основной сервев, apache для поддержки модов, которые не присущие первому. Напрашивается вопрос зачем такое мозготрепство, нагрузки ведь нема? Всегда нужно иметь 2 сервера на подхвате. А так вообще вникаю в пхп5, новые фишки. Кеш всегда был в цене, и статья это еще раз отмечает.
Никогда не углублялся в эти технические тонкости. А вполне возможно что зря.
Зря, нужно знать как работает железо, и как свести к минимум нагрузку на его, особенно если работаешь в этой сфере
Андрей Смирнов
Таки повидимому нужно знать как работает железо, и как свести к минимум нагрузку на его – а то плучается О на виходе.
Пока был занят оптимизацией работы сайта в качестве вебмастера на обычном хостинге.
Теперь можно дополнительно ускорить вывод сайта со стороны хостера.
Думаю в ближайшее время все эти вопросы придётся решать и мне.
P.s. Очень импонирует дизайн блога, особенно птичка… Улыбнуло.
Приписка в конце статьи многообещающа, поэтому ждем продолжения материала по оптимизации – шардинг, партиционирование и репликация должны быть написаны не менее интересно…
очень класние технические тонкости. спасибо
теперь будем надеяться,что можно дополнительно ускорить вывод сайта со стороны хосстера.
А ведь все действительно доходчиво и понятно написали, даже блондинкам понятно
Спасибо за советы. Буду знать, как нагрузка где распределена
Хорошо что,сессии являются файловым хранилищем, поэтому обращение к ним следует минимизировать.
Информативный и грамотный пост. Хотя я и мало понял из написанного выше, но это сугубо вследствии моей неопытности ) И еще мне очень понравился дизайн на сайте, а особенно тень от текста. Как вы ее сделали? Чесно говоря первый раз такое вижу!
Ну обычно оптимизацию со стороны хостинга выполняет сам хостер, а самому нужно разве что кеширование и оптимизировать графику. ИМХО
О теперь понятно о нагрузке на сервак, а то у меня сайт чёто постоянно глючил…