Вот мой первый вопрос в SO.
У меня есть внутреннее приложение для моей компании, которое меня недавно попросили поддерживать. Приложения построены на PHP, и его довольно хорошо закодированный (OO, DB Abstraction, Smarty) ничего лишнего.
Проблема в приложениях - очень медленно.
Как мне узнать, что замедляет работу приложения? Я оптимизировал код, чтобы делать очень мало запросов к БД, поэтому я знаю, что это код PHP, который требует времени для выполнения. Мне нужны инструменты, которые могут мне в этом помочь, и нужно разработать стратегию проверки моего кода.
Я могу сам выполнить проверку / стратегию, но мне нужно больше инструментов PHP, чтобы выяснить, где мое приложение не работает.
Мысли?






Я недавно использовал Профилирование XDebug в похожей ситуации. Он выводит полный отчет о профиле, который можно прочитать с помощью многих распространенных приложений для профилирования (хотя я не могу дать вам список, я просто использовал тот, который поставляется со Slackware).
Мы используем Zend Development Environment (windows). Вчера мы устранили всплеск использования памяти, пройдя через отладчик при запуске Process Explorer, чтобы наблюдать за активностью памяти / процессора / диска при выполнении каждой строки.
Обозреватель процессов: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx.
ZDE включает базовый профилировщик производительности, который может отображать время, затраченное на каждый вызов функции во время запросов страницы.
Я использую комбинацию Тест PEAR и log4php.
В верхней части скриптов, которые я хочу профилировать, я создаю объект, который оборачивается вокруг объекта Benchmark_Timer. По всему коду я добавляю вызовы $object->setMarker("name");, особенно вокруг подозрительного кода.
Класс-оболочка имеет метод уничтожения, который берет информацию журнала и записывает ее в log4php. Я обычно отправляю это в системный журнал (многие серверы, объединяются в один файл журнала на одном сервере).
Во время отладки я могу смотреть файлы журнала и видеть, что мне нужно улучшить. Позже в процессе производства я могу анализировать файлы журналов и проводить анализ производительности.
Это не xdebug, но он всегда включен и дает мне возможность сравнивать любые два выполнения кода.
Как сказал Хуан, xDebug превосходен. Если вы используете Windows, WinCacheGrind позволит вам просматривать отчеты.
У меня есть машина с окнами, которую я могу найти с пользой
KCacheGrind (KDE / Linux) намного лучше.
Посмотрите презентацию Расмуса Лердорфа (создателя PHP). Он приводит несколько хороших примеров тестирования скорости PHP и то, что нужно искать, а также некоторые внутренние механизмы, которые могут замедлить работу. XDebug - один из инструментов, которые он использует. Он также очень твердо говорит о том, во сколько вы теряете производительность с фреймворками.
Видео: http://www.archive.org/details/simple_is_hard
Слайды (так как на видео плохо видно): http://talks.php.net/show/drupal08/1
Если это большая база кода, попробуйте apc, если вы еще этого не сделали.
http://pecl.php.net/package/APC
Привет. Если бы вы пересмотрели свой вопрос, вы бы оставили его как есть? Однако вы, вероятно, знаете, что делать, поэтому я оставлю это вам. Пожалуйста, включите соответствующие части вашей ссылки :)
phpED (http://www.nusphere.com/products/phped.htm) также предлагает отличную отладку и профилирование, а также возможность добавлять часы, точки останова и т. д. в код PHP. Интегрированный профилировщик напрямую предлагает разбивку по времени каждого вызова функции и метода класса из среды IDE. Плагины браузера также обеспечивают быструю интеграцию с Firefox или IE (т.е. посетите медленный URL-адрес в браузере, затем нажмите кнопку для профилирования или отладки).
Было очень полезно указать, где приложение работает медленно, чтобы сконцентрировать большую часть усилий по кодированию; и это позволяет избежать траты времени на оптимизацию и без того быстрого кода. Попробовав Zend и Eclipse, я убедился в простоте использования phpED.
Имейте в виду, что и Xdebug, и phpED (с DBG) потребуют установки дополнительного модуля PHP при отладке на веб-сервере. phpED также предлагает (не опробованный мной) вариант локальной отладки.
вы также можете попробовать использовать функцию register_tick_function в php. который сообщает php периодически вызывать определенную функцию в вашем коде. Затем вы можете отслеживать, какая функция в настоящее время выполняется, и количество времени между вызовами. тогда вы сможете увидеть, на что уходит больше всего времени. http://www.php.net/register_tick_function
Профиль Xdebug - определенно лучший вариант. Еще один совет - WincacheGrind хорош, но в последнее время не обновлялся. http://code.google.com/p/webgrind/ - в браузере может быть простой и быстрой альтернативой.
Впрочем, скорее всего, это все равно база данных. Проверьте соответствующие индексы и убедитесь, что у него достаточно памяти для кэширования как можно большего количества рабочих данных.
Есть много переменных, которые могут повлиять на производительность вашего приложения. Я рекомендую вам не сразу же предполагать, что проблема в PHP.
Во-первых, как вы обслуживаете PHP? Вы пробовали базовую оптимизацию Apache или самого IIS? Сервер занят обработкой других запросов? Вы воспользовались Ускоритель кода PHP? Один из способов проверить, является ли сервер вашим узким местом, - это попробовать запустить приложение на другом сервере.
Во-вторых, работает ли приложение в целом медленно или это влияет только на определенные страницы? Это может дать вам представление о том, с чего начать анализ производительности. Если все приложение работает медленно, проблема с большей вероятностью связана с базовым сервером / платформой или с глобальным запросом SQL, который является частью каждого запроса (например, аутентификация пользователя).
В-третьих, вы упомянули минимизацию количества SQL-запросов, но как насчет оптимизации существующих запросов? Если вы используете MySQL, пользуетесь ли вы преимуществами различных сильных сторон каждой системы хранения? Вы запускали ОБЪЯСНЯТЬ для своих наиболее важных запросов, чтобы убедиться, что они правильно проиндексированы? Это очень важно для запросов, обращающихся к большим таблицам; чем больше набор данных, тем сильнее вы заметите последствия плохой индексации. К счастью, есть много статей такой как этот, в которых объясняется, как использовать EXPLAIN.
В-четвертых, распространенной ошибкой является предположение, что ваш сервер базы данных будет автоматически использовать все ресурсы, доступные системе. Вы должны убедиться, что вы явно выделили достаточно ресурсов для своего приложения базы данных. В MySQL, например, вы захотите добавить пользовательские настройки (в свой файл my.cnf) для таких вещей, как буфер ключей, размер временной таблицы, параллелизм потоков, размер пула буферов innodb и т. д.
Если вы дважды проверили все вышеперечисленное и все еще не можете найти узкое место, профилировщик кода, такой как Xdebug, определенно может помочь. Лично я предпочитаю профилировщик Zend Studio, но он может быть не лучшим вариантом, если вы уже не пользуетесь остальной частью стека Zend Platform. Однако, по моему опыту, очень редко сам PHP является основной причиной низкой производительности. Часто профилировщик кода может помочь вам с большей точностью определить, какие запросы к БД виноваты.
Ты тоже прав. Я действительно посмотрел на то, что было с базой данных, и мне показалось, что все в порядке. Проблема была с Apache, но она была исправлена. Я также установлю программу кеширования кода операции. Но все же профилирование вашего приложения в любом случае помогает улучшить общее программирование.
Также вы можете использовать APD (Advanced PHP Debugger).
Заставить его работать довольно просто.
$ php apd-test.php
$ pprofp -l pprof.SOME_PID
Trace for /Users/martin/develop/php/apd-test/apd-test.php
Total Elapsed Time = 0.12
Total System Time = 0.01
Total User Time = 0.07
Real User System secs/ cumm
%Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name
--------------------------------------------------------------------------------------
71.3 0.06 0.06 0.05 0.05 0.01 0.01 10000 0.0000 0.0000 0 in_array
27.3 0.02 0.09 0.02 0.07 0.00 0.01 10000 0.0000 0.0000 0 my_test_function
1.5 0.03 0.03 0.00 0.00 0.00 0.00 1 0.0000 0.0000 0 apd_set_pprof_trace
0.0 0.00 0.12 0.00 0.07 0.00 0.01 1 0.0000 0.0000 0 main
Есть хороший учебник, как скомпилировать APD и сделать с его помощью профилирование: http://martinsikora.com/compiling-apd-for-php-54
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится.
Ответ - «Используйте APD». Дополнительная ссылка для тех, у кого проблемы с установкой.
Вы также можете взглянуть на HA прокси или любое другое решение для балансировки нагрузки, если снижение производительности вашего сервера является причиной медленной обработки приложения. сервер.
Несмотря на то, что я собираюсь использовать XDebug, я проверю Pear Benchmark. Я могу использовать это в других проектах