SlideShare ist ein Scribd-Unternehmen logo
1 von 54
Чек-лист по
клиентской
оптимизации
Лавлинский Николай,
технический директор «Метод Лаб»
1
О себе
• Клиентская и серверная оптимизация
• Ускорение сайтов
• Пропаганда скорости
2
HTTPArchive.org – средний размер страниц
• Desktop: 2588 kb
• Mobile: 2288 kb
WTF?
3
Можно сделать лучше
• Правила и методики известны
• Инструменты есть
• Нет политического решения и осведомлённости
4
О чём доклад
• Анализ и оптимизация реального сайта по шагам
• Настройки Nginx для статики
• Оптимальный TLS
• Немного о TCP/IP в Linux
• CDN
• Средства тестирования скорости
5
Поехали
6
Параметры тестирования
7
• WebPagetest PI
• 3GFast (1,6 Mbit/s, 150 ms RTT)
• Браузер: Chrome
8
Начало
• Start render: 5,4 c
• Load: 9,5 c
• Bytes In: 1,6 MB
9
10
Критические ресурсы
Выводы
• Нужно сократить время до start render
• Мобильная версия = desktop
• Сайт не пригоден для мобильного интернета
• Нужно сокращать объём трафика
• Сократить количество блокирующих ресурсов
• Наличие клиентской SPOF (Google Fonts)
12
Шаг 1. Смотрим CSS
1. Styles.css (38,9 kb)
2. Fonts.googleapis.com/…. (1,8 kb)
• Минификация есть
• Сжатие Gzip (но gzip -3)
• Кеширование есть (Expires, Cache-control, Last-Modified)
• Часть CSS получаем со стороннего хоста!
• Шрифтовой CSS через Import
• Inline font!
13
Шаг 1. CSS оптимизация
• Сжимаем brotli Style.css: 29.7 kb (-24%)
• Выносим fonts.google в HTML из Import
14
Шаг 1. Результаты
16
Шаг 2. JS
1. Common.js (161 kb) (в <head>, sync)
2. Index.js (92,7 kb) (перед </html>)
• Минификация есть
• Кеширование есть
• Сжатие gzip
• Два синхронных JS
• Common.js (161 kb) расположен в заголовке страницы!
• Внутри common.js куча CSS кода!
17
Шаг 2. JS
Что делать с common.js?
• Можно было переместить вниз, но CSS inside
• Стили вниз нельзя – FOUC
18
Шаг 2. JS результаты
Сжимаем brotli:
• common.js: 110.7 kb (-31%)
• index.js 62.5 kb (-32%)
19
Шаг 2. JS результаты
20
Шаг 3. Шрифты
• Основные: fonts.googleapis.com, еще и локальные
• Всего: 7 шт., 392 kb
• Грузится отдельный CSS с внешнего хоста (TCP, DNS, TLS
handshake)
• Часть шрифтов из Google Fonts дублировано локальными
• Локальные шрифты в TTF, отдаются без сжатия
21
Шаг 3. Шрифты результаты
• Переносим все шрифты на сайт
• Локальный CSS для шрифтов
• Используем только WOFF2
• 392 kb -> 122 kb
22
Шаг 3. Шрифты результаты
24
Шаг 4. Картинки
• Всего: 53 шт., 666 kb. PNG, JPEG.
• Использован sprite для иконок.
• Кэширующие заголовки есть.
• Размеры соответствуют.
25
Шаг 4. Картинки PNG
• Optipng: optipng -o7 1.png
• Zopflipng: zopflipng --iterations=10 –y 1.png
• Делаем WebP:
cwebp -quiet -pass 10 -alpha_method 1 
-alpha_filter best -m 6 -mt –lossless 
1.png -o 1.png.webp
26
Шаг 4. Картинки JPEG
• Пережимаем Mozilla JPEG:
cjpeg -optimize -progressive -quality 80 
-outfile 1opt.jpg 1.jpg
• Очищаем jpegoptim:
jpegoptim --strip-all 1.jpg
• Делаем WebP:
cwebp -quiet -pass 10 -alpha_method 1 
-alpha_filter best -m 6 -mt -q 80 
1.jpg -o 1.jpg.webp
27
Шаг 4. Картинки SVG
• SVGomg: https://jakearchibald.github.io/svgomg/
• SVGo
• Zopfli, brotli сжатие
28
Шаг 4. Отдача WebP (nginx.conf)
map $http_accept $webp_suffix {
"~*webp" ".webp";
}
map $msie $cache_control {
"1" "private";
}
map $msie $vary_header {
default "Accept";
"1" "";
} 29
Шаг 4. Отдача WebP (location)
add_header Vary $vary_header;
add_header Cache-Control $cache_control;
try_files $uri$webp_suffix $uri =404;
30
Шаг 4. Картинки результаты
• Без WebP: 666 kb -> 410 kb
• С WebP: 666 kb -> 348 kb
31
Шаг 4. Картинки результаты
33
Шаг 5. HTTP/2
• Тонкая оптимизация
• Большее удобство
• Разные стратегии оптимизации
• Основная фича: мультиплексирование запросов (одно
соединение)
34
Шаг 5. HTTP/2 результаты
• По многим метрикам – нет разницы
• По некоторым – HTTP/2 хуже
35
36
37
Шаг 6. Preload шрифтов
<link rel="preload" href="/fonts/1.woff2"
as="font" type="font/woff2" crossorigin>
38
Шаг 6. Preload результаты
• Почти не дал результатов
• Причина: fonts.css (первый в очереди)
39
40
Результат
• Start render: 3.0 с (5,4)
• Load: 6,2 с (9,5)
• Bytes In: 814 КБ (1,6 МБ)
41
42
Что можно сделать еще?
• Разобрать JS- и CSS-код по исходникам, разбить по шаблонам
• Вычистить неиспользуемый CSS-код
• Вынести CSS из common.js и убрать весь JS-код вниз
• Провести аудит используемых шрифтов
• Разбить спрайт в PNG, перевести иконки в SVG
• Добиться сокращение трафика для мобильных
• Адаптивные картинки
43
Настройка Nginx TLS
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets on;
ssl_session_timeout 28h;
ssl_dhparam /etc/nginx/dhparams.pem;
ssl_stapling on;
ssl_stapling_verify on;
44
Настройка Nginx TLS
ssl_ciphers ‘ECDHE-ECDSA-AES128-GCM-
SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-
AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-
SHA384:DHE-RSA-AES128-GCM-SHA256:…';
45
Настройка Nginx TLS
• Используем кеширование сессий всех видов
• Безопасные версии прокотолов
• Быстрые стойкие шифры (AES-128-GCM)
• Не забываем включить AES-NI в BIOS
• Генератор конфигураций от Mozilla:
https://mozilla.github.io/server-side-tls/ssl-config-generator/
• Тестирование настройки:
https://www.ssllabs.com/ssltest/analyze.html
• Следите за обновлениями: TLS 1.3, ECDSA
46
Настройка Nginx статика
• Keep-alive:
keepalive_timeout 300;
keepalive_requests 10000;
• Кэширование:
add_header Cache-Control "max-age=31536000, immutable";
47
Настройка Nginx Gzip
gzip on;
gzip_static on;
gzip_types text/plain text/css text/xml
application/x-javascript image/x-icon
image/svg+xml application/x-font-ttf;
gzip_comp_level 7;
gzip_proxied any;
gzip_min_length 1000;
gzip_disable "msie6";
gzip_vary on;
48
Настройка Nginx Brotli
• Модуль: https://github.com/google/ngx_brotli
• Сборка: https://habrahabr.ru/post/310200/
• Сжатие Brotli:
brotli_static on;
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css text/xml
application/x-javascript image/x-icon image/svg+xml;
49
TCP/IP стек
• Сохраняем TCP window после простоя:
net.ipv4.tcp_slow_start_after_idle = 0
• Включаем TCP FastOpen в обе стороны:
net.ipv4.tcp_fastopen = 3
В Nginx:
Listen 80 default_server fastopen=256;
50
Немного о CDN
• Задержки, каналы
• Точки присутствия, связность
• Политики, настройка
• Уровень сложности
• HTTP/2
51
Средства тестирования
• WebPagetest: https://www.webpagetest.org/
• WebPagetest Private Instance:
https://sites.google.com/a/webpagetest.org/docs/private-instances
• Lighthouse (Chrome):
https://developers.google.com/web/tools/lighthouse/
52
Бонус
Скидка 30% на услуги по ускорению сайтов от Метод Лаб в июне.
Пароль: РИТ2017
www.methodlab.ru
53
Спасибо! Приходите на митап!
Индия, L 1.3 – 11.00 – митап по клиентской оптимизации
Контакты: nick@methodlab.info
https://www.facebook.com/nick.lavlinsky
https://www.methodlab.ru/
https://www.youtube.com/channel/UCH_PvxSiuETI_ecbeAmb7_w/
(Канал «Ускорение сайтов»)
Лавлинский Николай,
технический директор «Метод Лаб»
54

