Magento и Zend Server

Евгений, 15.07.09

Эта статья была написана René Amirkhanian, Adrien Urban и Philippe Humeau из компании NBS System, хостинг-партнера Magento, и опубликована на французском WikiGento Blog.

Magento – это приложение PHP/Zend, интенсивно использующее ресурсы центрального процессора. С момента выхода версии 1.1.6, каждая новая версия включала в себя некоторые механизмы, призванные улучшать производительность платформы. Основной целью является уменьшение потребления ресурсов для данного e-магазина (попросту говоря – меньше процессорного времени), для того чтобы обслуживать большее количество пользователей на том же самом аппаратном обеспечении.

Одним из путей достижения лучшей производительности является оптимизация скорости генерации страниц PHP. На широко распространенных “LAMP” серверах обычно используется Apache с модулем mod_php, или, иногда, с модулем fast_cgi.

Zend (компания, поддерживающая PHP), выпустила специализированный продукт – Zend Server, который включает в себя стэк веб-приложений, и, помимо некоторых других возможностей, увеличивает скорость работы путем кэширования страниц, и реорганизации и ускорения байт-кода.

Apache в связке Zend Server являются альтернативой обычному Apache с mod-php для запуска Magento. Целью этого исследования является исследование и оценка улучшений производительности за счет использования данного ПО.

Большое спасибо Yoav Kutner (CTO компании Varien) за предоставленные заполненные тестовые каталоги для версий Magento 1.2 и 1.3. Также спасибо лаборатории Zend за помощь в конфигурации и тонкой настройке Zend Server, а также за полное объяснение механизма работы данного решения.

Используемые методы и инструменты

Бенчмарки делались с помощью утилиты siege (версия 2.66-2), с различным количеством одновременных потоков (5, 10, 20 and 40). Каждый поток открывал соединение с веб-сервером, запрашивал страницу и начинал все сначала после того, как страница была считана.

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

Проводились два типа тестов: первый – простой, мы просто загружали главную страницу в цикле, как можно быстрее.

Второй тест базировался на логах загрузки всех элементов броузером при посещении страницы (включая css, js, картинки). Так как загрузка одной страницы обычно вызывает загрузку нескольких элементов, отображаемое число будет значительно больше, чем количество страниц, реально видимых пользователю. На 18 страниц, просмотренных пользователем, приходится 91 скачанный элемент, среднее соотношение примерно 1 к 5.

Все результаты были получены на одном и том же “железе” и операционной системе, для целей тестирования. Обратное проксирование не использовалось. Во время запуска тестово был активен АРС кеш байт-кода. Это было стандартное окружение по умолчанию, без применения тонких настроек.

Железо:

2 процессора: Quad-Core AMD Opteron™ Processor 2376 (2.3GHz), 8GB RAM

Софт:

ОС: Linux (2.6.27.10-grsec) Debian (Lenny)
Веб-сервер: Apache2 (2.2.9-10+lenny2)
PHP (mod-php): mod-php5 (5.2.6.dfsg.1-1+lenny3) / php-apc (3.0.19-2)
PHP (Zend Server): zend-pe (1.0.0-1+b47) / mod-php5-zend-pe (5.2.9+b75)

Репозитории:

deb http://ftp.fr.debian.org/debian/ lenny main
deb http://security.debian.org/ lenny/updates main
deb http://volatile.debian.org/debian-volatile lenny/volatile main
deb http://repos.zend.com/deb/pe pe non-free

Тестирование разных версий Magento

Эти тесты были выполнены в каталоге с более чем 80 000 (далее – 80k) продуктов.

Графики показывают среднее количество запросов в секунду, успешно обработанных сервером во время пятиминутного теста.

Загрузка главной страницы

График 1 - Сравнение версий 1.2, 1.3 и 1.3 + flat каталог

Magento 1.3 собирает главную страницу гораздо быстрее, чем версия 1.2. Включенный Flat-каталог не сильно помогает в отображении главной страницы, и даже, похоже, замедляет процесс ее сборки при большой нагрузке. Производительность версии 1.3 в два раза выше чем 1.2 при небольших нагрузках, и на 33% больше при больших нагрузках.

