geektimes

Basic performance. Заставим Drupal летать. Часть I

  • четверг, 20 ноября 2014 г. в 02:10:49
http://habrahabr.ru/post/243615/

Basic performance. Заставим Drupal летать. Чать I

Всем привет! Давайте поговорим о производительности популярной CMS/CMF Drupal, а именно — о 7-й версии.

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

В Drupal почти весь контент, который предназначен для посетителей — это сущности (entity), будь то ноды, пользователи или термины таксономии. Давайте с них и начнем.

Генерируем 1000 пользователей с помощью модуля devel_generate, который входит в devel и замеряем время их загрузки из БД.

image

Из примера видно, что эта операция занимает 30 секунд, что на самом деле не очень-то и хорошо. Что ж, как раз на этот случай в Drupal встроена собственная система для кеширования сущностей. Давайте посмотрим на неё в работе.

image

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

Скачиваем и включаем пару модулей (Entity cache и Memcache).

Модуль Entity cache позволяет кешировать стандартные сущности Drupal с использованием Cache API.
Memcache предоставляет возможность перенести заботу о кеше с MySQL на Memcached сервер, который хранит данные в оперативной памяти и соответственно быстрее с ними работает.

image

И — сходу успех, первый запуск выполняется всего за 2,8 секунды вместо 30. Идем дальше.

image

Повторный запуск, при котором данные достаются из кеша Memcached сервера выполняется за 0,4 секунды. Довольно неплохо в сравнении с кеширование по умолчанию в Drupal.

Однако, Memcached не единственный, подобные вещи может делать Redis.
Отключаем модуль Memcache и устанавливаем модуль Redis.

image

Первый запуск снова долгий, потому что кеш сперва сформировывается. В итоге — 2,2 секунды, пока это лучший результат.

image

0.35!

Таким образом, мы добились увеличения производительности в 13 раз в случае с первым запуском и в 5 раз в случае, когда данные берутся из кеша.

К сожалению, на хостинге не всегда есть возможность установить дополнительно сервер Memcached или Redis. В данном случае можно обойтись только модулем Entity cache.

image

Первый запрос исполняется довольно долго. Это опять же связано с генерацией кеша.

image

Зато все последующие выполняются меньше чем за секунду.

Отсюда можно сделать вывод, что модуль Entity cache — это must have модуль на любом Drupal сайте. Исходя из возможностей его можно дополнить Redis’ом.