Upload
ontico
View
812
Download
0
Embed Size (px)
DESCRIPTION
Доклад Дмитрия Марковича на HighLoad++ 2014.
Citation preview
SDCH - Общий словарь сжатия в HTTP Дмитрий Маркович
Дмитрий Маркович LinkedIn Engineering, Traffic Team
Случайность Каждый день мы что-то ищем в Google...
Request URL:
https://www.google.com/s?output=search... accept-encoding: gzip, deflate, sdch
Response: content-encoding: gzip get-dictionary: /sdch/j_fzWU8F.dct
Bootstrapping
Request URL: accept-encoding: gzip, deflate, sdch avail-dictionary: j_fzWU8F Response: content-encoding: gzip content-encoding: sdch
Normal SDCH Request
Проверка Без SDCH…
Проверка …и с SDCH
Вроде бы особой разницы нет?
Но все-таки интересно - копаем дальше... get-dictionary: /sdch/j_fzWU8F.dct
Словарь?
Теперь когда совсем интересно SDCH протокол впервые был предложен в 2008 году (Velocity 2008 Web Performance and Operations Conference). Цель протокола сжать HTTP ответы и таким образом улучшить производительность у пользователей с небольшой скоростью интернета.
Уменьшение времени передачи данных • Уменьшение размера это ключ к успеху • Gzip работает хорошо для сжатия индивидуальных ответов • Как насчет общих данных, которые присутствуют во всех ответах? • Передавать общие данные только 1 раз и пересылать только различные
части ответа
Взгляд на LinkedIn
Но ведь уже есть RFC3229 - Delta сжатие в HTTP?
• Применимо только для одинаковых путей, что делает невозможным какое-то кеширование
Как бы проверить, что это даст в рамках инфраструктуры LinkedIn
Генерирует словари для статического контента
1
Оповещает о словарях поддерживающие клиенты через HTTP заголовки 2
Скачивает и хранит словари
3
При последующем запросе оповещает что словарь уже скачан 4
Кодирует содержимое ответа ч-з SDCH используя словарь и уменьшает передаваемый размер
5
Принимает и декодирует
6
Какие браузеры?
Google Chrome (версия 38+) Yandex Browser
Начинаем разбираться. Что положить в словарь?
Данные словаря находятся в публичном доступе поэтому берем все публичные сss и js файлы.
Собираем словарь
Как обычно с первого раза не работает :). Немного исправляем и что мы видим...
https://github.com/gtoubassi/femtozip
Библиотека для сборки словаря
FemtoZip
Хеш словаря
Хеш в теле ответа
Детальная метаданных словаря Детальная метаданных словаря dictionary-metadata = 1#dictionary-header "\n" dictionary-header = "domain" ":" value "\n" | "path" ":" value "\n" | "format-version" ":" value "\n" | "max-age" ":" value "\n" | "port" ":" <"> portlist <"> "\n" portlist = 1#portnum portnum = 1*DIGIT Полный словарь dictionary-definition = dictionary-metadata payload
Пример словаря CSS
Вроде бы все отлично, но генерация словаря занимает довольно большое время ~10 часов.
ATS plugin
Что он должен делать • определять что клиент поддерживает SDCH; • предлагать клиенту скачать словарь; • кодировать ответ согласно имеющемуся словарю;
Кодировка для этого Google выбрал уже стандартизированный VCDIFF протокол.
http://code.google.com/p/open-vcdiff/ OPEN-VCDIFF библиотека для кодировки и раскодировки для VCDIFF (RFC3284) формата
Кодирование VCDIFF Замена длинных общих строк короткими инструкциями, необходимыми для клиента чтобы восстановить данные используя словарь.
Кодировка Кодировка vcdiff encode -dictionary file.dict < target_file > delta_file Раскодировка vcdiff decode -dictionary file.dict < delta_file > target
Примеры для трех файлов
abook_remarketing_base_promo_en_US.css: on disk: 4198 bytes on wire: 809 bytes
registration_subs_upsell_en_US.css: on disk: 9189 bytes on wire: 3220 bytes
footer_en_US.css: on disk: 1941 bytes on wire: 1245 bytes
Примеры сжатия
Процент сжатия
Маленькие файлы могут стать больше из-за кодирования
Примеры сжатия
Процент сжатия
В этом графике убраны файлы у которых размер уменьшился меньше чем на 5 байт
Чем больше файл тем лучше он сжимается.
Что делать с данными которые плохо сжимаются?
Кеширование, CDN Требования: должен уметь поддерживать пользовательский Vary хидер и различать элементы по нему. Для SDCH это: Vary: Avail-Dictionary
RESPONSE content-encoding: gzip content-encoding: sdch vary: avail-dictionary
Кеширование, CDN Требования: не должен убирать SDCH значение из Accept-Encoding хидера (Akamai) accept-encoding: gzip, deflate, sdch
Как часто обновлять словарь
Кеширование на короткий период, задержки для
деплоймента
Кеширование, словарь все еще актуальный
Новый словарь
Возвращаем get-dictionary: /sdch/j_fzWU8F.dct и браузер скачивает его в оффлайн режиме
Безопасность 1. Словарь хэшируется как на
клиенте, так и на сервере 2. Словарь действителен
только для указанного домена и пути
Что нужно знать о Proxy и Firewall
• Распространение нежелательного контента через словарь
• Невозможность раскодировать словарь для проверки безопасности контента
• Замена контента в закодированном SDCH ответе делает его не валидным
Словарь и ответ могут не содержать опасного контента, но раскодируемый результат?
Решение 1. Вырезать sdch из Accept-Encoding хидера :) 2. Реализовать sdch протокол (сложно, долго, затратно). 2.1 Производительность, для наших файлов ~400 микросекунд
Загрузка сервера
SDCH компрессия доступна для CSS LinkedIn файлов
Наши результаты • В среднем на 30% уменьшился размер передаваемых данных
относительно Gzip. • Только файлы маленького размера проиграли относительно
Gzip. • Уменьшилось время загрузки страниц, особенно в регионах
с небольшой скоростью интернета. • Чем больше веб ресурс (чем больше файлов участвует в
формировании словаря), тем лучше работает эта технология.