Не так давно передо мной возникла задача подбора системы кэширования для небольшого (но постоянно расширяющего свой функционал) сайта на Drupal 7.
Сайт не является интернет-магазином, но и не визитка – словом, достаточно тяжелый для shared-хостинга. Производительности, полученной при использовании стандартного кэширования в базе данных, оказалось мало, поэтому я начал поиски среди contibuted-решений.

Кандидаты
На просторах drupal.org были обнаружены следующие модули:

Memcache
Модуль для интеграции Drupal c memcache.
Memcached – open-source система для кэширования объектов различных типов в оперативной памяти.

Достоинства:
+ легко масштабируется

Недостатки:
– не подойдет для использования на shared хостинге, так как нужно добавлять расширение в php и запускать демон memcached

Filecache
Модуль, позволяющий выполнять кэширование в системный файл, находящийся в папке с Drupal.

Достоинства:
+ пойдет на shared хостинге, так как не надо настраивать сервер

Недостатки:
– так как используется локальная файловая система, то масштабировать такое решение принципиально невозможно

APC
Этот модуль используется для интегрирования Drupal с Alternative PHP Cache. APC используется для кэширования и оптимизации кода PHP.

Достоинства:
+ развивающийся проект, более производительный, чем eaccelerator
+ можно использовать не только для кэширования кода, но и для кэширования статических страниц

Недостатки:
– не подойдет для использования на shared хостинге, так как нужно добавлять расширение в php

Mongo
MongoDB – NoSQL база данных, использование которой дает существенный выигрыш в производительности при кэшировании данных по сравнению со стандартной БД. Модули для интеграции mongo c drupal позволяют закэшировать страницы, блоки, содержимое полей, сессии пользователей… много чего!

Достоинства:
+ Активно развивающийся проект с богатым функционалом
+ Легко масштабируется

Недостатки:
– Не подойдет для shared-хостинга, так как требуется скачать, установить и запустить mongoDB

Redis
Redis – еще одно хранилище типа ключ-значение

Достоинства:
+ легко масштабируется

Недостатки:
– не подойдет для shared-хостинга, так как требуется скачать, установить и запустить
– в readme модуля написано, что его не рекомендуется использовать в production-версиях, так как он находится в стадии разработки

Authcache
Модуль, который заменяет стандартную систему кэширования Drupal. Более подробное описание смотрите на страницах документации модуля.

Достоинства:
+ интегрируется со всеми вышеперечисленными кэширующими модулями, предоставляющими стандартный интерфейс
+ дает возможность тонкой настройки объектов кэширования

Недостатки:
– для полноценного использования потенциала модуля при кэшировании темы или кастомных блоков необходимо лезть в код

Varnish
Модуль, дающий возможность интегрировать Drupal c Varnish. Varnish слушает 80 порт сервера и проверяет наличие на странице контента, подлежащего кэшированию. В случае, если имеется контент, требующий использования apache, Varnish перенаправляет запрос на порт, использующйся web-сервером.

Достоинства:
+ большой прирост производительности на статических страницах

Недостатки:
– необходима настройка apache – не подойдет на shared хостингах

Методика
Решения тестировались на сервере Ubuntu 10.04 с apache + mod_php, установленном на локальной виртуальной машине с одноядерным процессором и 1 Гб оперативной памяти. Сервер был сконфигурирован в соответствии с Запросы отправлялись с другой локальной виртуальной машины, таким образом, время соединения не влияет на результаты тестов, при том что нагрузка на тестирующую систему (Apache Benchmark) не влияет на тестирующую систему. Для отображения результатов был использован gnuplot.

Методика тестирования – три тура запросов, каждый по 1000 запросов, с конкуренцией между 1, 3, 10 запросами соответственно. Запросы посылалиcь на главную страницу сайта от имени анонимуса. На главной странице находилось 3 блока views, 2 меню среднего размера и, собственно, содержимое главной страницы, изобилующее картинками и javascript.

Кэширующие бэкэнды настраивались с примерно одинаковыми настройками – 64 Мб используемой ОЗУ, где это возможно. В качестве темы на сайте использовалась mothership.

Результаты
На последующих графиках изображены сравнительные результаты тестирования модулей при нагрузке в 3 конкурирующих запроса.

Drupal cache

Из графика отчетливо видно, что использование стандартного кэша позволяет ускорить работу вашего сайта (что очевидно) и то, что кэширование php с помощью APC более эффективно, нежели использование eAccelerator.

На этом графике показаны результаты использования стандартного алгоритма кэширования Drupal с различными бэкэндами. Memcache и Filecache ведут себя похожим образом, ненамного обгоняя вариант с использованием БД. Правда, memcache – едиственный вариант из изображенных на графике, который можно масштабировать, тем самым увеличивая производительность. Высокая производительность APC вызвана тем, что была в настройках была включена опция загрузки страницы вовсе без обращения к базе данных. Такое решение подойдет малым сайтам в пару статических страниц, которые находятся на небольшом сервере без необходимости в масштабировании.

На этом графике показаны результаты использования решений на основе NoSQL. Выводы делайте сами.

Authcache

В данном режиме стандартный алгоритм кэширования Drupal был заменен на Authcache. В результате мы получили существенный прирост производительности – около 30 миллисекунд на запрос. Важно отметить, что на shared хостинге реально получить такой результат, используя связку authcache + filecache.

Победители

Здесь были сведены решения, показавшие лучшие результаты, при этом позволяющие масштабирование. Как видим, Redis и Authcache обгоняют Mongo, но авторы модуля Redis не рекомендуют его использовать на production. Решение на основе Varnish оказалось самым быстрым, правда, дело в том, что Varnish позволяет кэшировать страницы только для анонимных пользователей и требует нетривиальной настройки.

Итоги
С учетом таких параметров как функциональность, стабильность, быстродействие, я бы порекомендовал:

Authcache и FileCache для shared хостингов. Таким образом можно получить всего около 15 ms на обработку запроса
APC для сжатия кода php, mongoDB/Varnish для крупных сайтов