1 / 31

Производительность веб-приложений - инструменты и алгоритмы

Производительность веб-приложений - инструменты и алгоритмы. Сербул Александр руководитель направления контроля качества интеграции и внедрений 1С-Битрикс. AlexSerbul. О чем будем говорить. Поймем предметну ю область Что нас вынуждает беспокоиться? Что такое «быстро» и когда «тормозит»

anitra
Download Presentation

Производительность веб-приложений - инструменты и алгоритмы

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Производительность веб-приложений - инструменты и алгоритмы Сербул Александр руководитель направления контроля качества интеграции и внедрений 1С-Битрикс AlexSerbul

  2. О чем будем говорить Поймем предметную область Что нас вынуждает беспокоиться? Что такое «быстро» и когда «тормозит» Как выжить и не проиграть конкурентам

  3. С чего все началось Тим Бернерс-Ли, CERN* С 1989 года – WWW/HTTP/HTML Первый веб-сервер, первое фото в сети *ЦЕРН (CERN) — Европейская организация по ядерным исследованиям, крупнейшая в мире лаборатория физики высоких энергий.

  4. Законодатели современной моды Соцсети Видео хостинги Новостные сайты Корпоративные ресурсы, порталы

  5. Гонка против законов физики Гиганты … Часто в «облаках» … Теорема CAP и NoSQL CDN

  6. Гиганты - изнутри

  7. Архитектура Битрикс24 Dynamic Static Dynamic Static CDN CDN images (clients) images (clients) js, css js, css Elastic Load Balancing Elastic Load Balancing Web 1 Web 2 CloudWatch + AutoScaling Web N Web 1 Web 2 CloudWatch + AutoScaling Web N S3 … … local cache local cache local cache local cache local cache local cache mysqld mysqld master-master replication mysqld mysqld mysqld mysqld mysqld mysqld master-master replication mysqld mysqld mysqld mysqld mysqld mysqld control cache: memcached control cache: memcached master-master replication mysqld mysqld control cache: memcached control cache: memcached mysqld mysqld management, monitoring, backup control cache: memcached control cache: memcached

  8. Как выжить, как победить? Рва

  9. Как победить (или хотя бы выжить)? Понимать, что нужно Клиенту, «вжиться в него» Понять принципы создания высоконагруженных, масштабируемых приложений Научиться логировать метрики Научиться анализировать их (самое сложное)  Запустить процесс с обратной связью Свести анализ к маленькому набору индикаторов к ОДНОЙ ЗЕЛЕНОЙ ЛАМПОЧКЕ

  10. Что видит Клиент Начнем с «конца». Веб-сервер, кластер, NoSQL, кэши Смотрим на систему глазами Клиента Что такое – «тормозит»?? Производительность JS Раздача статики с разных доменов, точек CDN Latency, TCP/IP SSL SPDY?

  11. Так бывает частов client-side Список известных «безобразий» client-side Много людей… делают сайт А следит… один. Иногда это Клиент  А сроки спускают сверху иногда… Неоптимальные ресурсы: картинки, стили Куча файлов Google PageSpeed Не профилируют Профилируют, но т.к. тестов нет – ломают быстро  Алгоритмы – данных стало больше и … все легло (нанимайте опытных бойцов)

  12. Как меритьclient-side производительность Локальное тестирование – далеко не все. Клиенты – далеко. Cобираем js-meтрики Отправляем на сервер в Pinba Storage Пишем тесты nagios Рисуем в munin pinba_timer_add( array( 'jstimer'=>'responseEnd-responseStart', 'jshost'=>$jshost, 'jsip'=>$_SERVER["REMOTE_ADDR"], 'jsua'=>$_SERVER["HTTP_USER_AGENT"], ), (intval($_REQUEST["responseEnd"]) - intval($_REQUEST["responseStart"]))/1000 ); pinba_hostname_set( strval(substr($_REQUEST["host"],0,128)) ); pinba_script_name_set( strval(substr($script,0,128)) ); pinba_request_time_set($timef);

  13. Как меритьclient-side производительность Сбор client-side метрик pinba_timer_add( array( 'jstimer'=>'responseEnd-responseStart', 'jshost'=>$jshost, 'jsip'=>$_SERVER["REMOTE_ADDR"], 'jsua'=>$_SERVER["HTTP_USER_AGENT"], ), (intval($_REQUEST["responseEnd"]) - intval($_REQUEST["responseStart"]))/1000 ); pinba_hostname_set( strval(substr($_REQUEST["host"],0,128)) ); pinba_script_name_set( strval(substr($script,0,128)) ); pinba_request_time_set($timef);

  14. Как меритьclient-side производительность Анализ client-side метрик Рендер у Клиентов: select avg(round(timer_value/req_count,3)) from bx24_cps_js_performance_host where tag2_value='domContentLoadedEventStart-responseStart';  Рендер в браузерах: select substring(tag2_value,1,100) as ua, avg(round(timer_value/req_count,3)) as avg_time,count(*) from bx24_cps_js_performance_jstimer_ua where tag1_value='domContentLoadedEventStart-responseStart' group by ua order by count(*) desc limit 10; DNS-скорость: select tag2_value, avg(round(timer_value/req_count,3)) as avg_ip_time, count(*) from bx24_cps_js_performance_jstimer_ip where tag1_value='domainLookupEnd-domainLookupStart' group by tag2_value order by count(*) desc limit 20;  Топ коннектов: mysql> select tag2_value, avg(round(timer_value/req_count,3)) as avg_ip_time from bx24_cps_js_performance_jstimer_ip where tag1_value='connectEnd-connectStart' group by tag2_value order by avg_ip_timedesc limit 20; +-----------------+-----------+ |    176.60.226.9 | 7.6150000 | |  119.32.156.237 | 3.9420000 | |   79.133.133.97 | 3.2835000 | |    78.138.133.2 | 2.4352500 | |   195.38.55.178 | 1.9980000 |

  15. Как меритьclient-side производительность Аналогично можно мерить отдачу из CDN глазами Клиента «Распределенное» тестирование – очень полезно Можно фиксировать каждый N хит Ставьте тесты на пороги и рисуйте графики Клиент ждал больше секунды по причине тормозов веб-проекта – плохо, заметно!

  16. Как меритьclient-side производительность Научитесь БЫСТРО локализовывать источник ВНЕШНИХ проблем Проблемы провайдера Временные «тормоза» (congestion) сети Тормозит браузер клиента (играет в WOT в соседнем окне) Тормозит ТОЧНО не ваш веб-проект Скорость локализации – минуты. Автотесты – nagios/zabbix. Все пока понятно? Идем дальше.

  17. «Тормоза» на server-side • ТОЧНО ясно, что замедление – на server-side • Медленная отдача статики • Медленная генерация дин. контента • Разбираемся со статикой – обычно это проще: • сервер не «висел»? (логи) • бэкап никто не запускал?  • канал не забили? (логи, графики) • память/диски – объем и нагрузка (iostat) • на storage нет еще 50 проектов? • может убрать в CDN?

  18. «Тормоза» на server-side - статика • Классика: • вынести статику на отдельный домен (|| в браузере) • на отдельный сервер(ы) (быстрее отдача) • в CDN Сервер статики Rev. proxy server (Nginx) Стат. файлы Серверприложений Сервер баз данных RDBMS(MySQL) Appl. server (PHP-FPM)

  19. «Тормоза» на server-side - статика Подводные камни… Статика «проникает» на apache/php-fpm Забиваются тяжелые воркеры Все висит Пишем тест, локализуем: apache /server-status, apachetop

  20. Со статикой - разобрались Статика отдается максимально быстро Подкрутили буферы nginx Поставили быстрые диски Убрали все в CDN Создали тесты – покраснеют если «статика» сломается Осталось самое сложное и интересное.

  21. «Тормоза» на server-side - Приложение Балансировщики: DNS HAProxy AWS ELB Nginx… 200 ОК 500 Internal Server Error 502 Bad Gateway 503 Service Unavailable 504 Gateway Timeout

  22. «Тормоза» на server-side - Приложение Разберитесь в ошибках от upstream! Ошибки приложения – лог Очередь забиласьи чем: nginx – apache/php-fpm Служебная страничка – не шокируйте клиентов

  23. «Тормоза» на server-side - Приложение Типовая структура веб-приложения: Авторизовать клиента Отдать страницу(ы) из кэша или … Сделать выборку из БД Обработать данные Сформировать верстку и отдать клиенту Еще есть: XSLT, nginx SSI, js/ajax«фигачит» в БД напрямую… Страницы быстрые – главная, детальная Страницы «медленные» – выборки с фильтрами, поиск по параметрам Алгоритмы и V-данных: постраничка, шардинг.

  24. «Тормоза» на server-side – Кэш • Кэш – это «наркотик» • Главное – вовремя соскочить • Кэш: • Файлы • БД • Memcached (кластер) • Гранулированность, граф зависимостей • MySQL query cache – «to be or not to be»? ;-) • Выход «есть» – денормализация, NoSQL, async-очереди, «удобные» сценарии, шардинг

  25. «Тормоза» на server-side – БД • ACID– ближе к ЛСД • Что у вас за приложение? CAP «скушает»? • MySQL Replication (+semisync) • MySQL – «master-master» A/P • Galera/PerconaXtraDB Cluster/MariaDBGalera Cluster

  26. «Тормоза» на server-side – PHP • На примере PHP • pinbaтаймеры • php-fpm slow log • gdb, strace • Анализ логов приложения, распределения

  27. «Тормоза» на server-side – PHP gdb–p 123456 (gdb) source /src/php-5.3.19/.gdbinit (gdb) dump_btexecutor_globals.current_execute_data [0x0252d628] stemming() /var/www/html/bitrix/modules/search/tools/stemming.php:231 [0x0252bc78] stemming() /var/www/html/bitrix/modules/search/classes/mysql/search.php:1090 [0x02525ec8] StemIndex() /var/www/html/bitrix/modules/search/classes/general/search.php:1332 [0x025223f8] Index() /var/www/html/bitrix/modules/iblock/classes/general/iblockelement.php:4857 [0x0251b670] UpdateSearch() /var/www/html/bitrix/modules/iblock/classes/general/iblockelement.php:3295 [0x02519c40] Add() /var/www/html/bitrix/modules/crm/classes/general/crm_webdav_helper.php:486 [0x02514010] SaveEmailAttachment() /var/www/html/bitrix/modules/crm/classes/general/crm_email.php:867 [0x065c2030] EmailMessageAdd() [0x0250fcc8] call_user_func_array() /var/www/html/bitrix/modules/mail/classes/general/mail.php:2477 …

  28. «Тормоза» на server-side – PHP • XHProf (github.com/facebook/xhprof) • Почти не создает нагрузку на бою • Можно быстро найти корень проблемы • Полезно автоматически сохранятьтрейсы долгих страниц • … и анализировать их с разработчиками

  29. Итоги Алгоритмически страницы НЕ ДОЛЖНЫ тормозить Сброс кэша не должен приводить к коллапсу – денормализация Исследуйте «крайние» случаи А также, мониторьте среднегодовую температуру (+7) Все автоматизируйте и быстро, БЫСТРО, тестами определяйте текущее состояние веб-системы Принцип ОДНОЙ зеленой лампочки! Только системный подход, обратная связь Всем удачи!

  30. Производительность – это просто!

  31. Спасибо за внимание! Вопросы? Александр Сербулserbul@1c-bitrix.ruAlexSerbul

More Related