310 likes | 634 Views
Производительность веб-приложений - инструменты и алгоритмы. Сербул Александр руководитель направления контроля качества интеграции и внедрений 1С-Битрикс. AlexSerbul. О чем будем говорить. Поймем предметну ю область Что нас вынуждает беспокоиться? Что такое «быстро» и когда «тормозит»
E N D
Производительность веб-приложений - инструменты и алгоритмы Сербул Александр руководитель направления контроля качества интеграции и внедрений 1С-Битрикс AlexSerbul
О чем будем говорить Поймем предметную область Что нас вынуждает беспокоиться? Что такое «быстро» и когда «тормозит» Как выжить и не проиграть конкурентам
С чего все началось Тим Бернерс-Ли, CERN* С 1989 года – WWW/HTTP/HTML Первый веб-сервер, первое фото в сети *ЦЕРН (CERN) — Европейская организация по ядерным исследованиям, крупнейшая в мире лаборатория физики высоких энергий.
Законодатели современной моды Соцсети Видео хостинги Новостные сайты Корпоративные ресурсы, порталы
Гонка против законов физики Гиганты … Часто в «облаках» … Теорема CAP и NoSQL CDN
Архитектура Битрикс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
Как победить (или хотя бы выжить)? Понимать, что нужно Клиенту, «вжиться в него» Понять принципы создания высоконагруженных, масштабируемых приложений Научиться логировать метрики Научиться анализировать их (самое сложное) Запустить процесс с обратной связью Свести анализ к маленькому набору индикаторов к ОДНОЙ ЗЕЛЕНОЙ ЛАМПОЧКЕ
Что видит Клиент Начнем с «конца». Веб-сервер, кластер, NoSQL, кэши Смотрим на систему глазами Клиента Что такое – «тормозит»?? Производительность JS Раздача статики с разных доменов, точек CDN Latency, TCP/IP SSL SPDY?
Так бывает частов client-side Список известных «безобразий» client-side Много людей… делают сайт А следит… один. Иногда это Клиент А сроки спускают сверху иногда… Неоптимальные ресурсы: картинки, стили Куча файлов Google PageSpeed Не профилируют Профилируют, но т.к. тестов нет – ломают быстро Алгоритмы – данных стало больше и … все легло (нанимайте опытных бойцов)
Как мерить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);
Как мерить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);
Как мерить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 |
Как меритьclient-side производительность Аналогично можно мерить отдачу из CDN глазами Клиента «Распределенное» тестирование – очень полезно Можно фиксировать каждый N хит Ставьте тесты на пороги и рисуйте графики Клиент ждал больше секунды по причине тормозов веб-проекта – плохо, заметно!
Как меритьclient-side производительность Научитесь БЫСТРО локализовывать источник ВНЕШНИХ проблем Проблемы провайдера Временные «тормоза» (congestion) сети Тормозит браузер клиента (играет в WOT в соседнем окне) Тормозит ТОЧНО не ваш веб-проект Скорость локализации – минуты. Автотесты – nagios/zabbix. Все пока понятно? Идем дальше.
«Тормоза» на server-side • ТОЧНО ясно, что замедление – на server-side • Медленная отдача статики • Медленная генерация дин. контента • Разбираемся со статикой – обычно это проще: • сервер не «висел»? (логи) • бэкап никто не запускал? • канал не забили? (логи, графики) • память/диски – объем и нагрузка (iostat) • на storage нет еще 50 проектов? • может убрать в CDN?
«Тормоза» на server-side - статика • Классика: • вынести статику на отдельный домен (|| в браузере) • на отдельный сервер(ы) (быстрее отдача) • в CDN Сервер статики Rev. proxy server (Nginx) Стат. файлы Серверприложений Сервер баз данных RDBMS(MySQL) Appl. server (PHP-FPM)
«Тормоза» на server-side - статика Подводные камни… Статика «проникает» на apache/php-fpm Забиваются тяжелые воркеры Все висит Пишем тест, локализуем: apache /server-status, apachetop
Со статикой - разобрались Статика отдается максимально быстро Подкрутили буферы nginx Поставили быстрые диски Убрали все в CDN Создали тесты – покраснеют если «статика» сломается Осталось самое сложное и интересное.
«Тормоза» на server-side - Приложение Балансировщики: DNS HAProxy AWS ELB Nginx… 200 ОК 500 Internal Server Error 502 Bad Gateway 503 Service Unavailable 504 Gateway Timeout
«Тормоза» на server-side - Приложение Разберитесь в ошибках от upstream! Ошибки приложения – лог Очередь забиласьи чем: nginx – apache/php-fpm Служебная страничка – не шокируйте клиентов
«Тормоза» на server-side - Приложение Типовая структура веб-приложения: Авторизовать клиента Отдать страницу(ы) из кэша или … Сделать выборку из БД Обработать данные Сформировать верстку и отдать клиенту Еще есть: XSLT, nginx SSI, js/ajax«фигачит» в БД напрямую… Страницы быстрые – главная, детальная Страницы «медленные» – выборки с фильтрами, поиск по параметрам Алгоритмы и V-данных: постраничка, шардинг.
«Тормоза» на server-side – Кэш • Кэш – это «наркотик» • Главное – вовремя соскочить • Кэш: • Файлы • БД • Memcached (кластер) • Гранулированность, граф зависимостей • MySQL query cache – «to be or not to be»? ;-) • Выход «есть» – денормализация, NoSQL, async-очереди, «удобные» сценарии, шардинг
«Тормоза» на server-side – БД • ACID– ближе к ЛСД • Что у вас за приложение? CAP «скушает»? • MySQL Replication (+semisync) • MySQL – «master-master» A/P • Galera/PerconaXtraDB Cluster/MariaDBGalera Cluster
«Тормоза» на server-side – PHP • На примере PHP • pinbaтаймеры • php-fpm slow log • gdb, strace • Анализ логов приложения, распределения
«Тормоза» на 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 …
«Тормоза» на server-side – PHP • XHProf (github.com/facebook/xhprof) • Почти не создает нагрузку на бою • Можно быстро найти корень проблемы • Полезно автоматически сохранятьтрейсы долгих страниц • … и анализировать их с разработчиками
Итоги Алгоритмически страницы НЕ ДОЛЖНЫ тормозить Сброс кэша не должен приводить к коллапсу – денормализация Исследуйте «крайние» случаи А также, мониторьте среднегодовую температуру (+7) Все автоматизируйте и быстро, БЫСТРО, тестами определяйте текущее состояние веб-системы Принцип ОДНОЙ зеленой лампочки! Только системный подход, обратная связь Всем удачи!
Производительность – это просто!
Спасибо за внимание! Вопросы? Александр Сербулserbul@1c-bitrix.ruAlexSerbul