41
SDCH - Общий словарь сжатия в HTTP Дмитрий Маркович

SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

  • Upload
    ontico

  • View
    812

  • Download
    0

Embed Size (px)

DESCRIPTION

Доклад Дмитрия Марковича на HighLoad++ 2014.

Citation preview

Page 1: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

SDCH - Общий словарь сжатия в HTTP Дмитрий Маркович

Page 2: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Дмитрий Маркович LinkedIn Engineering, Traffic Team

Page 3: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Случайность Каждый день мы что-то ищем в 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

Page 4: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Request URL: accept-encoding: gzip, deflate, sdch avail-dictionary: j_fzWU8F Response: content-encoding: gzip content-encoding: sdch

Normal SDCH Request

Page 5: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Проверка Без SDCH…

Page 6: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Проверка …и с SDCH

Вроде бы особой разницы нет?

Page 7: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Но все-таки интересно - копаем дальше... get-dictionary: /sdch/j_fzWU8F.dct

Словарь?

Page 8: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Теперь когда совсем интересно SDCH протокол впервые был предложен в 2008 году (Velocity 2008 Web Performance and Operations Conference). Цель протокола сжать HTTP ответы и таким образом улучшить производительность у пользователей с небольшой скоростью интернета.

Page 9: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Уменьшение времени передачи данных • Уменьшение размера это ключ к успеху • Gzip работает хорошо для сжатия индивидуальных ответов • Как насчет общих данных, которые присутствуют во всех ответах? • Передавать общие данные только 1 раз и пересылать только различные

части ответа

Page 10: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Взгляд на LinkedIn

Page 11: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Но ведь уже есть RFC3229 - Delta сжатие в HTTP?

• Применимо только для одинаковых путей, что делает невозможным какое-то кеширование

Page 12: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Как бы проверить, что это даст в рамках инфраструктуры LinkedIn

Генерирует словари для статического контента

1

Оповещает о словарях поддерживающие клиенты через HTTP заголовки 2

Скачивает и хранит словари

3

При последующем запросе оповещает что словарь уже скачан 4

Кодирует содержимое ответа ч-з SDCH используя словарь и уменьшает передаваемый размер

5

Принимает и декодирует

6

Page 13: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Какие браузеры?

Google Chrome (версия 38+) Yandex Browser

Page 14: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Начинаем разбираться. Что положить в словарь?

Данные словаря находятся в публичном доступе поэтому берем все публичные сss и js файлы.

Page 15: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Собираем словарь

Как обычно с первого раза не работает :). Немного исправляем и что мы видим...

https://github.com/gtoubassi/femtozip

Библиотека для сборки словаря

FemtoZip

Page 16: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Хеш словаря

Page 17: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Хеш в теле ответа

Page 18: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Детальная метаданных словаря Детальная метаданных словаря 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

Page 19: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Пример словаря CSS

Page 20: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Вроде бы все отлично, но генерация словаря занимает довольно большое время ~10 часов.

Page 21: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

ATS plugin

Что он должен делать • определять что клиент поддерживает SDCH; • предлагать клиенту скачать словарь; • кодировать ответ согласно имеющемуся словарю;

Page 22: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Кодировка для этого Google выбрал уже стандартизированный VCDIFF протокол.

http://code.google.com/p/open-vcdiff/ OPEN-VCDIFF библиотека для кодировки и раскодировки для VCDIFF (RFC3284) формата

Page 23: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Кодирование VCDIFF Замена длинных общих строк короткими инструкциями, необходимыми для клиента чтобы восстановить данные используя словарь.

Page 24: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Кодировка Кодировка vcdiff encode -dictionary file.dict < target_file > delta_file Раскодировка vcdiff decode -dictionary file.dict < delta_file > target

Page 25: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Примеры для трех файлов

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

Page 26: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Примеры сжатия

Процент сжатия

Маленькие файлы могут стать больше из-за кодирования

Page 27: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Примеры сжатия

Процент сжатия

В этом графике убраны файлы у которых размер уменьшился меньше чем на 5 байт

Page 28: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Чем больше файл тем лучше он сжимается.

Page 29: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Что делать с данными которые плохо сжимаются?

Page 30: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Кеширование, CDN Требования: должен уметь поддерживать пользовательский Vary хидер и различать элементы по нему. Для SDCH это: Vary: Avail-Dictionary

RESPONSE content-encoding: gzip content-encoding: sdch vary: avail-dictionary

Page 31: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Кеширование, CDN Требования: не должен убирать SDCH значение из Accept-Encoding хидера (Akamai) accept-encoding: gzip, deflate, sdch

Page 32: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Как часто обновлять словарь

Кеширование на короткий период, задержки для

деплоймента

Кеширование, словарь все еще актуальный

Page 33: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Новый словарь

Возвращаем get-dictionary: /sdch/j_fzWU8F.dct и браузер скачивает его в оффлайн режиме

Page 34: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Безопасность 1. Словарь хэшируется как на

клиенте, так и на сервере 2. Словарь действителен

только для указанного домена и пути

Page 35: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Что нужно знать о Proxy и Firewall

• Распространение нежелательного контента через словарь

• Невозможность раскодировать словарь для проверки безопасности контента

• Замена контента в закодированном SDCH ответе делает его не валидным

Page 36: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Словарь и ответ могут не содержать опасного контента, но раскодируемый результат?

Page 37: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Решение 1. Вырезать sdch из Accept-Encoding хидера :) 2. Реализовать sdch протокол (сложно, долго, затратно). 2.1 Производительность, для наших файлов ~400 микросекунд

Page 38: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Загрузка сервера

Page 39: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

SDCH компрессия доступна для CSS LinkedIn файлов

Page 40: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Наши результаты • В среднем на 30% уменьшился размер передаваемых данных

относительно Gzip. • Только файлы маленького размера проиграли относительно

Gzip. • Уменьшилось время загрузки страниц, особенно в регионах

с небольшой скоростью интернета. • Чем больше веб ресурс (чем больше файлов участвует в

формировании словаря), тем лучше работает эта технология.

Page 41: SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

Спасибо за внимание!

[email protected]

We are hiring!