ZFConf 2010: Performance of Zend Framework Applications

3,083 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,083
On SlideShare
0
From Embeds
0
Number of Embeds
1,474
Actions
Shares
0
Downloads
71
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

ZFConf 2010: Performance of Zend Framework Applications

  1. 1. Zend Framework и производительность Александр Махомет [email_address] 27 марта 2010 г. Санкт-Петербург
  2. 2. О докладчике <ul><li>PHP разработчик </li></ul><ul><li>PHP 5 лет </li></ul><ul><li>Zend Framework 3 года </li></ul><ul><li>Создатель сообщества http://zendframework.ru </li></ul>
  3. 3. Производительность это мера скорости работы системы.
  4. 4. Что тестируем? - Hello World - Demo сайт
  5. 5. Приложение “ Hello World” <ul><li>zf create project </li></ul><ul><li>ZF ~ 67 файлов </li></ul><ul><li>Приложение ~ 5 файлов </li></ul><ul><li>Zend_Application, Zend_Loader, Zend_Controller, Zend_View, Zend_Layout, Zend_Filter </li></ul>
  6. 6. Приложение « Demo сайт » <ul><li>Базовые функции среднестатистического сайта </li></ul><ul><li>ZF ~ 1 80 файлов </li></ul><ul><li>Приложение ~ 34 файла </li></ul><ul><li>Zend_Application, Zend_Loader, Zend_Controller, Zend_View, Zend_Layout, Zend_Filter </li></ul><ul><li>Zend_Form, Zend_Db, Zend_Translate, Zend_Cache, Zend_Captcha, Zend_Session </li></ul>
  7. 7. Приложение « Demo сайт » <ul><li>Статьи и пользователи </li></ul><ul><li>Форма, 12 элементов </li></ul><ul><li>Блоки, 12 штук </li></ul><ul><li>Плагины для фронтконтроллера </li></ul><ul><li>Помощники действий </li></ul><ul><li>Правила маршрутизации </li></ul>
  8. 9. Где тестируем?
  9. 10. Параметры сервера <ul><li>Intel(R) Core(TM)2 Duo CPU E7200 @ 2.53GHz </li></ul><ul><li>2 GB RAM </li></ul><ul><li>Linux Debian lenny 8 </li></ul><ul><li>Apache 2.0 </li></ul><ul><li>PHP 5.2.6 mod_php + Suhosin Patch 0.9.6.2 </li></ul><ul><li>Mysql 5.0.51a </li></ul><ul><li>Загрузка ~ 0% </li></ul><ul><li>Zend Framework 1.10.2 (~ 2700 файлов ) </li></ul>
  10. 11. Как тестируем?
  11. 12. Утилиты для тестирования <ul><li>Apache Benchmark </li></ul><ul><li>Siege </li></ul><ul><li>Apache Jmeter </li></ul>
  12. 13. Apache Benchmark <ul><li>http://httpd.apache.org/docs/2.0/programs/ab.html </li></ul><ul><li>Простой консольный интерфейс </li></ul><ul><li>-с – количество одновременных пользователей </li></ul><ul><li>- n – количество запросов </li></ul>
  13. 14. <ul><li>Concurrency Level: 20 </li></ul><ul><li>Time taken for tests: 1.791 seconds </li></ul><ul><li>Complete requests: 300 </li></ul><ul><li>Total transferred: 384900 bytes </li></ul><ul><li>Requests per second: 167.55 [#/sec] (mean) </li></ul><ul><li>Time per request: 119.370 [ms] (mean) </li></ul><ul><li>Percentage of the requests served within a certain time (ms) </li></ul><ul><li>50% 108 </li></ul><ul><li>66% 111 </li></ul><ul><li>75% 114 </li></ul><ul><li>80% 115 </li></ul><ul><li>90% 122 </li></ul><ul><li>95% 150 </li></ul><ul><li>98% 200 </li></ul><ul><li>99% 225 </li></ul><ul><li>100% 364 (longest request) </li></ul>
  14. 15. Siege <ul><li>http://www.joedog.org/index/siege-home </li></ul><ul><li>Простой консольный интерфейс </li></ul><ul><li>Возможность тестировать по набору адресов </li></ul><ul><li>-с – количество одновременных пользователей </li></ul><ul><li>- r – количество запросов </li></ul>
  15. 16. <ul><li>Transactions: 100 hits </li></ul><ul><li>Availability: 100.00 % </li></ul><ul><li>Elapsed time: 9.10 secs </li></ul><ul><li>Data transferred: 0.10 MB </li></ul><ul><li>Response time: 0.12 secs </li></ul><ul><li>Transaction rate: 10.99 trans/sec </li></ul><ul><li>Throughput: 0.01 MB/sec </li></ul><ul><li>Concurrency: 1.37 </li></ul><ul><li>Successful transactions: 100 </li></ul><ul><li>Failed transactions: 0 </li></ul><ul><li>Longest transaction: 0.55 </li></ul><ul><li>Shortest transaction: 0.10 </li></ul>
  16. 17. Apache JMeter <ul><li>http://jakarta.apache.org/jmeter/ </li></ul><ul><li>Графический интерфейс </li></ul><ul><li>Широкие возможности </li></ul><ul><li>Тестирование по access логу </li></ul><ul><li>Различные планы тестирования </li></ul><ul><li>Генерация пауз, Pre-Processor и Post-Processor </li></ul><ul><li>Assertion механизм </li></ul><ul><li>Различные графические и текстовые отчеты </li></ul>
  17. 19. Наш выбор <ul><li>Apache Benchmark , как простой и эффективный инструмент </li></ul>
  18. 20. Xdebug <ul><li>Читабельные сообщения об ошибках </li></ul><ul><li>Трасировка приложения </li></ul><ul><li>Профилирование приложения </li></ul><ul><li>Отладка приложения </li></ul><ul><li>KCachegrind </li></ul><ul><li>WinCachegrind </li></ul><ul><li>Webgrind </li></ul>
  19. 21. Акселераторы PHP <ul><li>Сценарий работы PHP скрипта: </li></ul><ul><li>Чтение файла </li></ul><ul><li>Генерация байт - кода </li></ul><ul><li>Выполнение кода </li></ul><ul><li>Выдача результата </li></ul><ul><li>Задача акселератора – избавиться от шага 2, путем кеширования байт-кода в памяти или на диске. </li></ul>
  20. 22. APC <ul><li>http://pecl.php.net/package/apc </li></ul><ul><li>От команды PHP, возможно войдет в ядро PHP6 </li></ul><ul><li>Конфигурация APC 3.0.19 : </li></ul><ul><li>apc.enabled = 1; </li></ul><ul><li>apc.shm_size = 30; </li></ul><ul><li>apc.max_file_size =10M; </li></ul><ul><li>apc.stat = 1; </li></ul>
  21. 23. eAccelerator <ul><li>http://eaccelerator.net/ </li></ul><ul><li>Версия eAccelerator 0.9.6 </li></ul><ul><li>eaccelerator.shm_size=&quot;16&quot; </li></ul><ul><li>accelerator.enable=&quot;1&quot; </li></ul><ul><li>eaccelerator.optimizer=&quot;1&quot; </li></ul><ul><li>eaccelerator.check_mtime=&quot;1&quot; </li></ul><ul><li>eaccelerator.debug=&quot;0&quot; </li></ul><ul><li>eaccelerator.filter=&quot;&quot; </li></ul><ul><li>eaccelerator.shm_max=&quot;0&quot; </li></ul><ul><li>eaccelerator.shm_ttl=&quot;0&quot; </li></ul><ul><li>eaccelerator.shm_prune_period=&quot;0&quot; </li></ul><ul><li>eaccelerator.shm_only=&quot;0&quot; </li></ul><ul><li>eaccelerator.compress=&quot;1&quot; </li></ul><ul><li>eaccelerator.compress_level=&quot;9&quot; </li></ul>
  22. 24. Что замеряем <ul><li>Количество запросов в секунду </li></ul><ul><li>Apache Benchmark (10-30 тестов ) </li></ul><ul><li>ab -c 50 -n 500 </li></ul><ul><li>ab -c 50 -n 300 </li></ul><ul><li>Время выполнения скрипта ( сек ) </li></ul><ul><li>- PHP функция microtime (10 тестов) </li></ul><ul><li>Память выделяемая для скрипта (мб) </li></ul><ul><li>- PHP функция memory_get_peak_usage </li></ul>
  23. 25. Перейдем к замерам
  24. 26. <ul><li>Req/s = 57.69 </li></ul><ul><li>Time = 0.0286 </li></ul><ul><li>Memory = 4.483 </li></ul><ul><li>Zend_Application ~ 50% </li></ul><ul><li>Action_Helper_ViewRenderer ~ 13% </li></ul>Hello world
  25. 27. Hello world + Акселераторы <ul><li>Apc : </li></ul><ul><li>Req/s = 135.39 </li></ul><ul><li>Time = 0.0067 </li></ul><ul><li>Memory = 1.423 </li></ul><ul><li>eAccelerator: </li></ul><ul><li>Req/s = 138.73 </li></ul><ul><li>Time = 0.0065 </li></ul><ul><li>Memory = 1.194 </li></ul>
  26. 28. Demo сайт
  27. 29. Demo сайт <ul><li>Req/s = 12.99 </li></ul><ul><li>Time = 0.1265 </li></ul><ul><li>Memory = 14.946 </li></ul><ul><li>Zend_Application ~ 15% </li></ul>
  28. 30. <ul><li>Помощник вида action ~ 30% </li></ul><ul><li>Zend_Form ~ 16% </li></ul>
  29. 31. Замена action <ul><li>Помощник действия ActionStack : </li></ul><ul><li>Req/s = 1 3 . 28 </li></ul><ul><li>Time = 0.12647 </li></ul><ul><li>Memory = 14.791 </li></ul><ul><li>Свои помощники вида: </li></ul><ul><li>Req/s = 14.41 </li></ul><ul><li>Time = 0.1148 </li></ul><ul><li>Memory = 14.45 </li></ul><ul><li>~ на 10 % уменьшили нагрузку </li></ul>
  30. 32. Zend_Cache <ul><li>Поддержка различных бекэнд и фронтэнд адаптеров </li></ul><ul><li>Кэширование на уровне функций, классов, файлов, страниц </li></ul><ul><li>APC, Memcache, File, Sqlite и другие бэкенды </li></ul><ul><li>Кешированние метаданных Zend_Db_Table </li></ul><ul><li>Zend_Db_Table_Abstract::setDefaultMetadataCache </li></ul>
  31. 33. Кэшируем форму <ul><li>Req/s = 17.2 </li></ul><ul><li>Time = 0.0968 </li></ul><ul><li>Memory = 13.141 </li></ul><ul><li>ZF – 165 файлов </li></ul>
  32. 34. Отключаем ViewRenderer <ul><li>Zend_Layout и Zend_Form используют ViewRenderer </li></ul><ul><li>$front->setParam('noViewRenderer', true); </li></ul><ul><li>… </li></ul><ul><li>$view = new Zend_View(); </li></ul><ul><li>$view->setBasePath(APPLICATION_PATH . '/views/'); </li></ul><ul><li>$layout->setView($view); </li></ul><ul><li>… </li></ul><ul><li>$ form ->setView($v); </li></ul>
  33. 35. Результаты <ul><li>Req/s = 17. 9 </li></ul><ul><li>Time = 0.0959 </li></ul><ul><li>Memory = 12.551 </li></ul><ul><li>Небольшой прирост </li></ul>
  34. 36. Отключаем Zend_Application <ul><li>Заменяем самописным класом </li></ul><ul><li>Req/s = 18.5 </li></ul><ul><li>Time = 0.0923 </li></ul><ul><li>Memory = 11.999 </li></ul>
  35. 37. Все тесты Тест 1 Тест 2 Тест 3 Тест 4 Тест 5 Тест 6 Req/s 12.99 13.28 14.41 17.2 17.9 18.5 Time 0.1265 0.12647 0.1148 0.0968 0.0959 0.0923 Mem 14.946 14.791 14.45 13.141 12.551 11.999
  36. 38. Все тесты + APC Тест 1 Тест 2 Тест 3 Тест 4 Тест 5 Тест 6 Req/s 26.8575 27.295 32.5375 4 1 .95 4 2 . 01 4 2 . 95 Time 0.05986 0.05947 0.04891 0.03768 0.03 6 1 0.03 6 23 Mem 5.794 5.571 5.306 4.854 4.669 4.497
  37. 39. Все результаты <ul><li>Hello world </li></ul><ul><li>Reqs: 57.69 -> 138.73 (2.4 раза ) </li></ul><ul><li>Time: 0.286 -> 0.0065 (4.4 раза ) </li></ul><ul><li>Mem: 4.483 -> 1.194 (3.7 раз ) </li></ul><ul><li>Demo сайт без акселератора </li></ul><ul><li>Reqs: 12.29 -> 18.5 (1.4 раза ) </li></ul><ul><li>Time: 0. 1265 -> 0.092 1.3 раза ) </li></ul><ul><li>Mem: 14.946 -> 11.99 (1.24 раза ) </li></ul><ul><li>Demo сайт + акселератор </li></ul><ul><li>Reqs: 26 . 85 -> 42.95 (1. 5 раз ) </li></ul><ul><li>Time: 0. 0598 -> 0.0 36 1. 6 раз ) </li></ul><ul><li>Mem: 5 . 794 -> 4.497 (1. 3 раза ) </li></ul>
  38. 40. Итого <ul><li>Reqs: 12.29 -> 42.95 </li></ul><ul><li>Time: 0.12 -> 0.03 </li></ul><ul><li>Memory: 14.94 -> 4.49 </li></ul><ul><li>~ 3.5 раза </li></ul><ul><li>Используйте акселераторы </li></ul><ul><li>Кешируйте ресурсоемкие объекты </li></ul>
  39. 41. Сборка ZF в один файл <ul><li>Большое количество ресурсоемких операций по подключению файлов </li></ul><ul><li>http://isalmin.ru/zfp/ </li></ul><ul><li>Сборка нужных классов занимает 1.4 мегабайта </li></ul><ul><li>Time - 0.1095 sec ( Ранее 0.02 ) </li></ul><ul><li>Memory - 30.558 Mb (Ранее 4.48) </li></ul><ul><li>После включения APC </li></ul><ul><li>Time - 0.01235 sec (Ранее 0.006) </li></ul><ul><li>Memory - 9.963 Mb (1.423) </li></ul><ul><li>AB показал ухудшение до 85 запросов ( ~ 1.5 раза) </li></ul><ul><li>Вырезание require_once из ZF также не дало ощутимых результатов </li></ul>
  40. 42. Другие советы от ZF team <ul><li>Уменьшайте количество путей в include_path </li></ul><ul><li>Добавляйте путь к ZF первым </li></ul><ul><li>Используйте абсолютные пути вместо относительных </li></ul><ul><li>Используйте PluginLoader include file cache </li></ul><ul><li>Используйте быстрые адаптеры для языковых данных, array и csv адаптеры </li></ul><ul><li>Кешируйте а не считывайте файлы локализации и интернациолизации </li></ul><ul><li>Определяйте наследника Zend_View с часто используемыми функциями </li></ul><ul><li>Используйте render вместо partial </li></ul>
  41. 43. Замечания <ul><li>Быстрая, гибкая разработка важнее производительности. </li></ul><ul><li>Тесты теоритические, на реальных проектах все может быть по другому, только экспериментируя и наблюдая за реальным проектом можно существенно улучшить его производительность </li></ul><ul><li>То что работает в одном проекте может не работать в другом. </li></ul>
  42. 44. Спасибо за внимание
  43. 45. Контакты <ul><li>Александр Махомет </li></ul><ul><li>[email_address] </li></ul><ul><li>http://zendframework.ru </li></ul>

×