Weitere ähnliche Inhalte

Was ist angesagt?

Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Ontico
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
Ontico
 
Балансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в ОдноклассникахБалансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в Одноклассниках
Ontico
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Ontico
 
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
Ontico
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
Ontico
 
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Ontico
 
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Ontico
 
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Ontico
 

Was ist angesagt? (20)

ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
 
Балансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в ОдноклассникахБалансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в Одноклассниках
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
 
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
 
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
10 способов достижения HighLoad'а и BigData на ровном месте / Илья Космодемья...
 
Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)Архитектура HAWQ / Алексей Грищенко (Pivotal)
Архитектура HAWQ / Алексей Грищенко (Pivotal)
 
NAS, Predictions, Preloading, Presudo-Isomorphism / Охрименко Алексей (Acronis)
NAS, Predictions, Preloading, Presudo-Isomorphism / Охрименко Алексей (Acronis)NAS, Predictions, Preloading, Presudo-Isomorphism / Охрименко Алексей (Acronis)
NAS, Predictions, Preloading, Presudo-Isomorphism / Охрименко Алексей (Acronis)
 
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
 
Спасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераСпасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного Хецнера
 
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
 
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
Миф об очень сложном Highload / Александр Горный (Mail.Ru Group)
 
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
 

Ähnlich wie Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)

полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
rit2011
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Anton Baranov
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
rit2011
 
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Sergey Xek
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Ontico
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Sergey Xek
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Sergey Xek
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps way
Andrey Rebrov
 

Ähnlich wie Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб) (20)

полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
 
NoBigData - потоковая система аналитики clientside производительности, Сергей...
NoBigData - потоковая система аналитики clientside производительности, Сергей...NoBigData - потоковая система аналитики clientside производительности, Сергей...
NoBigData - потоковая система аналитики clientside производительности, Сергей...
 
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
 
Sivko
SivkoSivko
Sivko
 
10 шагов к ускорению сайта
10 шагов к ускорению сайта10 шагов к ускорению сайта
10 шагов к ускорению сайта
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 
Zero Downtime PHP Deployment with Envoyer And Forge
Zero Downtime PHP Deployment with Envoyer And ForgeZero Downtime PHP Deployment with Envoyer And Forge
Zero Downtime PHP Deployment with Envoyer And Forge
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
 
Speed Up Your Website
Speed Up Your WebsiteSpeed Up Your Website
Speed Up Your Website
 
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайнBadoo Desktop: оптимизация приложения на миллион юзеров онлайн
Badoo Desktop: оптимизация приложения на миллион юзеров онлайн
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
 
обзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторингаобзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторинга
 
Обзор архитектуры и подсистем деплоя и мониторинга. Как инженеры делают систе...
Обзор архитектуры и подсистем деплоя и мониторинга. Как инженеры делают систе...Обзор архитектуры и подсистем деплоя и мониторинга. Как инженеры делают систе...
Обзор архитектуры и подсистем деплоя и мониторинга. Как инженеры делают систе...
 
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs..."How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps way
 
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
 

Mehr von Ontico

Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 

Mehr von Ontico (20)

Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
 
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...
 

