Скорость работы любого веб-сайта зависит от нескольких компонентов, каждый из которых требует оптимизации. При этом не стоит забывать, что прочность цепи равна прочности самого слабого её звена.
Большинство сайтов в мире работают на серверах под операционной системой из семейства Linux, поэтому в нашей статье мы будем говорить в первую очередь о Linux-системах. Разработчики сайтов на других ОС могут найти здесь мысли и идеи для самостоятельного изучения.
Рассмотрим основные компоненты, которые могут негативно влиять на быстродействие сайта:
-
Скорость передачи данных.
-
Качество исполняемого кода.
-
Аппаратное обеспечение (сервер).
-
Программное обеспечение сервера.
До начала любых работ по оптимизации производительности сайта, нам необходимо узнать основные системные показатели нашего сервера. Крайне важно знать такие метрики, как текущая загрузка процессора, количество занятого дискового пространства, использование оперативной памяти и разделов swap. Большинство из них можно увидеть при помощи системной программы "top", либо её аналога (более наглядного для начинающего пользователя) "htop".
Для начала нас интересует метрика «load average», представленная тремя числами. Эти числа отражают число блокирующих процессов в очереди на исполнение в определенный временной интервал, а именно 1 минута, 5 минут и 15 минут соответственно (в данном случае, блокирующий процесс — это процесс, который ожидает выделения ресурсов для продолжения работы). Высокие значения показателей «load average» (более единицы) говорят о том, что система не справляется с нагрузкой. Если речь идет о целевом сервере, работающем под высокой нагрузкой, то обычно полезно провести тонкую настройку операционной системы (сетевая подсистема, ограничение на количество одновременно открытых файлов и тому подобное). Высокая загрузка также может быть вызвана аппаратными проблемами, например, выходом из строя накопителя.
Скорость передачи данных.
-
Известно, что от запроса пользователем страницы сайта до её отображения в браузере, сигнал проходит длинный путь через интернет-провайдера, городские и межконтинентальные линии связи, до дата-центра с сервером и обратно. Соответственно, медленный канал на любом из этих этапов может стать причиной медленной работы сайта.
-
Для того, чтобы убедиться, что канал соответствует вашим требованиям, вы можете, например, залить на сервер файл большого объёма и скачать его на компьютер. Скорость скачивания должна быть максимально возможной для тарифного плана вашего интернет-провайдера.
Качество исполняемого кода.
-
Зачастую причиной проблем с производительностью сайта является исполняемый код. В рамках данной статьи мы не будем подробно разбирать данный вопрос. Однако, чем более оптимизирован и соответствует документации пользовательский код, расширяющий функционал системы (кастомный код) — тем меньше будет проблем с производительностью.
Аппаратное обеспечение.
-
Серверное «железо» также является важнейшим критерием хорошей производительности сайта. Кроме того, что все компоненты должны удовлетворять современным требованиям и быть в принципе работоспособными — необходимо так же настроить сервер на их оптимальную работу.
-
Кроме сетевого подключения, о котором говорилось выше, важнейшими компонентами сервера являются также Процессор, Оперативная память и Жесткий диск.
-
Для простых сайтов-визиток достаточно, зачастую, просто сервера с современными компонентами адекватной мощности. Однако, если это сайт с большим количеством посетителей (интернет-магазин, информационный портал и т.д.) — скорее всего, понадобится дополнительная настройка компонентов.
-
Жесткий диск
Например, жесткий диск. Для хорошей производительности он должен иметь не только достаточный объём и скорость передачи данных, но и подходящую файловую систему. Например, популярная журналируемая файловая система Ext3, которая была стандартной во многих дистрибутивах Linux, имеет проблемы с производительностью, при работе с большим количеством маленьких файлов.
Чтобы избежать проблем с производительностью Ext3, можно, например, провести оптимизацию файловой системы.
-
Оперативная память
Большой объём оперативной памяти также зачастую не является залогом быстродействия. Важным критерием является корректное распределение памяти между процессами и оптимальное использование «swap'a». Следует учесть, что Linux в отличие от Windows старается "забрать" всю оперативную память прежде чем использовать swap, поэтому если ваш Linux-сервер постоянно и активно использует swap – у вас проблемы.
Для определения возможных проблем, мы можем воспользоваться shell-программой «top», о которой говорилось ранее. С её помощью мы можем увидеть такие метрики, как: полный объём оперативной памяти, количество занятой и свободной оперативной памяти, а так же метрики потребления swap-памяти.
Также, при наличии проблем с производительностью, удобно будет воспользоваться программой «ps» (process status) с опциями "a", "u" и "x" (ps aux), которая выводит отчёт о работающих процессах. Полученный вывод предоставит список процессов, а также нужную информацию: потребление процессора, памяти, состояние и непосредственно информацию, идентифицирующую процесс (PID и команду).
Напоминаем, что такие команды как top или ps следует запускать "от рута" (sudo top или sudo ps соответственно), так как не-руту обычно не "видны" все процессы в системе.
Советуем также обратить внимание на такие возможности, как использование технологии «RAM Disk» (при необходимости ускорить скрипты, теряющие скорость на доступ к файловой системе) и настройка параметра «swappiness» в Linux-системах (если swap начинает заполняться до того, как использована вся оперативная память).
-
Процессор
Для начала выясним, какой процессор (или несколько) установлен на нашем сервере. В Ubuntu Linux мы можем воспользоваться командой «cat /proc/cpuinfo», которая покажет нам подробную информацию по каждому имеющемуся процессору. В остальных ОС для этого также можно найти подходящие аналоги.
Снова обратимся к данным, которые даёт нам вывод «top». Строка Cpu(s) содержит информацию о распределении процессорного времени. Первые два значения (“us” и “sy”) непосредственно отражают работу CPU по обработке процессов (пользовательских и системных процессов соответственно). Если они показывают значения 99-100% долгое время — это указывает на CPU как на узкое место.
Параметр "wa" говорит о простое, связанным с вводом/выводом. Выше 80% считается не совсем нормальным и явно указывает нам на то, что процессор проводит очень много времени в ожидании ввода/вывода (обычно это означает, что медленно работает или даже выходит из строя HDD или NIC).
Если же оборудование в порядке и ЦП имеет адекватные характеристики, - скорее всего, проблема в ПО. Проблемное приложение можно отловить с помощью указанной выше программы «ps» с опциями "a", "x", "f" и "u" (ps axfu).
Опытные разработчики также могут узнать, как нагружают процессор php-скрипты, воспользовавшись функцией «getrusage()».
Программное обеспечение сервера.
-
Типичным серверным ПО, при работе сайта на Linux-сервере, являются Apache, MySQL и PHP. Аналогично аппаратному обеспечению, обычная установка данного ПО, со стандартными параметрами не всегда является достаточной для корректной и быстрой работы сайта.
-
Существует множество вариантов настройки каждого элемента под конкретные нужды вашего сайта. Рассмотрим несколько общих вариантов:
-
Apache
Самым популярным рецептом является связка веб-сервера «Apache» с проксирующим сервером «nginx». В Интернете можно найти множество информации по этому поводу, в том числе конкретные действия, которые нужно произвести для стабильной работы этой связки. Скажем только, что в нашем случае надо уделить особое внимание отдаче nginx'ом статики (об этом так же можно найти множество статей и «how-to»). Дальнейшие поиски покажут и другие мелкие вещи, на которые стоит обратить внимание (например, целесообразность отключения режима «keepalive» при использовании данной связки, или решение возможных проблем, таких как ошибка «504 Gateway Timeout»).
Что же касается apache, как такового — рекомендуем обратить внимание на такую вещь, как «Количество процессов apache». Для настройки используются параметры ServerLimit и MaxClients в конфигурационном файле веб-сервера. Менять их следует с осторожностью и только при полной уверенности в необходимости такого изменения! Если значение ServerLimit установить намного выше необходимого, то свободная совместно используемая память будет занята (ассигнована, allocated). А если ServerLimit и MaxClients установить выше, чем система может обрабатывать, то Apache может не запуститься или система станет нестабильной.
-
MySQL
С оптимизацией и ускорением работы mysql-сервера также связано множество статей в Интернете. В рамках данной статьи мы можем посоветовать использование весьма полезной утилиты «mysqltuner», а также предложить вашему вниманию статью про кэширование в MySQL для высокопосещаемых проектов.
В двух словах, оптимизация MySQL заключается, в основном, в том чтобы выделить довольно много оперативной памяти для кэшей. Вся остальная оптимизация заключается в определении и рефакторинге “медленных” SQL-запросов конечного приложения (в этом вам поможет «slow query log»).
-
PHP
Первое, на что следует обратить внимание при разговоре о php в свете производительности — это то, что php должен быть установлен как модуль Apache, а не работать в режиме FastCGI. Правильная настройка php в режиме “fastcgi” требует дополнительной квалификации и опыта, поэтому начинающим разработчикам не рекомендуется её использовать – результат будет только хуже. Достаточно статей с подробной информацией о достоинствах и недостатках обоих вариантов можно найти в Интернете.
Теперь поговорим об акселераторах php. UMI.CMS поддерживает eAccelerator, XCache, APC (Alternative PHP Cache) и связующее программное обеспечение memcached, которое выполняет схожие функции. Каждый из этих механизмов повышает производительность php своим методом. Так, например, eAccelerator делает это за счет кэширования скомпилированного байт-кода, а memcached позволяет кэшировать данные в “быстром” хранилище. Для оптимальной работы конкретного сайта следует выбрать подходящий механизм и настроить его под ваши конкретные нужды.
В заключении хотим обратить ваше внимание на такие важные конфигурационные директивы php, как memory_limit и max_execution_time, отвечающие за память, выделенную на работу php-скриптов и за максимальное время их работы. Настоятельно рекомендуем ознакомиться с ними и настраивать php на вашем сервере под конкретные нужды вашего сайта.