sdch, или новые подходы к увеличению производительности,...

Post on 15-Jun-2015

812 Views

Category:

Internet

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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. • Уменьшилось время загрузки страниц, особенно в регионах

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

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

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

dmarkovi@linkedin.com

We are hiring!

top related