После выпуска первой части нашей серии Appserver стало ясно, что в результате последовавших дискуссий на SitePoint и Reddit мы потрясли нерв для большого числа преданных читателей канала PHP. Я также быстро понял, что у этой новой (для PHP) технологии было много серьезных сомневающихся. Одним из наиболее острых ответов в дискуссиях было что-то вроде
«Благодаря тому, как pthreads внутренне работает с PHP, appserver никогда не может быть таким же быстрым, как обычный стек LEMP или даже LAMP».
Соревнование
Излишне говорить, что эти сомнительные и критические комментарии звучали как настоящий вызов. Я также был очень заинтересован в том, чтобы узнать, где будет находиться appserver, если он будет сравниваться с другой хорошо известной средой PHP.
Я решил использовать мой любимый фреймворк Symfony для сравнения. Это связано с тем, что appserver, как стандартный сервер приложений PHP, также предлагает немало важных функций приложений, аналогичных Symfony. Эти функции включают в себя контейнер внедрения зависимостей, объект запроса и ответа, метод сохранения и т. Д. Другими словами, он дает разработчику основы для создания приложения MVC, как это делает Symfony.
Для тех из вас, кто интересуется, что такое pthreads, это расширение PHP, используемое в ядре appserver, которое позволяет PHP создавать многопоточную серверную среду PHP. Если вы не уверены, что это значит или почему это вообще актуально, прочитайте предыдущий пост .
Стеки LEMP или LAMP являются обычным способом обслуживания приложений PHP в Linux.
-
L inux, Nginx ( E ngineX), M ySql и P HP -> LEMP
-
L inux, A pache, M ySQL и P HP -> LAMP
Подход
Основная идея этого поста — попытаться развеять критику по поводу того, что appserver работает плохо или, по крайней мере, намного хуже, чем фреймворк, такой как Symfony.
Тесты проводились с простыми программами, поэтому мы можем увидеть издержки, которые мы могли бы найти со стандартными программами, построенными поверх более крупной платформы. Я считаю, что накладные расходы типичны для любого профессионального PHP-приложения корпоративного уровня.
Мы будем тестировать 3 типа ответов.
- Прямой ответ «Hello World». (Страница Hello World)
- Ответ без доступа к базе данных, но с динамическими шаблонами (страница входа в систему) (Примечание: чтобы сделать тест честным, я удалил все содержимое страницы входа на демонстрационной странице входа Symfony, поэтому длина документа будет одинаковой.
- Страница с доступом к базе данных и шаблонами (Страница контента) — Примечание. Чтобы сделать эту часть справедливым сравнением, я добавил контент с первой страницы списка блогов Symfony в список элементов демонстрационного приложения appserver.
Сравнивать его с Symfony было относительно легко, поскольку Symfony также можно установить с демонстрационным приложением. Демонстрационное приложение appserver — это не блог, подобный Symfony, а своего рода список приложений. Опять же, я добавил то же самое содержимое со страницы индекса сообщений в блоге Symfony на страницу индекса списка «дел», так что размеры страниц были примерно одинаковыми.
Хотя я читал, что не стоит использовать демоверсию Symfony для бенчмаркинга, я не вижу реальной причины не делать этого. Обе «демонстрации» на самом деле не предназначены для бенчмаркинга, поэтому они имеют одинаковые недостатки. И в этом небольшом упражнении мы хотим увидеть, как appserver сравнивается с аналогичными типами ответов, будь то динамический контент, привет мир или страница входа.
Как ни странно, они оба используют Sqlite в качестве базы данных и доктрину для абстракции базы данных для своих демонстрационных приложений. Так что, как системы, они очень похожи в этом отношении.
Настройка
Я запускал тесты на стандартной виртуальной машине объемом 1 ГБ в Rackspace, поэтому тесты были максимально нейтральными.
Виртуальная машина была создана с помощью Puphpet для создания стека Debian Wheezy LESP (LESP, потому что мы используем SQLite). Позже я установил Symfony и appserver вручную. Поскольку веб-сервер appserver изначально принимал запросы через порт 9080, обе системы было легко запускать параллельно. Symfony использует php-fpm версии 5.6.16, а appserver использует собственную установленную версию php-fpm версии 5.6.15. Я использовал PHP5.6, а не PHP7 с Symfony, чтобы обеспечить справедливое сравнение между двумя системами и для правильного сравнения яблок с яблоками. В настоящее время Appserver поставляется только с PHP5.6; Версия 1.2.0 будет поставляться с PHP7 некоторое время к середине и концу этого года.
Чтобы протестировать две системы, я использовал Apache Bench, аналогично тестам, выполненным в этом репозитории тестов фреймворка PHP . Я также провел трехсекундный тест с 10 одновременными пользователями с одним отличием. Я использовал опцию keepalive «-k», которая является стандартом для HTTP-соединений во всех веб-браузерах.
Основной целью тестов было получить количество запросов в секунду.
Я не измерял использование памяти, так как это измерение на самом деле несопоставимо между стандартным PHP Symfony «ничего не поделился» и многопоточными средами приложения. Это было бы сравнение яблок с апельсинами.
Единственное, что я сделал для оптимизации обеих систем, — выполнил официальные шаги по развертыванию в производственной среде.
Результаты
Я разбил результаты на три набора ответов, как указано выше.
Приветственный мир Symfony
Страница входа Symfony
Страница содержимого Symfony
Страница Hello World на сервере приложений
Страница входа в appserver
Страница содержимого сервера приложений
График результатов
Symfony на сервере приложений
Чтобы увидеть, что произойдет, я также установил Symfony на сервер приложений. Вот результаты по сравнению со стеком LESP (LEMP в графике).
Вывод
Глядя на результаты appserver / Symfony и LEMP / Symfony, я бы сказал, что PHP-сервер в appserver имеет дополнительные издержки по сравнению с Nginx. Это довольно понятно. Честно говоря, я бы также предположил, что веб-сервер на основе PHP будет работать намного хуже, чем Nginx. Итак, с этими результатами я бы поблагодарил команду разработчиков за то, что они проделали довольно хорошую работу с их чистой реализацией веб-сервера на PHP.
Как можно видеть, когда в базу данных попадает база данных SQLite, это, безусловно, является узким местом. Оба значительно замедляются, когда появляются запросы к базе данных к SQLite.
Для страницы входа победит appserver. Для рендеринга страницы используются шаблоны HTML. Я бы сказал, что это может показать накладные расходы Twig на Symfony, несмотря на то, что Twig кеширует шаблоны.
Я также рискну сказать, что немного худший результат приложения appserver в мире находится в пределах издержек веб-сервера PHP, хотя результаты на самом деле весьма схожи, с Symfony только примерно на 16% быстрее. По сравнению с Symfony на appserver, результаты показывают, что комбинация веб-сервера appserver и сервера приложений в целом делает хорошую работу для ускорения обработки.
Я надеюсь, что этот короткий пост развеет недоверие некоторых людей к возможной производительности их приложений на appserver. Технология довольно новая, но все же очень интересная и, как мы видим, не так уж и плоха с точки зрения производительности.
Важное замечание: с помощью этих тестов мы не тестируем реальные преимущества или преимущества appserver. Как только приложение начинает становиться намного больше, когда необходимо постоянно (пере) загружать большее количество классов / сервисов в стандартной среде PHP, я считаю, что appserver начнет работать значительно лучше, чем Symfony. Я поработаю над тестированием этого аспекта позже, так как это реальная точка продажи для многопоточной среды PHP.
Надеюсь, некоторые из вас будут мотивированы, по крайней мере, дать appserver вращения. Приведенные выше результаты должны развеять любые проблемы с производительностью, и платформа appserver может только улучшиться с течением времени, особенно если большое количество разработчиков использует ее и испытывает на себе.
В следующих двух постах мы начнем пачкать руки и фактически разработаем приложение appsever. Оставайтесь с нами, чтобы узнать больше!