При “стандартной” загрузке мы можем отметить 40%-ный прирост производительности в версии 1.3 по отношению к версии 1.2, по крайней мере для домашней страницы.

Полный цикл посещения

График показывает небольшое увеличение в версии 1.3 по сравнению с 1.2, механизм flat-каталога дает общее улучшение, которое существенно увеличивает производительность.

Резюмируя, можем привести такие значения:

Версия 1.2 -> 1.3 : +66%
Версия 1.3 -> 1.3+FС : +20%

Apache + mod-php по сравнению с Apache + Zend Server

Zend Server (далее ZS) предлагает несколько встроенных технологий для увеличения производительности приложений:

  • Zend Optimizer+ выполняет оптимизацию и кэширование байт-кода. Это увеличивает скорость PHP-приложений путем исключения процесса чтения скриптов с диска и их компилирования. Zend Optimizer+ запускается автоматически, и установка вашего приложения поверх Zend Server (ZS) – это всё, что вам нужно сделать чтобы насладиться его преимуществами. Во время тестов с ZS, кэш APC был деактивирован, так как Zend optimizer+ делает ту же работу.
  • Zend Page Cache позволяет кэшировать PHP страницы целиком. Кэширование страниц значительно увеличивает производительность веб-приложений, в то же время поддерживая динамические возможности с помощью системы правил кэширования, построенной на параметрах запросов и данных сессий пользователей. Кэширование страниц также имеет преимущество в том, что не требует никаких изменений в коде, и может быть настроено через интерфейс Zend Server. Только “pro”-версия включает в себя эту часть ПО, которая однозначно изменяет производительность к лучшему, в чем мы и убедимся через минуту.
  • Zend Data Cache это набор функций API, позволяющих разработчику сохранять и управлять данными (PHP строки, массивы и другие данные) и даже выдавать элементы либо из кэша диска, либо из кэша разделяемой памяти. Zend Data Cache позволяет настроить тонкое кэширование там, где полное кэширование страниц невозможно. Предлагаемый API легок в использовании в существующем коде, и во многих случаях разработчик может пропускать существующие участки кода, просто оборачивая их API кэширования. Эта возможность может быть использован путем незначительной доработки исходного кода ПО Varien.

