1. НАСТРОЙКА И ОПТИМИЗАЦИЯ
J2EE ВЫСОКОНАГРУЖЕННЫХ ВЕБ-
ПРИЛОЖЕНИЙ НА ОСНОВАНИИ
ОПЫТА РАЗРАБОТКИ ПОРТАЛА
СБЕРБАНКА
Шамим Ахмед
Ведущий архитектор
AT Consulting
2. Настройка и оптимизация J2EE высоконагруженных веб-приложений на основании опыта
разработки портала Сбербанка
ПЛАН:
Причины низкой производительности.
Общие подходы и методология для оптимизации веб
приложения.
Оптимизация Веб сервера.
Оптимизация на стороне клиента.
Оптимизация на стороне middleware, в том числе
сервер приложения.
Оптимизация Базы Данных.
2
3. Настройка и оптимизация J2EE высоконагруженных веб-приложений на основании опыта
разработки портала Сбербанка
ОСОБЕННОСТИ ПОРТАЛА СБЕРБАНКА
Быстрое внесение изменений в структуру портала,
добавление нового контента без установки релизов.
Персонализация страницы для конечных пользователей.
Таргетирование.
Динамическое построение страниц портала в зависимости от
информации собранной о пользователе (таргетирование,
геолокация и др.).
Единый портал с поддержкой всех устройств.
3
4. Настройка и оптимизация J2EE высоконагруженных веб-приложений на основании опыта
разработки портала Сбербанка
ПРИЧИНЫ НИЗКОЙ ПРОИЗВОДИТЕЛЬНОСТИ
Священная война между контент-менеджерами,
маркетингом и эксплуатацией.
Не достаточное понимание архитектуры своей системы.
Технологические - узкие места производительности веб
сервера, сервер приложения и базы данных.
4
5. Общий проектный план
Подготовка
к проекту
Анализ
и разработка
Анализ текущей
ситуации
Разработка
Разработка
рекомендаций
по оптимизации бизнес
процессов
Консультации
Презентация
результатов
7
1 3 5 7Этапы / Время, недели 2 4 6 8
Презентация
Фаза 1
Фаза 2
Фаза 2
9
6. Причина низкой производительности
ПРИМЕР СИСТЕМНЫХ ТРЕБОВАНИЙ
Средняя численность активных пользователей > 25000.
Максимальное TPS > 850.
Средняя время загрузки страниц < 3 сек.
Линейная масштабируемость системы.
Отказоустойчивость.
Доступность систем 24*7 (99,9%).
Зашита от XSS и DDoS атак.
Поддержка IE8 и Opera7.
8
7. Причина низкой производительности
КАК ЖЕ БЫТЬ В ТАКОЙ СИТУАЦИИ ?
Дальновидение или one step further.
Анализ и проектирование системных требования.
Соглашение (coding convention, data convention).
Автоматизированное тестирования (Browser acceptance,
Stress test).
9
8. Жизненный цикл разработки
10
Релиз в UAT Тестирование Верстка widget
Анализ и
подготовка ЧТЗ
Подготовка
дизайн макета
Разработка
widget
Разработка rest
сервиса
Заполнение контента
9. Причина низкой производительности
СВЯЩЕННАЯ ВОЙНА МЕЖДУ КОНТЕНТ-МЕНЕДЖЕРАМИ,
МАРКЕТИНГОМ И ЭКСПЛУАТАЦИЕЙ.
Контент-менеджер: Больше usability для введения контента
Маркетинг: Больше интерактивного контента
Эксплуатация: Больше производительности портала
11
12. Настройка и оптимизация J2EE высоконагруженных веб-приложений на основании опыта
разработки портала Сбербанка
ОБЩИЕ ПОДХОДЫ И МЕТОДОЛОГИЯ ДЛЯ
ОПТИМИЗАЦИИ ВЕБ ПРИЛОЖЕНИЯ
Определения основных факторов влияющие на
производительность.
Кэширование всего, что возможно.
Определение узких мест в ИС.
Измерение производительности.
15
13. Общие подходы и методологию для оптимизации веб приложения
ОСНОВНЫЕ ФАКТОРЫ ВЛИЯЮЩИЕ НА
ПРОИЗВОДИТЕЛЬНОСТИ
16
- Время рендеринг страницы в браузер.
- Объём контента в странице.
- Расстояние дата центра от пользователя.
- Количества вызовов для каждой страницы.
T - Технологические или системные узкие места
14. Общие подходы и методологию для оптимизации веб приложения
КЭШИРОВАНИЕ ВСЕГО, ЧТО ВОЗМОЖНО
Агрессивная политика кэширования.
Виды кэширования:
Кэширование статических ресурсов (js, css) в веб сервер через etag и cache control.
Кэширование статические блоки в страницах при помощью SCSI.
Кэширование результата запроса из БД на сервере приложения.
Кэширование результата идемпотентных методов на сервере приложения.
Кэширование ресурсов на контент серверах.
Кэширование результат SQL запроса в БД.
17
15. Общие подходы и методологию для оптимизации веб приложения
УРОВЕНЬ КЭШИРОВАНИЯ НА ПОРТАЛЕ
СБЕРБАНКА
18
Кэширование статических ресурсов в Nginx
Кэширование шаблонов страницы для портала
Кэширование результатов вызова backend сервиса
Кэширование статических ресурсов на контент сервере
Кэширование hibernate l2
Кэширование таблицы и результатов SQL запроса в БД
16. Общие подходы и методологию для оптимизации веб приложения
ОПРЕДЕЛЕНИЕ УЗКИХ МЕСТ В ИС
Путем мониторинга системы.
Симптомы узких мест:
Повышенное время отклика от сервера.
Ошибки http (4хх, 5хх).
Высокая загрузка ЦП.
Много открытых соединений.
Утечки памяти.
Узкие места в ИС может быть в:
Веб серверах.
Сервере приложения.
Сервере базы данных.
Ширине канала связи.
19
17. Общие подходы и методологию для оптимизации веб приложения
ИЗМЕРЕНИЕ ПРОИЗВОДИТЕЛЬНОСТИ
Микро бенчмаркинг Java скрипт кода
Микро бенчмаркинг rest сервисов, в т.ч. Java методов.
Смотреть(мониторинг) execution plan sql запросов.
Вычисление количества read/write операций в БД на каждый
http запрос.
LOAD TEST, Test Early, Test Often.
20
18. Общие подходы и методологию для оптимизации веб приложения
ЗАКЛЮЧЕНИЯ:
Анализируем и проектируем системных требования.
Обращаем внимание на симптомы узких мест в архитектуре
веб приложения.
Включаем агрессивное кэширования на всех уровнях.
Чаще запускаем load test.
21
19. Настройка и оптимизация J2EE высоконагруженных веб-приложений на основании опыта
разработки портала Сбербанка
ОПТИМИЗАЦИЯ ВЕБ СЕРВЕРА
Архитектурные решения:
1. Балансировка DNS
2. Использование CDN
3. Использование под домена для статических ресурсов
4. SSI для предоставления статических ресурсов
5. Предоставление всех статических ресурсов из RAM DISK
Настройки NGINX:
1. Compress все ресурсы таких как js, html, css, img. Compress level 5-7 - оптимально
2. Предоставлять уже заранее сжатые файлы, позволяет быстро отдавать файлы и
также уменьшает нагрузку CPU на сервере nginx.
3. Использовать дистрибутивный кэш (Кэш кластера) если несколько веб серверов
находится на одном кластере
4. Конфигурация worker процесс зависит от количества CPU
22
23. Оптимизация веб сервера
АРХИТЕКТУРНЫЕ РЕШЕНИЯ
1. Балансировка DNS
2. Использование CDN
3. Использование под домена для статических ресурсов (продолжение)
26
24. Оптимизация веб сервера
АРХИТЕКТУРНЫЕ РЕШЕНИЯ
1. Балансировка DNS
2. Использование CDN
3. Использование под домен для статических ресурсов (продолжение)
4. SSI для предоставления статических ресурсов
27
26. Оптимизация веб сервера
АРХИТЕКТУРНЫЕ РЕШЕНИЯ
1. Балансировка DNS
2. Использование CDN
3. Использование под домен для статических ресурсов (продолжение)
4. SSI для предоставления статических ресурсов
5. Предоставление всех статических ресурсов из RAM DISK
RamDisk – это ПО, которое занимает часть ОЗУ сервера и использует его как
дисковой носитель. Позволяет уменьшать дисковые операции и предоставляет
быстрый доступ к ресурсам.
Альтернатив: SSD, memcache
29
28. Оптимизация веб сервера
НАСТРОЙКИ NGINX (ПРОДОЛЖЕНИЕ)
3. Обработка соединений
Всего соединений = worker_processes x worker_connections
worker_processes auto;
# Определяет количество рабочих процессов. Его лучше устанавливать в auto в новых версиях.
# worker_processes = CPU core тоесть worker_processes = 4
worker_connections 1024;
# Устанавливает максимальное количество соединений одного рабочего процесса. Следует выбирать
значения от 1024 до 4096.
4. Обработка клиентов
Keepalive соединения позволяют избежать необходимости повторного создания
соединения между клиентом и сервером.
keepalive_timeout 30;
# Будет ждать 30 секунд перед закрытием keepalive соединения
keepalive_requests 100;
# Максимальное количество keepalive запросов от одного клиента
Если для страницы количества запросов большее 100, тогда следует увеличит оба эти
параметры, хотя бы во время load test
31
29. Оптимизация веб сервера
НАСТРОЙКИ NGINX (ПРОДОЛЖЕНИЕ)
5. Настройка операционной системы
6. Конфигурация cache control
32
Количество одновременно открытых файлов в OS:
Файл /etc/security/limits.conf.
* soft nofile 65535
* hard nofile 65535
Команда:
# ulimit –n 65535
Настройка стека:
# ulimit –s 256
location ~ ^/portalserver/static/sb-bundle/widgets/(.+)/css/(.+)(.css)$ {
expires 3h;
add_header 'Access-Control-Allow-Origin' '*’;
modern_browser unlisted;
ancient_browser "MSIE 6.0" "MSIE 7.0" "MSIE 8.0”;
if ($ancient_browser) {
rewrite ^/portalserver/static/sb-bundle/widgets/(.+)/css/(.+)(.css)$ /$2- ie8.css break;
root /mnt/ramdisk/static/sb-bundle/widgets/$1/css/;
} }
32. Оптимизация веб сервера
НАСТРОЙКИ NGINX (ПРОДОЛЖЕНИЕ)
6. Логирование
7. Прочее настройки
35
access_log off;
error_log /var/log/nginx/error.log crit;
#Информация о файлах
#nginx может кэшировать мета данных файлов
open_file_cache max=200000 inactive=20s;
#Если к таким файлам происходит много обращений,
кеширование может значительно ускорить этот процесс.
open_file_cache_valid 30s;
# Определяет через какое время информация будет удалена из
кеша
open_file_cache_min_uses 2;
# Будет кешировать информацию о тех файлах, которые были
использованы хотя бы 2 раза
34. Настройка и оптимизация J2EE высоконагруженных веб-приложений на основании опыта
разработки портала Сбербанка
ОПТИМИЗАЦИЯ НА СТОРОНЕ КЛИЕНТА
Уменьшить запрос к серверу
Уменьшить размер страницы
37
35. Оптимизация на стороне клиента
Гибридный подход для рендеринга страницы.
1. Часть widget рендерить в браузере и часть в backend (JSP)
2. Поисковой движок плохо сканирует страницы на client side rendering
3. Гибридный подход уменьшает нагрузки на browser
Lazy loading вызов сервисов из widget.
Client Side должен заниматься только отображением
данных.
1. Избежать лишних сортировок или фильтраций данных на сервере.
Уменьшение загрузки не нужных js библиотека в
landing page.
38
36. Оптимизация на стороне клиента
Не вызвать rest сервис с параметром current date
time, результат такого запроса не кэшируется.
Избавится от микро атомарных вызов сервисов,
использовать монолит сервис для получения всех
данных для одного widget.
Не использовать post запрос, так как результат не
кэшируется – если использование post запроса
обязательно, то формируйте хэш от запроса и
передавать в параметре запроса.
Minify js и css скриптов.
39
37. Оптимизация на стороне клиента
Склеивайте js и css.
CSS спрайты.
Группируйте js и css файлов в разных файлах зависит
от группы страниц.
Используйте асинхронную загрузку JS и CSS.
Оптимизиция изображения.
40
38. Оптимизация на стороне клиента
ОПТИМИЗАЦИЯ ИЗОБРАЖЕНИЯ
Примерно 70% объем страницы занимает изображения.
41
39. Оптимизация на стороне клиента
ОПТИМИЗАЦИЯ ИЗОБРАЖЕНИЯ
Формат фотографией:
JPEG - уменьшение качества путем уменьшения детализации изображения.
WebP - разработанный специально для обслуживания изображений в Web’e,
значительно лучше сжимает фотки, чем JPEG.
PNG и GIF - PNG изображения сохраняются без потери качества и лучше всего
подойдут для иконок и графики. Формат GIF имеет ограниченную палитру, однако
поддерживает анимацию.
42
40. Оптимизация на стороне клиента
ОПТИМИЗАЦИЯ ИЗОБРАЖЕНИЯ
Удалить все метаданные. Иногда объем такой инфы может
составлять больше половины веса самого изображения.
Инструменты:
ImageMagick.
GraphicsMagick.
Jpegtran.
Cwebp - Утилита позволяет преобразовать изображение в формат Webp.
43
41. Оптимизация на стороне клиента
ОПТИМИЗАЦИЯ ИЗОБРАЖЕНИЯ
Поддержка WebP формата:
Создаем версии каждого изображения для формата webp.
Определяем версия браузера посетителя и раздаем изображения.
44
42. Оптимизация на стороне клиента
ИНСТРУМЕНТЫ
Google speed test
Pingdom
http://www.webpagetest.org/
Jmeter
HP Load runner
45
43. Настройка и оптимизация J2EE высоконагруженных веб-приложений на основании опыта
разработки портала Сбербанка
ОПТИМИЗАЦИЯ НА MIDDLEWARE
Особое внимания при проектирование rest сервиса:
Rest сервисы будут доступно из internet
Единый дата сервис для получения данных из всех справочников
через параметр rest сервиса не лучший вариант.
Каждый rest сервис должен проверять входные параметры на null,
если все параметры с значениям null не возвращаем данных.
http://beta.sberbank.ru/portalserver/content/atom/contentRepository/qu
ery?q=SELECT+*+FROM+cmis%3Afolder&searchAllVersions=false&include
AllowableActions=false&includeRelationships=none&maxItems=1000&ski
pCount=0 -- НЕ ДОПУСТИМА
46
44. Оптимизация на Middleware
Предоставлять обертку монолит сервисов.
Ограничивать данные через pagination.
Сервис должен сортировать и фильтровать данные
для client side, а не наоборот.
Применять дистрибутивный кэш (ehcache, memcahce
а также hazelcast) для хранения результата запроса из
БД.
47
45. Оптимизация на Middleware
Кэшировать результат вызова идемпотентных
сервисов.
Пользуйтесь CPU L1-L3 cache эффективно.
Пользуйтесь offheap ОЗУ если массивы данных
большие.
Пользуйтесь высоко производительный Stax или
VTDXML на месте DOM или SAX.
48
46. Оптимизация на Middleware
Применяйте единый framework для логирования или
SL4j фасад.
Пользуйтесь профилированием для выявления и
устранения блокировки.
Увеличивайте время сканирования изменения на
log4j2 или logback.xml.
Конфигурируйте сервер приложения.
49
47. Оптимизация на Middleware
КОНФИГУРАЦИЯ СЕРВЕР ПРИЛОЖЕНИЯ
Настройка Http Session
Настройка Thread pool
Настройка JDBC Connection pool
Настройка Java Heap и GC
50
50. Оптимизация на Middleware
КЛЮЧЕВЫЕ МОМЕНТЫ ПРИ НАСТРОЙКЕ
THREAD POOL
Правило “большее- лучшее” здесь не уместно, потоки
требуют памяти и системных ресурсов.
Среднее количество потоков = максимальное количество
RPS/количество серверов, threads = 850/16~54.
53
51. Оптимизация на Middleware
НАСТРОЙКА JDBC CONNECTION POOL
Одна из важнейших настроек сервера приложения.
Производительность сильно зависит от данной настройки.
54
52. Оптимизация на Middleware
НАСТРОЙКА JDBC CONNECTION POOL
Connection timeout: интервал времени до которого
соединение остается активным.
Min и Max Connection: Минимальное и максимальное число
соединения в пул.
Max connection * max number of Node in cluster < max connection in DB
Unused timeout: Максимальное время, в течение
которого не использующееся соединение может
оставаться в пуле.
Purge policy: всегда оставляем EntirePool, при
возникновении ошибки в соединении весь пул
очищается, это позволяет избавится от неожиданных
ошибок.
55
53. Оптимизация на Middleware
НАСТРОЙКА JDBC CONNECTION POOL (STUCK)
Stuck connection: Застрявшие соединение является активным
соединением, которое не отвечает или не возвращался
обратно в пул соединений.
56
54. Оптимизация на Middleware
НАСТРОЙКА JDBC CONNECTION POOL (STUCK)
Stuck time interval: Интервал времени, определяет как часто
необходимо проверять stuck соединения.
Stuck time: если соединение ожидает ответа более 240 сек,
она считается зависшим.
Stuck threshold: пороговое значения, после которого весь пул
соединения считается зависшим.
57
55. Оптимизация на Middleware
НАСТРОЙКА JAVA HEAP И GC ПОЛИТИКА
ONE SIZE DOESN’T FIT ALL.
Выделить 50% физической оперативной памяти на Java Heap
Size.
Initial Heap size = Maximum heap size, на пример Xms=16G;
Xmx=16G.
garbage collection policy :
- gencon
- optthruput
- optavgpause
- subpool
58
58. Настройка и оптимизация J2EE высоконагруженных веб-приложений на основании опыта
разработки портала Сбербанка
ОПТИМИЗАЦИЯ БАЗЫ ДАННЫХ
Выделить справочники для кэширования, например
сущность «Регион» - хороший кандидат для кэширования.
Настройка Result Cache.
61
sql> show user;
USER is SYS
sql> show parameter result;
NAME TYPE VALUE
-------------------------------------- ----------- ------------------------------
client_result_cache_lag big integer 3000
client_result_cache_size big integer 0
result_cache_max_result integer 5
result_cache_max_size big integer 6560K
result_cache_mode string MANUAL
result_cache_remote_expiration integer 0
59. Оптимизация Базы данных
result_cache_max_size: объем памяти, резервируемой для результирующего
набора кэша. По документации Oracle, значение этого параметра не должно
превысить 75% из общего размера shared pool. Рекомендуется выделить 50% памяти
из общего Shared pool.
result_cache_max_result: параметр указывает, какой процент
result_cache_max_size может использовать один результат запроса. По умолчанию
значение равно 5%.
62
sql> alter system set result_cache_max_size=1024M;
sql> show parameter result;
NAME TYPE VALUE
-------------------------------------- ----------- ------------------------------
client_result_cache_lag big integer 3000
client_result_cache_size big integer 0
result_cache_max_result integer 5
result_cache_max_size big integer 1024M
result_cache_mode string MANUAL
result_cache_remote_expiration integer 0
60. Оптимизация Базы данных
alter table TABLE_NAME RESULT_CACHE(MODE FORCE): результат
запроса кэшируется в shared pool, LRU.
alter table TABLE_NAME cache: кэширует данные таблицы в общем
буферном кэше и не гарантирует что кэш может долго остаться не изменим. Если
появиться новые кэшированные данные система может переписать данную кэш.
Alter table emp storage (buffer_pool Keep) : кэширует таблицу в пул
буфера и сохраняет дольшее всех
63Результат без кэширования
61. Оптимизация Базы данных
Результат после использования alter table TABLE_NAME
RESULT_CACHE(MODE FORCE)
64
62. Оптимизация Базы данных
ORACLE DATABASE CHANGE NOTIFICATION
Получить уведомление об DML и DDL операции в объектах
базы данных.
http://docs.oracle.com/cd/E11882_01/java.112/e16548/dbchgn
f.htm#JJDBC28815
Доступно с релиза 11g
Хорошо подходит для очистка и обновления result query
cache в middleware.
Пример использования
http://frommyworkshop.blogspot.ru/2011/01/clearing-
hazelcast-data-grid-cache-with.html
65
63. Настройка и оптимизация J2EE высоконагруженных веб-приложений на основании опыта
разработки портала Сбербанка
ЗАКЛЮЧЕНИЯ
При проектирование ИС, необходимо учитывать системные
требования.
Необходимо мониторит ИС и анализировать симптомы на
низкие производительности.
При необходимости оптимизировать следующие
прикладные ПО:
Веб сервер.
Сервер приложения.
Клиентская часть.
Базы данных.
66