Чеклист по клиентской оптимизации / Николай Лавлинский (Метод Лаб)

  • 2. О себе • Клиентская и серверная оптимизация • Ускорение сайтов • Пропаганда скорости 2
  • 3. HTTPArchive.org – средний размер страниц • Desktop: 2588 kb • Mobile: 2288 kb WTF? 3
  • 4. Можно сделать лучше • Правила и методики известны • Инструменты есть • Нет политического решения и осведомлённости 4
  • 5. О чём доклад • Анализ и оптимизация реального сайта по шагам • Настройки Nginx для статики • Оптимальный TLS • Немного о TCP/IP в Linux • CDN • Средства тестирования скорости 5
  • 7. Параметры тестирования 7 • WebPagetest PI • 3GFast (1,6 Mbit/s, 150 ms RTT) • Браузер: Chrome
  • 8. 8
  • 9. Начало • Start render: 5,4 c • Load: 9,5 c • Bytes In: 1,6 MB 9
  • 10. 10
  • 12. Выводы • Нужно сократить время до start render • Мобильная версия = desktop • Сайт не пригоден для мобильного интернета • Нужно сокращать объём трафика • Сократить количество блокирующих ресурсов • Наличие клиентской SPOF (Google Fonts) 12
  • 13. Шаг 1. Смотрим CSS 1. Styles.css (38,9 kb) 2. Fonts.googleapis.com/…. (1,8 kb) • Минификация есть • Сжатие Gzip (но gzip -3) • Кеширование есть (Expires, Cache-control, Last-Modified) • Часть CSS получаем со стороннего хоста! • Шрифтовой CSS через Import • Inline font! 13
  • 14. Шаг 1. CSS оптимизация • Сжимаем brotli Style.css: 29.7 kb (-24%) • Выносим fonts.google в HTML из Import 14
  • 16. 16
  • 17. Шаг 2. JS 1. Common.js (161 kb) (в <head>, sync) 2. Index.js (92,7 kb) (перед </html>) • Минификация есть • Кеширование есть • Сжатие gzip • Два синхронных JS • Common.js (161 kb) расположен в заголовке страницы! • Внутри common.js куча CSS кода! 17
  • 18. Шаг 2. JS Что делать с common.js? • Можно было переместить вниз, но CSS inside • Стили вниз нельзя – FOUC 18
  • 19. Шаг 2. JS результаты Сжимаем brotli: • common.js: 110.7 kb (-31%) • index.js 62.5 kb (-32%) 19
  • 20. Шаг 2. JS результаты 20
  • 21. Шаг 3. Шрифты • Основные: fonts.googleapis.com, еще и локальные • Всего: 7 шт., 392 kb • Грузится отдельный CSS с внешнего хоста (TCP, DNS, TLS handshake) • Часть шрифтов из Google Fonts дублировано локальными • Локальные шрифты в TTF, отдаются без сжатия 21
  • 22. Шаг 3. Шрифты результаты • Переносим все шрифты на сайт • Локальный CSS для шрифтов • Используем только WOFF2 • 392 kb -> 122 kb 22
  • 23. Шаг 3. Шрифты результаты
  • 24. 24
  • 25. Шаг 4. Картинки • Всего: 53 шт., 666 kb. PNG, JPEG. • Использован sprite для иконок. • Кэширующие заголовки есть. • Размеры соответствуют. 25
  • 26. Шаг 4. Картинки PNG • Optipng: optipng -o7 1.png • Zopflipng: zopflipng --iterations=10 –y 1.png • Делаем WebP: cwebp -quiet -pass 10 -alpha_method 1 -alpha_filter best -m 6 -mt –lossless 1.png -o 1.png.webp 26
  • 27. Шаг 4. Картинки JPEG • Пережимаем Mozilla JPEG: cjpeg -optimize -progressive -quality 80 -outfile 1opt.jpg 1.jpg • Очищаем jpegoptim: jpegoptim --strip-all 1.jpg • Делаем WebP: cwebp -quiet -pass 10 -alpha_method 1 -alpha_filter best -m 6 -mt -q 80 1.jpg -o 1.jpg.webp 27
  • 28. Шаг 4. Картинки SVG • SVGomg: https://jakearchibald.github.io/svgomg/ • SVGo • Zopfli, brotli сжатие 28
  • 29. Шаг 4. Отдача WebP (nginx.conf) map $http_accept $webp_suffix { "~*webp" ".webp"; } map $msie $cache_control { "1" "private"; } map $msie $vary_header { default "Accept"; "1" ""; } 29
  • 30. Шаг 4. Отдача WebP (location) add_header Vary $vary_header; add_header Cache-Control $cache_control; try_files $uri$webp_suffix $uri =404; 30
  • 31. Шаг 4. Картинки результаты • Без WebP: 666 kb -> 410 kb • С WebP: 666 kb -> 348 kb 31
  • 32. Шаг 4. Картинки результаты
  • 33. 33
  • 34. Шаг 5. HTTP/2 • Тонкая оптимизация • Большее удобство • Разные стратегии оптимизации • Основная фича: мультиплексирование запросов (одно соединение) 34
  • 35. Шаг 5. HTTP/2 результаты • По многим метрикам – нет разницы • По некоторым – HTTP/2 хуже 35
  • 36. 36
  • 37. 37
  • 38. Шаг 6. Preload шрифтов <link rel="preload" href="/fonts/1.woff2" as="font" type="font/woff2" crossorigin> 38
  • 39. Шаг 6. Preload результаты • Почти не дал результатов • Причина: fonts.css (первый в очереди) 39
  • 40. 40
  • 41. Результат • Start render: 3.0 с (5,4) • Load: 6,2 с (9,5) • Bytes In: 814 КБ (1,6 МБ) 41
  • 42. 42
  • 43. Что можно сделать еще? • Разобрать JS- и CSS-код по исходникам, разбить по шаблонам • Вычистить неиспользуемый CSS-код • Вынести CSS из common.js и убрать весь JS-код вниз • Провести аудит используемых шрифтов • Разбить спрайт в PNG, перевести иконки в SVG • Добиться сокращение трафика для мобильных • Адаптивные картинки 43
  • 44. Настройка Nginx TLS ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_tickets on; ssl_session_timeout 28h; ssl_dhparam /etc/nginx/dhparams.pem; ssl_stapling on; ssl_stapling_verify on; 44
  • 45. Настройка Nginx TLS ssl_ciphers ‘ECDHE-ECDSA-AES128-GCM- SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA- AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM- SHA384:DHE-RSA-AES128-GCM-SHA256:…'; 45
  • 46. Настройка Nginx TLS • Используем кеширование сессий всех видов • Безопасные версии прокотолов • Быстрые стойкие шифры (AES-128-GCM) • Не забываем включить AES-NI в BIOS • Генератор конфигураций от Mozilla: https://mozilla.github.io/server-side-tls/ssl-config-generator/ • Тестирование настройки: https://www.ssllabs.com/ssltest/analyze.html • Следите за обновлениями: TLS 1.3, ECDSA 46
  • 47. Настройка Nginx статика • Keep-alive: keepalive_timeout 300; keepalive_requests 10000; • Кэширование: add_header Cache-Control "max-age=31536000, immutable"; 47
  • 48. Настройка Nginx Gzip gzip on; gzip_static on; gzip_types text/plain text/css text/xml application/x-javascript image/x-icon image/svg+xml application/x-font-ttf; gzip_comp_level 7; gzip_proxied any; gzip_min_length 1000; gzip_disable "msie6"; gzip_vary on; 48
  • 49. Настройка Nginx Brotli • Модуль: https://github.com/google/ngx_brotli • Сборка: https://habrahabr.ru/post/310200/ • Сжатие Brotli: brotli_static on; brotli on; brotli_comp_level 6; brotli_types text/plain text/css text/xml application/x-javascript image/x-icon image/svg+xml; 49
  • 50. TCP/IP стек • Сохраняем TCP window после простоя: net.ipv4.tcp_slow_start_after_idle = 0 • Включаем TCP FastOpen в обе стороны: net.ipv4.tcp_fastopen = 3 В Nginx: Listen 80 default_server fastopen=256; 50
  • 51. Немного о CDN • Задержки, каналы • Точки присутствия, связность • Политики, настройка • Уровень сложности • HTTP/2 51
  • 52. Средства тестирования • WebPagetest: https://www.webpagetest.org/ • WebPagetest Private Instance: https://sites.google.com/a/webpagetest.org/docs/private-instances • Lighthouse (Chrome): https://developers.google.com/web/tools/lighthouse/ 52
  • 53. Бонус Скидка 30% на услуги по ускорению сайтов от Метод Лаб в июне. Пароль: РИТ2017 www.methodlab.ru 53
  • 54. Спасибо! Приходите на митап! Индия, L 1.3 – 11.00 – митап по клиентской оптимизации Контакты: nick@methodlab.info https://www.facebook.com/nick.lavlinsky https://www.methodlab.ru/ https://www.youtube.com/channel/UCH_PvxSiuETI_ecbeAmb7_w/ (Канал «Ускорение сайтов») Лавлинский Николай, технический директор «Метод Лаб» 54