Примечание: Zend Optimizer+ и Zend Data Cache доступны в бесплатной версии Zend Server, в то время как Zend Page Cache требует покупки лицензии Zend Server (полное сравнение Zend Server и Zend Server Community Edition доступно на http://www.zend.com/en/products/server/editions).

Настройка Zend Server для Magento

В бенчмарке были определены 2 правила кэширования:

Первое правило кэширует файлы JavaScript, которые динамически подключаются к каждому запросу Magento. Это простое правило привело к значительному улучшению времени отклика.

ZS - экран конфигурации стр.1

Второе правило кэширует все веб-страницы, посещенные пользователями, у которых нет товаров в корзине и нет истории посещений (когда корзина не пустая, либо сохранена история пользователя – нет смысла в кэшировании страницы). Как вы видите на картинке внизу, это было сделано с помощью проверки переменных $_SESSION и разделению по $_SERVER['REQUEST_URI'] в дополнение к QUERY_STRING.

ZS - экран конфигурации стр.2

Наконец, Zend Optimizer+ был включен для оптимизации и кэширования PHP байт-кода.

Как видите, Zend Page Cache оказался очень мощной функцией. Он требует тонкой и тщательной настройки, но взгляните результаты:

Главная страница / каталог из 80 000 продуктов

График 3 :сравнение между 1.3, 1.3 + FC, 1.3+ZS, 1.3+FC+ZS

Загрузка на главной странице не сильно повлияла на результаты, хотя при большой нагрузке на сервер (40 параллельных заросов), Zend Server (с или без page cage) немного лучше чем mod_php, но практически никакого реального влияния на тест. Выигрыш в 5% и даже меньше не является серьезным фактором и лежит в пределах статистической ошибки тестов.

Полное посещение / 80k продуктов

График 4 : Полное посещение, диаграмма сравнения 80K продуктов

График говорит сам за себя, при любой нагрузке Zend Server с Page Cache и включенным flat каталогом в Magento действительно улучшают производительность.

Сравнивая 1.3 + flat каталог с такой же конфигурацией, но с установленной бесплатной версией ZS вместо APC, наш сервер получил до 15% больше производительности.

Если же использовать полный Zend Server (с лицензией, в который включено кэширование страниц) на версии 1.3 с flat каталогом, сервер получил до 30% прироста производительности!

Mod PHP + APC -> ZS: +15%
Mod PHP + APC -> ZS с лицензией: +30%

Время отклика

Главная страница / 80k продуктов

График 5 : время загрузки

Этот график показывает время отклика на домашней странице во время загрузки. При значительной нагрузке, ZS дал до 35% сокращения времени отклика во время загрузки.

Полное посещение / 80k продуктов

График 6 : диаграмма сравнения времени загрузки при полном посещении

Кэширование страниц сокращает время отклика во время полного посещения сайта даже под очень тяжелой нагрузкой. Выгоды от использования кэширования страниц в любом случае существенны, даже при стандартной загрузке. Можем засчитать 35%-ный выигрыш при серьезной загрузке в случае использования любой (бесплатной или лицензированной) версии ZS.

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

Таким образом, запомните, что выгоды механизма кэширования страниц в ZS будут становиться все менее эффективными по мере роста загрузки сервера. При обычной нагрузке, алгоритм Page Cache дал уменьшение времени загрузки до примерно 40%.

Дополнительный технические детали тестов

Тестовые данные

Все тесты были проведены с готовыми тестовыми данными (предоставленными компанией Varien)

image

Описание тестов

Тест главной страницы

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

Тест полного посещения

У нас есть список запросов, основанный на посещении сайта с помощью реального браузера. Каждый одновременный поток загружает каждый элемент один за другим так быстро как только сможет, и перегружается после удаления его cookies.

Список запрашиваемых страниц для базы данных из 80k продуктов (с информацией POST где возможно) здесь.

Планируемые тесты

Mage компилятор

Во время подготовки этих тестов, вышла версия 1.3.1.1, включающая модуль Mage_Compiler, и сразу за ней готовилась к выпуску версия 1.3.1.2, так что мы просто не успели включить некоторые тесты в этот обзор. Просто предположим, что весь механизм предназначен для уменьшения работы по вводу-выводу, с помощью включения большинства классов в несколько сборных файлов. Если ваши сервера использовали для работы в основном RAM, вы не ощутите значительного прогресса в производительности. Однако, если в серверах мало RAM, либо они в основном используют диски, вы убедитесь в выгодах использования данных возможностей!

Nginx

У нас не было достаточно времени для оценки результатов тестов с Nginx + PHP. Это решение давало результаты, промежуточные между Magento 1.3 + FC и Magento 1.3 + Zend Server (без Page cache). Так что эта комбинация достигала средних значений производительности, в отличие от Magento 1.3 + Zend Server или еще более продвинутых вариантов.

Выводы

Во-первых, позвольте заявить, что никакие электроны не были заряжены и не пострадали во время этих тестов. Возможно один или два СТО были вынуждены пострадать от кофейных вливаний, но чего только не сделаешь ради лучшего будущего E-commerce!

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

При использовании лицензированной версии ZS, механизм Page Cache очень эффективен, и может сократить используемые ресурсы железа на 25% для поддержания тех же возможностей хостинга. В некоторых случаях это может обернуться прямым сокращением расходов на сервера.

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

И последнее – настраивая сервер со всеми оптимизациями и используя приведенные рекомендации, на базе dual AMD 2376 с 8 Gb RAM, использующий ZS и кэширование страниц, вы сможете достичь уровня до 40 000 уникальных посетителей в день, что соответствует 2 500 одновременных сессий Magento при максимальной загрузке (при вынесении базы данных на отдельный сервер, и использовании обратного прокси типа Squid или Varnish перед веб-сервером).

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

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

graph71

Эта статья доступна также на английском и французском языке.

Creative Commons Attribution-Noncommercial-Share Alike 3.0 License Права: Оригинал этой статьи опубликован под лицензией Creative Commons “Attribution-Noncommercial-Share Alike 3.0″ License. Только три компании (NBS System, Zend и Varien) могут использовать её в коммерческих целях.

Написать комментарий