Среднее значение zf2 + с высокой нагрузкой на простой странице

Я использую ZendFramework2 и Doctrine для запуска моего проекта. Мой процессор демонстрирует высокий уровень использования в запросах httpd. Я включил opcache для filecaching и memcache для Doctrine.

Любая идея, почему она может иметь среднюю нагрузку около 5.0? Я помещал die('test1') внутри onBootstrap из ZendFramework2 один раз, а в другое время я ставил die('test') раньше.

die('test2')
Zend\Mvc\Application::init(require 'config/application.config.php')->run();

Моя скамья Apache показывает, что когда фреймворк загружается без какого-либо подключения к базе данных или идет на любой контроллер, он в 5 раз медленнее. Почему zf2 действует так и что может быть возможным решением для нормализации его поведения?

[вопрос обновления]

Я профилировал с помощью Xdebug и Webgrind и обнаружил, что процессы, например, при загрузке, имеют высокий процент

(Приложение\Модуль- > onBootstrap)

на bootstrap У меня есть эта строка кодов

        //...
        $eventManager->attach(MvcEvent::EVENT_ROUTE, function($e) use ($blacklistForNormalUser, $auth) {
        $match = $e->getRouteMatch();

        // No route match, this is a 404
        if (!$match instanceof RouteMatch) {

            return;
        }

        // Route is whitelisted
        $name = $match->getMatchedRouteName();

        if (!in_array($name, $blacklistForNormalUser)  ) {
            return;
        }

        // User is authenticated
        if ($auth->hasIdentity() ) {
            return;
        }

        // Redirect to the user login page, as an example
        $router   = $e->getRouter();

        if(in_array($name, $blacklistForNormalUser)){

            $url      = $router->assemble(array(), array(
                'name' => 'user/login'
            ));

        }

        $response = $e->getResponse();
        $response->getHeaders()->addHeaderLine('Location', $url);
        $response->setStatusCode(302);

        return $response;
    }, -100);
    //...

другая высокая точка

Doctrine\ORM\Mapping\Driver\AnnotationDriver- > loadMetadataForClass

Ответ 1

Если система работает с 50 пользователями, но не 100. Тогда у вас может быть узкое место в вашей системе. Когда он проходит порог 50 пользователей, у него может быть нехватка некоторого ресурса, что приводит к быстрому росту нагрузки.

Чтение между строками, вы используете стек LAMP. Полезными командами являются:

top

Это дает вам очень много информации очень быстро. Посмотрите на верхние строки, чтобы увидеть в CPU (s) строку, на что процессоры тратят свое время. Очень высокий% wa может означать ожидание на диске IO из db.

Посмотрите на Mem: и Swap: rows, проверьте свой своп при низкой и высокой нагрузке. Если он значительно повысился, это может означать, что у вашей системы заканчивается память. Либо настройте приложение, либо добавьте больше оперативной памяти.

Посмотрите на выполняемые задачи, что показано наверху? httpd, возможно, mysql или какой-либо другой инструмент, например, резервное копирование и хаос.

Попробуйте научиться читать информацию в вашей системе. Есть много других команд, таких как "free -m" или "vmstat -n 5", которые могут стоить посмотреть.

Если ничего не помогает, то некоторые из инструментов Apache, которые могут вам помочь, mod_status Это покажет, какие запросы Apache обрабатывает в любой заданной время. Кроме того, добавив % msT к вашему варианту конфигурации commonlog в apache, он запустит время, затрачиваемое на обслуживание каждого запроса, и затем вы можете искать любые очень медленные скриптов в журналах.

После всего этого - если это все еще не имеет смысла или всего. Вернитесь с другим вопросом и добавьте более подробную информацию о своей системе.

....................

Спасибо за добавление дополнительной информации и хорошей работы с webgrind. Существует много перестановок кода, которые могут замедлить работу, но лучше всего начать с некоторой базовой настройки ZF2, которая является полезным навыком.

По умолчанию очень легко позволить ZF2 выполнять много работы по поиску файлов для просмотров и классов. Это значительно замедляет ZF2, поскольку он должен найти их по каждому запросу. Opcache также менее эффективен, если файлы не загружаются с использованием абсолютных путей по той же причине.

ZF2 имеет инструмент, помогающий с этим в vendor/bin, который генерирует списки классов и местоположений файлов. Для каждого модуля в папке вашего приложения.

php classmap_generator.php -l "..\..\modules\MODULENAME"

например.

php classmap_generator.php -l ../../module/Application
Creating class file map for library in '/zend/module/Application'...
Wrote classmap file to '/zend/module/Application/autoload_classmap.php'

Убедитесь, что classmap используется, добавив что-то подобное в ваши файлы Module.php:

public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\ClassMapAutoloader' => array(
            __DIR__ . '/autoload_classmap.php',
        ),
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
            ),
        ),
    );
}

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

Ответ 2

Не будет вдаваться в какие-либо детали структуры, просто общие php. Так хруст вопрос по частям.

Мой процессор показывает высокое использование запросов httpd.

Существуют ли какие-либо тяжелые вычисления, выполняющие или тяжелые запросы? Может быть, другие системные процессы слишком сильно используют процессор (беглые процессы)? Это может произойти, и настало время оптимизировать ваш код.

  • Проверьте код на наличие ошибок (избыток для циклов, вычислений и т.д.).
  • debug_backtrace - отличный способ показать трассировку выполнения
  • подвести итог - используйте debuger/profiler, например xcode. Есть A LOT и хорошие инструменты для анализа результатов с использованием инструментов графического интерфейса, таких как kcachegrind. Время выполнения, потребление памяти, логические деревья, графики и т.д. - все, что вам нужно изучить.

Я включил opcache для filecaching и memcache для доктрины

Выход php.net

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

Таким образом, ничего не связано с кэшированием файлов. Цитата говорит, что это очень понятно и красноречиво - это ускоряет работу php-части. Существует simmilar question (также связанный с zend), который рассказывает вам о различиях между memcache и memcache d; в любом случае это может быть средством правовой защиты, если ваша БД находится под большой нагрузкой или запросы медленные/тяжелые.

Итак, в чем причина среднего значения нагрузки около 5.0?

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

Я предлагаю использовать разумный подход и начинать с reverse engineer.

  • Вы уверены, что это только серверная сторона работает медленно? Любые внешние скрипты, большие изображения, шрифты?
  • Затем выполните шаги в первом списке.
  • Если все еще нет изменений, см. журналы (хотя, очень часто, нужно проверять).
  • Проверить конфигурацию системы - недавно переместился на nginx, способный обслуживать 21 раз больше запросов/секунду, а также статические файлы летают, потребление низкой памяти (не очень важно для процессора, я знаю)

my apache bench показывает, что когда платформа загружается без какого-либо подключения к базе данных или идет на любой контроллер, ее 5x медленнее

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

почему zf2 слишком тяжелый и что такое решение?

Я предполагаю, что это будет широко, вам просто нужно выбрать фреймворк, который вам нравится, учитывая плюсы и минусы, которые входят в комплект поставки.