На протяжении всей жизни мне приходится экономить вычислительные и сетевые ресурсы: сначала были компьютеры с 300 кГц (кило — не гига!) и 32 Кбайт RAM, интернет по dial-up. Потом я решал олимпиадные задачки. Теперь имею дело с терабайтами трафика и 50 млрд событий в сутки. И хотя современные телефоны в 1 000 раз мощнее любого оборудования двадцатилетней давности, я до сих пор оптимизирую. Думал даже, что это со мной что-то не так. Но потом понял, что все постоянно что-нибудь оптимизируют. 

Эта статья в меньшей степени о том, почему нужно бороться за производительность, и в большей о том, на что сейчас стоит заменить устаревший стек из JPEG, JSON, gzip и TCP — и как это сделать. 

Спойлер: у нас есть решение и мы его не только показываем — ссылки на open source в конце статьи.

Примечание: в основе статьи доклад на Saint HighLoad++ — вместо чтения можно посмотреть запись выступления.

Зачем вообще что-то ускорять?

Исследования уважаемых компаний показывают, что лишние 100 мс задержки ощутимо просаживают продуктовые метрики — и отрицательный эффект со временем становится всё заметнее.

По данным Amazon:

  • 10 лет назад с каждыми 100 мс задержки конверсия падала на 1%;

  • 5 лет назад с каждыми 100 мс задержки продажи падали уже на 7%.

Google говорит:

  • 15 лет назад лишние 400 мс задержки уменьшали трафик на 20%;

  • 5 лет назад, если Largest Contentful Paint (LCP) уменьшалось на 300 мс, то это давало +12% к вовлечённости и +9% к просмотрам. 

Deloitte заявляет, что ускорение времени загрузки страницы на 100 мс может увеличить конверсию на 8%.

Всего одна десятая секунды — и такие результаты. Но давайте посмотрим, что такое эти 100 мс с когнитивной точки зрения:

  • за 13 мс человеческий мозг способен уловить изображение, то есть при FPS меньше 77 можно заметить «эффект 25-го кадра»;

  • за 100 мс — разобрать, что изображение означает;

  • за 150 мс (в среднем) обработать изображение и как-то среагировать;

  • за 17–50 мс мозг способен сформировать эстетическую реакцию на веб-страницу, говорят исследователи UX YouTube.

В этой статье условимся, что «быстро» — это меньше 100 мс. 

В рекомендациях по созданию веб-сайтов 100 мс — это хорошее значение для показателя интерактивности. Но некоторые другие величины всё ещё измеряются в секундах, то есть в реальном мире контент грузится целые секунды. Мы все далеки от идеала в 100 мс, и у нас впереди ещё много работы. 

https://web.dev/vitals/
https://web.dev/vitals/

Конечно, и мы ВКонтакте боремся за каждые 100 мс отдачи контента, отрисовки страниц, старта приложений и других операций. 

Что ускорять? 

Чтобы понять, где можно добиться максимального эффекта, вспомним, как устроены почти все интернет-сервисы. Базово их можно описать примерно так:

На уровне логики и клиентов интернет-сервис может работать очень быстро, если вы хорошо написали код, — поэтому на схеме блоки выделены зелёным. Скорость обращения к оперативной памяти или SSD напрямую зависит от качества кода: она в вашей власти, её можно оптимизировать понятными способами. 

Работа с данными обычно чуть медленнее, но базы данных и системы хранения всё эффективнее в обращении к дискам, кешировании и прочем. Так что блок оранжевый: при должных разумных усилиях latency здесь порядка 10–30 мс и неплохо предсказуема.

Самый медленный и самый сложный для оптимизации уровень — сетевой. Разработчики редко до него добираются: чтобы что-то оптимизировать на сетевом уровне, нужно оптимизировать и бэкенд, и клиент — и выкатывать это одновременно.

gist.github.com/hellerbarde/2843375
gist.github.com/hellerbarde/2843375

При этом в «Latency numbers every programmer should know» на сеть отводится гораздо больше, чем на все остальные операции, вместе взятые, — 150 мс. 150 мс — это каждый round-trip на другой континент. Если ваши пользователи и серверы находятся на разных континентах, то latency всего вашего сервиса точно больше 150 мс. Это, как мы выяснили, уже создаёт ощущение, будто что-то тормозит.

Какие у нас сети и зачем их оптимизировать

Мы помним, что «преждевременная оптимизация — корень всех бед». Перед тем как оптимизировать, нужно остановиться и подумать: зачем что-то ускорять, если за последние 20 лет пропускная способность интернет-сети стала больше в 1 000 раз. 

Это всё так. Но давайте посмотрим, как в последнее время изменились другие характеристики сети, в частности round-trip time (RTT). 

Если верить ребятам, которые в 2001 году замерили пинг от Сан-Диего до всех точек мира и показали результаты на IEEE Telecommunications Symposium, то в пределах одного побережья тогда пинг был около 25 мс, до другого — в среднем 100 мс, на любой другой континент — около 200 мс. 

Спасибо сервису RIPE Atlas: в 2021 году я нашёл дата-центр в Сан-Диего и попинговал его со всего мира. Прошло 20 лет, а что изменилось?

За 20 лет мы ускорились не в 1 000 раз, а всего на треть.

Трейдерские компании готовы потратить 300 млн долларов, чтобы проложить новый кабель по дну океана и получать данные на 6 мс быстрее. Почему? Потому что нас ограничивает скорость света: на ней облететь экватор Земли займёт 134 мс — и ни миллисекундой быстрее. RTT сейчас уже близок к скорости света, и пока никто не знает, как её преодолеть, ожидать серьёзных изменений в RTT не приходится.

Я также протестировал, какой пинг у всего мира до сервисов ВКонтакте (в условиях без участия CDN и кешируемого контента). 

RTT до vk.com через atlas.ripe.net
RTT до vk.com через atlas.ripe.net

Если смотреть со всего мира, то 90-й перцентиль будет равен 300 мс. То есть пинг в 200 мс — это повседневная реальность. Из Петропавловска-Камчатского, например, пинг меньше 150 мс не бывает. 

Mobile first 

Мы живём в век преобладания мобильных устройств, и это обязывает нас учитывать ещё одну важную характеристику — процент потерянных пакетов. В беспроводных сетях они теряются легче: для 4G и Wi-Fi packet loss составляет примерно 0,1–0,5%. Это не очень много, но так как 92% аудитории ВКонтакте использует мобильные, нам нужно уметь с этим работать. 

К тому же утверждение, что «скоро везде будет 5G» — сильное преувеличение. Ниже карта покрытия 3G-интернета в России. 4G ещё меньше. 

Зона покрытия сотовой связью 3G в России на февраль 2019 г. Все операторы
Зона покрытия сотовой связью 3G в России на февраль 2019 г. Все операторы

В крупных городах мы привыкли, что почти везде есть 4G. Но на самом деле даже 3G есть далеко не везде — и его уже недостаточно для быстрой работы многим сервисам. 

Чаще всего мы проверяем скорость работы наших сервисов, сидя в московских и питерских офисах. С проводным интернетом и находясь близко к дата-центру, мы видим действительно хорошие цифры и думаем, что всё всегда работает быстро. Но если взять Петропавловск-Камчатский, то картина, например, по доставке изображений изменится. 

В Москве и Санкт-Петербурге у нас 25-й перцентиль времени появления картинок 78 мс, 75-й перцентиль — 428 мс. На Дальнем Востоке P25 — 238 мс, P75 — 939 мс. То есть четверть пользователей ВКонтакте замечают задержку до появления изображений. 

Поэтому рекомендую: настройте себе на рабочем месте сеть с профилем, как в Петропавловске-Камчатском, и попользуйтесь своим сервисом так хотя бы один день — обязательно заметите что-нибудь интересное. 

Что оптимизировать?

Теперь, когда мы выяснили, что у части нашей аудитории приложения работают не так быстро, как хотелось бы, давайте посмотрим, что можно оптимизировать.

Обычный стек (таким был и стек ВКонтакте до недавнего времени) включает в себя:

  • доставку изображений — JPEG в качестве графического формата, HTTP 1.1/2.0 на прикладном уровне и TCP на транспортном; 

  • web — те же TCP/IP, HTTP 1.1/2.0 плюс gzip и deflate;

  • API/RPC — снова TCP/IP, HTTP 1.1/2.0 и WebSocket, а главное, JSON в API мобильных клиентов.

Плохая новость: этот стек устарел. 

Это всё довольно старые протоколы. Нельзя сказать, что они не развиваются, но прогресс не стоит на месте и на всех уровнях появляются новые решения. 

Порядка двух лет назад мы начали отказываться от legacy-форматов и стека в пользу чего-то более производительного. Дальше расскажу, на что перешли и какие результаты это принесло. 

Изображения, или Как отказаться от JPEG

Среди всех типов контента у наших пользователей больше всего востребованы картинки: на них уходит больше 1 Тбит/с трафика. Поэтому начнём именно с изображений и посмотрим, на что можно заменить JPEG. 

На рынке форматов изображений конкурируют Google и Apple, которые предлагают разные интересные алгоритмические решения для сжатия. 

Google выигрывает по распространённости за счёт своего большого стека, браузеров и массовости использования Android. Поэтому мы в данном случае выбираем стек от Google. 

Между WebP и AVIF выбираем WebP, несмотря на то что он без потери качества сжимает на 30% эффективнее, чем JPEG, а AVIF на целых 50%. Потому что WebP поддерживается у 98% пользователей, а AVIF пока только у 50% (см. подробное сравнение WebP и AVIF).

Каждый следующий новый формат сжатия требует больше вычислительных ресурсов и на 20–40% уменьшает размер данных. Поэтому нужно наращивать мощности и всё равно сохранить JPEG для фолбэка. 

Соответственно, нужно пережать хранящиеся фотографии из JPEG в WebP. Но есть проблема: у нас больше 600 Пбайт изображений, которые пользователи запрашивают примерно миллион раз в секунду. У этой задачи два варианта решения: либо увеличить в два раза storage, либо научиться пережимать изображения на лету и очень быстро. 

Кеширование помогло нам снизить показатель RPS с 1 млн до 160 тысяч. Немного легче, но 160 тысяч фотографий в секунду всё равно нужно как-то перекодировать, причём желательно подгоняя под разрешение экрана. Этим занимается небольшой кластер из GPU и FPGA. 

FPGA от Intel — это специальное программируемое полупроводниковое устройство, которое может, например, обрабатывать 1 000 фотографий в секунду. Оно больше подходит нам с точки зрения производительности для IMP-задач, чем GPU. Мы постепенно увеличиваем количество используемых FPGA в кластере, чтобы пользователи получали фотографии в самом современном формате. 

Результат перехода с JPEG на WebP:

  • на 40% в среднем уменьшили размер фотографий;

  • на 15% сократили время доставки изображений, это 50–100 мс в зависимости от региона;

  • на 1,1% вырос просмотр этих фотографий, что схоже с данными Amazon;

  • на 1,3% в пике увеличилось количество смотрящих уникальных пользователей.

API, или Как отказаться от JSON и gzip

Окрылённые успехом оптимизации изображений, мы взялись за API.

Во-первых, сменили формат представления данных. JSON, конечно, очень удобный и human-readable, но есть более современные решения, например: BSON, CBOR, MessagePack.

Мы установили следующие требования к новому формату представления данных:

  • бинарный;

  • быстрый (с поддержкой Zero-copy);

  • без схемы;

  • поддерживаются существующие в JSON типы для конвертации.

Выбрали MessagePack, ускорились на 46% относительно JSON, стали компактнее. 

Во-вторых, заменили классический gzip для сжатия на zstd со словарём (см. исследование форматов сжатия). Учитывая, что алгоритм сжатия у нас должен справляться с более чем 100 Гбит/с трафика и 1,5 млн/с запросов, для нас очень важна производительность.

Есть более эффективные алгоритмы сжатия и можно настроить zstd на больший уровень компрессии, но в определённой точке это начинает расходовать слишком много ресурсов. Тогда сжатие занимает больше времени, чем передача данных по сети.

Результат перехода с gzip (JSON) на zstd (msgpack):

  • в 7 раз быстрее сжатие (–1 мкс);

  • на 10% меньше размер данных (8 Кбайт вместо 9 Кбайт);

  • продуктовый эффект не статзначимый :(

А ещё на вебе для сжатия старый добрый gzip или примерно такой же алгоритм deflate можно заменить на brotli. 

Он очень эффективен для статики, но для остальных страниц результаты спорные. На малых запросах brotli может не уменьшать количество передаваемых пакетов — поэтому, как всегда, надо смотреть, сколько потребуется ресурсов и будет ли это иметь смысл. 

На вебе мы используем brotli для статики, для динамики у нас по-прежнему gzip. 

QUIC, или Как отказаться от TCP

И самое сложное и важное в этой статье — отказаться от ТСР-стека и полностью перевести ВКонтакте на QUIC и HTTP/3. 

Напомню минимум теории: чем отличаются HTTP/2 и HTTP/3 и что такое QUIC. 

Классический стек — это HTTP/2, TLS, TCP, IP. Минимум половина участников Saint HighLoad++ используют именно его в своих приложениях. 

Альтернативное решение — HTTP/3. QUIC — это протокол поверх UDP, который реализует всё то же самое, что было в TCP, инкапсулирует в себе TLS, но лучше. Если поверх QUIC запустить HTTP/2, получится HTTP/3.

Данные по QUIC передаются быстрее, особенно в плохой сети, потому что в QUIC есть:

  • Zero-RTT — возможность отправить запрос сразу, без долгих handshake и acknowledgement;

  • Multiplexing — передача нескольких потоков в одном соединении; 

  • IP Migration — смена IP-адреса, например, при переключении с мобильного интернета на Wi-Fi, происходит прозрачно (на TCP это может занять секунд 30);

  • User Space implementation — это означает, что протокол не встроен в операционную систему, каждое приложение может иметь свою реализацию на клиенте; 

  • Congestion control — чтобы понять, что это и как влияет на скорость передачи данных, погрузимся глубже в устройство сетевого слоя. 

DeepDive на сетевой уровень

Пойдём снизу вверх и разберём, что происходит в маршрутизаторах. А как это реализуется с точки зрения сетевого стека, рассмотрим в отдельной статье.

Чтобы перестать думать о сети как о чёрном ящике, и понять, как она вообще работает, давайте представим: дата-центр, в котором серверы соединены с внешним миром интерфейсами в 100 Гбит/с; домашнего провайдера с оптикой на 1 Гбит/с; и пользователя, заплатившего за 30 Мбит/с. 

Во-первых, конечно, сервер 100 Гбит/с на пользователя не шлёт. Во-вторых, ему нужно как-то узнать, что у пользователя интернет в 30 Мбит/с. Как нашему серверу это сделать? Сейчас разберёмся. 

Проведём эксперимент: запустим speed test и с помощью Wireshark или сетевого профайлера посмотрим на пропускную способность. 

Speed test на проводном интернете
Speed test на проводном интернете

На старте теста пропускная способность высокая, а потом стабилизируется на каком-то значении. Это та пропускная способность, за которую вы как конечный пользователь заплатили — и которую провайдеру нужно как-то ограничить, чтобы вы не перегрузили ему всю сеть. 

Реализуется это ограничение следующим образом: у вас есть какая-то корзина токенов, которая наполняется со скоростью 30 Мбит/с; корзина имеет определённый размер. Когда вы в первый раз приходите за токенами (на старте теста), корзина полная — все токены можно забрать быстро. Но потом корзина пустеет, и дальше сеть уже работает в рамках корзины — например, тех самых купленных 30 Мбит/с. 

Запустив speed test, можно аккуратно измерить размер этой корзины — например, мне провайдер даёт 4 Мбайта. 

То есть первые 4 Мбайта данных я получаю на максимальной скорости — сайт, на который я захожу, открывается быстро. И только потом провайдер ограничивает пропускную способность, чтобы я не занял весь канал скачиванием какого-нибудь тяжёлого контента. В целом это очень удобно, потому что и интернет кажется быстрым, и ограничение выполняется.

Но есть проблема: ни клиент, ни сервер не знают о пропускной способности — только провайдер знает про корзину и ограничения на её размер.

Поэтому на клиенте есть congestion avoidance — алгоритмы, подстраивающие интенсивность отправки пакетов данных под пропускную способность. Раньше он был в ядре, а теперь — на клиенте. Грубо говоря, с помощью congestion avoidance клиент постепенно увеличивает скорость отправки пакетов, пока не происходит packet drop.

В этот момент в Wireshark можно увидеть DUP ACK (duplicate acknowledgements) — значит, корзина кончилась и оператор решил, что вы вышли за отведённую вам пропускную способность. 

Есть разные алгоритмы congestion avoidance, но обычно они действуют примерно следующим образом:

  • начинают с совсем небольшого количества отправляемых пакетов и постепенно его удваивают — это slow start на схеме ниже;

  • дойдя до значения, близкого к тому, на котором в прошлый запуск произошёл перегруз маршрутизатора, выходят на плато и увеличивают количество пакетов совсем по чуть-чуть — это как раз стадия congestion avoidance;

  • потом маршрутизатор таки перегружается и пакет теряется — packet loss на схеме;

  • всё повторяется сначала, количество пакетов снова постепенно наращивается.

При этом обратите внимание, что интервал между пиками составляет 100–200 мс. Потому что speed test ходит на сервер, который расположен близко к пользователю, и фидбэк о пропаже пакета приходит очень быстро. 

На маршрутизаторе тоже есть congestion avoidance. В простом варианте он просто дропает лишние пакеты — это называется TailDrop. А может быть чуть умнее и учитывать, что алгоритмы congestion avoidance на клиентах снизят скорость, если маршрутизатор дропнет пакеты. Алгоритмы RED/WRED, когда приближается перегрузка маршрутизатора, дропают случайные пакеты. Чтобы те, кто сидит на этом канале, увидели packet loss и снизили скорость.

RED/WRED даёт более честное распределение канала связи, чем TailDrop. С TailDrop, если вы пришли последними на перегруженный маршрутизатор, то вам ничего не досталось и все пакеты пропали. 

Чтобы делить полосу ещё честнее, можно сделать больше сетевой буфер. Буфер гасит бёрсты (burst) и позволяет лучше утилизировать канал. Но если сделать слишком большой буфер, случится bufferbloat — пакеты в буфере будут находиться слишком долго и вырастет задержка. 

Посмотрим на примере: попингуем vk.com, измерим задержку и посмотрим, есть ли bufferbloat и какого размера буфер у моего маршрутизатора. Этот тест я проводил в Питере, и пинг до сервера был порядка 2–3 мс (первые строчки на скриншоте ниже). Параллельно я запустил speed test и утилизировал весь канал — пинг начал расти. 

Параллельный поток заполнил все буферы внутри оператора, и пинг вырос. Разница между максимальным и минимальным пингом позволяет примерно оценить размер буфера. У меня получилось 840 Кбайт, то есть, скорее всего, часть пакетов RED/WRED дропает заранее и оператор мне как пользователю даёт буфер в 1 Мбайт. 

Что интересно, если провести speed test на 4G-интернете, то пиков не будет. На 4G нет пиков — нет token bucket.

Speed test на 4G-интернете
Speed test на 4G-интернете

Скорость мобильного интернета ограничивается по-другому — скорее, средой пропускания. Динамика передачи пакетов несколько другая, но периодический packet drop всё равно есть. 

А ещё нужно учитывать, что в сети бывают микробёрсты. Они возникают, когда суммарная пропускная способность нескольких каналов, входящих в маршрутизатор, меньше, чем исходящая. С одной стороны, это даёт хорошую утилизацию канала, с другой — исходящего канала просто не хватает. Получаются те самые микробёрсты, которых не видно на графике скорости. 

Итого на сетевом уровне: есть элементы с предсказуемым влиянием — token bucket и congestion avoidance, а есть непредсказуемая часть вроде bufferbloat и microburst.

Добавим RTT

А теперь давайте представим, что сервер немного дальше от клиента — буквально на 100 мс. Посмотрим, что станет с пропускной способностью. 

Speed test на проводном интернете, пинг больше на 100 мс
Speed test на проводном интернете, пинг больше на 100 мс

От 30 Мбит/с осталось только 3 Мбит/с. И это притом, что дополнительные 100 мс RTT — это пока внутри одного континента, то есть ещё не сервер с другого полушария. 

Если посмотреть внимательнее, то окажется, что сервис на скачивание отработал хорошо, а на загрузку плохо. 

Speed test на проводном интернете, пинг +100 мс, скачивание и загрузка
Speed test на проводном интернете, пинг +100 мс, скачивание и загрузка

Так произошло, потому что у сервиса, с которого speed test скачивает данные, чтобы измерить скорость, хорошо настроен сетевой стек и RTT особо не повлиял. А вот на моём устройстве стек настроен абы как, congestion control не смог адаптироваться, канал простаивал, скорость загрузки просела. 

На графике справа, как и в примерах до этого, видно: скорость увеличивается, происходит потеря пакета, маршрутизатор восстанавливается, пакеты отправляются с минимальной скоростью, которая постепенно увеличивается. То, как быстро она будет расти, зависит от времени подтверждения сервером, что пакет доставлен. Чем дальше сервер, тем медленнее увеличивается скорость отправки пакетов, — скорость адаптации зависит от RTT.

И чем больше RTT, тем ниже утилизация канала. С увеличением пинга на 100 мс скорость будет падать примерно в два раза — это верно и для кабельного интернета, и для мобильного. 

Справиться с влиянием RTT раз и навсегда можно, только если всем пользователям поставить свои серверы прямо дома. Пока мы не можем так сделать, нужно иметь в виду, что: 

  • с RTT трудно бороться, он определяется расстоянием и скоростью света;

  • в сети есть ограничения по скорости (от провайдеров) — вы изначально не знаете этих значений и можете определить их только примерно, чтобы как-то использовать, посылая контент пользователям;

  • полностью утилизировать канал трудно, в том числе из-за RTT.

Но, может быть, можно построить такой алгоритм congestion control, который смог бы полностью утилизировать пропускную способность канала связи?

В поисках идеального congestion control

Со стандартным congestion control (CC) пропускная способность сети утилизируется, как на графике слева. А мы хотели бы, чтобы было, как справа: когда мы можем точно знать пропускную способность и сразу использовать её по максимуму. 

Такие сongestion сontrol тоже есть. Кроме старых классических Loss based CC, например Cubic и Reno, которые смотрят на пропажу пакетов в маршрутизаторе, бывают Delay based CC.

Современные алгоритмы сongestion сontrol, например BBR, смотрят на время задержки: если в маршрутизаторе растёт очередь пакетов, значит, где-то что-то перегружено и нужно снизить нагрузку. Кажется, это хорошая стратегия.

На графике задержки от времени BBR выглядит отлично. Он вообще не перегружает маршрутизатор, и задержки не растут. А вот Cubic перегружает маршрутизатор, очередь переполняется, пакеты пропадают, скорость падает, восстанавливается и так далее.

Но вот что будет, если канал начнут делить клиенты с BBR и Cubic. 

Подробнее о том, почему графики такие, можно прочитать в источнике: labs.ripe.net/author/gih/bbr-tcp
Подробнее о том, почему графики такие, можно прочитать в источнике: labs.ripe.net/author/gih/bbr-tcp

Если один человек смотрит видео в сервисе, у которого в качестве congestion-control алгоритма используется Cubic, а второй по этому же каналу приходит посмотреть видео в сервисе с BBR, то он забирает себе всю полосу. 

Да, распределение перегруженной сети между пользователями случается нечасто. Но если оно произошло, то ни один congestion control не обеспечит честное (fair) деление. Например, потому что тот, кто ближе к серверу, адаптируется быстрее и лучше утилизирует сеть. 

Итого, что нужно запомнить о congestion control:

  • все СС не fair;

  • чем более продвинутый у сервиса СС, тем быстрее адаптация, лучше утилизация канала — и тем чаще он выигрывает конкуренцию за сеть; сервисам с более медленной адаптацией достаётся меньше пропускной способности, они работают медленнее; 

  • BBR настолько не fair к другим CC, что IETF попросил Google убрать его и сделать BBR2 (не забудьте обновить на серверах).

https://dropbox.tech/infrastructure/evaluating-bbrv2-on-the-dropbox-edge-network
https://dropbox.tech/infrastructure/evaluating-bbrv2-on-the-dropbox-edge-network

BBR2 по-прежнему лучше утилизирует полосу, чем Cubic, и более fair. Мы когда-нибудь перейдём на BBR2, но пока не успели.

Однозначно выбрать лучший CC нельзя. Вы можете изучить тонну чужих исследований на эту тему и попытаться следовать, например, таким схемам:

 

https://blog.apnic.net/2020/01/10/when-to-use-and-not-use-bbr/
https://blog.apnic.net/2020/01/10/when-to-use-and-not-use-bbr/

Но на самом деле всё будет зависеть от ваших клиентов, от того, какие устройства у ваших пользователей, от творящегося внутри «сетевого ада» и прочего. Поэтому любой congestion control нужно проверять по A/B

Мы ВКонтакте используем: QUIC NewReno для API, фото и статики; TCP BBR для стриминга, потому что пока по A/B это даёт лучшие результаты. 

QUIC быстрее, потому что:

  • New Reno QUIC != Reno TCP;

  • BBR QUIC != BBR TCP;

  • QUIC лучше TCP утилизирует полосу. ACK в QUIC устраняет неоднозначность, точнее оценивается RTT и полоса пропускания;

  • QUIC не fair к TCP в 2 раза.

Forward Error Correction 

QUIC позволяет реализовать превентивное исправление ошибок — Forward Error Correction (FEC). Самый простой, знакомый всем вариант избыточного кодирования: в поток данных на каждые K пакетов добавить XOR от них. Тогда в случае потери одного пакета из этой пачки пропажу можно будет восстановить без ретрансмита. Для восстановления нескольких пакетов есть более сложные алгоритмы — например, использующие коды Рида — Соломона.

Не так важно, какое именно избыточное кодирование применить. Важно, что в принципе QUIC разрешает FEC

Наличие FEC значит, что можно вообще игнорировать факты packet loss и packet drop. Неважно, какой congestion avoidance на маршрутизаторе, RED/WRED, взвешенная потеря пакетов — с QUIC и FEC можно обходить принцип честного распределения и использовать сетевой канал без ограничений. 

Всё предельно просто: в сети ваши пакеты дропнули; вы это видите и добавляете, скажем, 10% пакетов сверху, чтобы чинить потери; при этом остальные сервисы, работающие через этот же маршрутизатор, сбрасывают скорость из-за перегруженной сети. Другими словами: все сбрасывают скорость, а вы добавляете FEC — и тут же выигрываете конкуренцию за полосу пропускания. 

На самом деле, спецификация протокола предусматривает возможность FEC, но не содержит реализации. Но так как многие сервисы, использующие QUIC, реализуют протокол самостоятельно, то вполне возможно, что кто-то из них внедрит FEC у себя.  

QUIC hacks the internet:

  • congestion control лучше адаптируется к сети и не обязательно fair;

  • congestion control можно тюнить на лету;

  • congestion control можно написать свой, какой угодно;

  • FEC позволяет игнорировать потери в сети;

  • и это всё неконтролируемо.

Вы можете понять, принять и запустить это в своём сервисе. 

Скептицизм вокруг QUIC, или Реальные проблемы

Если поискать информацию о QUIC по разным тематическим интернет-ресурсам, то, конечно, встретится много вопросов и сомнений. Разберём самые популярные из них. 

«Zero-RTT есть в TCP, зачем нам QUIC?»

Действительно, можно сделать Zero-RTT в старом стеке. Для этого нужны изменения на каждом уровне сетевого стека: 

  • TCP Fast Open на уровне TCP (см. грустную историю о TFO здесь); 

  • TLS 1.3 на уровне TLS — только Android 10+. В iOS и Android сетевой API не предоставляет возможности воспользоваться TLS 1.3 0-RTT Handshake, а встроенные реализации выбрасывают session ticket задолго до истечения его TTL;

  • Early Data в HTTP. 

Это заняло лет 10 — пока на каждом уровне были найдены решения, пока операционные системы обновились, пока изменения были внедрены в браузеры и так далее. Zero-RTT реально начал работать, только когда обновились все элементы. У нас до сих пор он срабатывает только в 80% случаев. 

Вместо того чтобы тратить столько времени, можно взять с собой личный сетевой стек с QUIC — и Zero-RTT заработает сразу. 

«QUIC подвержен Replay attack»

Рядом с Zero-RTT всегда стоит replay-атака и теоретическая возможность на передачу пакета сразу же получить ответ от сервера, не дожидаясь никаких хендшейков. Такая атака может заключаться, например, в том, чтобы 100 раз повторить пакет «перевести 100 рублей» и получить уже совсем другую сумму. 

Чтобы защититься от Replay-атаки в ТСР с Zero-RTT, нужно поддержать 425 Too Early из спецификации HTTP Early Data — грубо говоря, отменять исполнение write-запросов без подтверждения. 

В QUIC есть подобное решение — Zero-RTT только для immutable-запросов. Нельзя ничего модифицировать по Zero-RTT, но можно узнать состояние ленты или даже кошелька — потому что это не позволит злоумышленнику провести невалидную транзакцию.

«QUIC не такой быстрый, как говорят»

В блогах и статьях можно встретить мнения вроде такого: «While Google-reported performance for QUIC is promising — 3% page load time (PLT) improvement on Google search and 18% reduction in buffer time on YouTube — they are aggregated statistics and not reproducible by others (such as ourselves)». 

Есть даже целые наукообразные исследования, которые показывают в основном то, как не надо проводить измерения. 

Осторожно, ссылка на вредное исследование

Дело в том, что измерять эффект QUIC на localhost не имеет никакого смысла: на localhost не воспроизводятся все те особенности сетей, которые мы обсуждали выше и которые так сильно влияют на скорость передачи данных. Чтобы действительно сравнивать сетевые протоколы, нужно делать это на реальной сети. 

Другой вопрос, что для теста невозможно получить доступ к реальному серверу другого сервиса. Google показывает результаты, которые его команда получила для своей реализации на своём окружении. Мы — свои. И когда мы только запускали QUIC и пробовали доступные решения, он тоже был не очень быстрый, но потом мы его немножко подтюнили и стало гораздо лучше. 

«UDP заблокирован на провайдере»

QUIC работает поверх UDP, не поверх TCP, и провайдеры действительно иногда его блокируют. Но сейчас, когда на волне пандемии очень выросло число интернет-звонков, которые работают исключительно по UDP, всего 1% провайдеров пытаются блокировать UDP. 

По нашим данным, UDP недоступен только у 1% пользователей. Это бывает, например, в отельных сетях, а в остальных случаях — всё хорошо и UDP с QUIC работает. 

«Сетевой протокол в User Space?»

Следующий вопрос в разных вариациях связан с тем, что QUIC реализуется в User Space. Производительность чего-либо в User Space обычно ниже, чем в ядре: там есть прерывания, конкурентный вызов и так далее. 

На самом деле, User Space — это фича

Кроме «Latency numbers every programmer should know», предлагаю каждому разработчику выучить «Release cycle numbers» и всегда иметь их в виду.

Новый код для фронтенда и бэкенда можно раскатать за час — мы ВКонтакте деплоим раз в час. На iOS и Android доставка изменений до пользователей занимает примерно неделю. Браузеры обновляются за месяц, операционная система — раз в год. Обновить что-то в ядре операционной системы на всех серверах компании меньше чем за год нереально. 

Соответственно, adoption, или скорость распространения изменений, для операционных систем измеряется в годах. На бэкенде, фронтенде и для мобильных клиентов adoption в 99% достигается максимум в течение нескольких месяцев — обновлять сетевой стек можно гораздо быстрее, чем это возможно для ядра ОС. Поэтому то, что QUIC в User Space, — это фича. 

«Performance and Linux Kernel»

Говорят, что QUIC не очень эффективен в Linux. И действительно, писать протокол в User Space невыгодно. 

Но сейчас производительность в Linux Kernel у QUIC сравнима с ТСР.

https://www.fastly.com/blog/measuring-quic-vs-tcp-computational-efficiency — статья со сравнением эффективности и шагами по её оптимизации
https://www.fastly.com/blog/measuring-quic-vs-tcp-computational-efficiency — статья со сравнением эффективности и шагами по её оптимизации

В Linux добавили ряд оптимизаций. Мы их тоже активно используем и видим не более 10% CPU дополнительных издержек с QUIC по сравнению с использованием TCP.

«Вся сеть в User Space, как отлаживать?»

Если сеть в User Space, то и за шифрование отвечает User Space. Это значит, что перехватив трафик на kernel и ниже, вы вообще его не видите. Идеальная security, но отлаживать невозможно — факт. TCP-дампов и возможности подебажить удалённо больше нет.

«Нет уровневой структуры»

Раньше всё было понятно — TCP, TLS, HTTP. А теперь какой-то хаос устроили, всё перемешали.

С этим трудно спорить, но я попробую. Все знают фразу: «Любую проблему можно решить введением дополнительного уровня абстракции. Кроме одной — слишком большого количества уровней абстракции». Мне кажется, что с сетевой моделью OSI происходит именно это — у нас просто слишком много абстракций. 

«UDP подвержен Amplification attack»

Когда DNS работает по UDP, его можно использовать для amplification-атаки. Её суть в том, чтобы от имени жертвы отправить запрос на публичный DNS-сервер, в ответ на который он отправит очень много данных и перегрузит сервер жертвы. Это возможно, потому что в UDP нет проверки IP-адресов источника. То есть в теории можно послать на какой-нибудь крупный сервис вроде ВКонтакте запрос, ответом на который будет 10 Гбит/с трафика, выбрать destination вроде Хабра и уложить Хабр. 

Протокол QUIC работает поверх UDP, почему бы не провернуть то же самое здесь.

Главное, что можно сделать, чтобы защититься от amplification-атаки, — не отвечать на запрос больше, чем вас просили. Поэтому QUIC всегда делает запросы большими, он просто дополняет их нулями до 1 350 байт (у нас ВКонтакте запросы как раз занимают около 1 000 байт). И отвечая на первые Zero-RTT запросы, мы не превышаем определённый порог по размеру данных. Поэтому провести amplification-атаки с помощью серверов ВКонтакте должно не получиться. 

«Как защититься от DDoS?»

Короткий ответ — так же, как в TCP, кроме UDP-флуда.

Для защиты от DDoS на TCP есть большой стек решений, есть сервисы и компании, которые специализируются на защите от атак. Например, есть технологии на базе DPDK, которые защищают от SYN-флуда в TCP. 

В UDP есть UDP-флуд, и от него нужно научиться защищаться, потому что решения для TCP напрямую работать не будут. Но при этом принципы атак те же, поэтому нужно по сути воспроизвести для UDP такие же задачи, какие уже решены для TCP. 

Но если вам не удалось защититься от DDoS на UDP, то у вас всегда остаётся простое решение: в любой непонятной ситуации блокируйте UDP на маршрутизаторе.

Можно просто сделать фолбэк на старый протокол, пережить DDoS, а потом уже разбираться — нормальная agile-стратегия. 

Наш вывод: QUIC уже быстрый, есть риски внедрения, но все они решаемы. 

Нет времени объяснять — внедряем!

В любом случае конкуренты уже вовсю внедряют QUIC, надо тоже что-то делать. 

Мы начали внедрять QUIC ещё в 2019 году и с тех пор попробовали три подхода:

  • gQUIC — open-source решение не совсем стандартизованного QUIC из Chromium. Оно не держало нагрузку, и по сути завести сервер не удалось;

  • quiche — решение на Rust от Cloudflare. Оно оказалось несовместимо с некоторыми нашими клиентами (см. картинку ниже); 

  • решение от Nginx — его мы активно доработали, чтобы оно стало нас устраивать. 

interop.seemann.io
interop.seemann.io

Эта табличка показывает совместимость серверных и клиентских реализаций QUIC. Все серверы проваливают какие-нибудь тесты и часто не могут нормально общаться даже между собой, не то что с другими. Никто ещё не сделал стандартную реализацию — у всех QUIC немного свой. И, конечно, крупные проекты свои продакшен-решения для сервера не отдают.

Наше решение nginx-quic мы хотим отправить в upstream, но уже сейчас его можно взять с нашего GitHub и использовать у себя. В нём мы сделали много всего, например:

  • изменили приоритеты для отправки системных пакетов;

  • MTU discovery — определение максимального размера пакета;

  • новый congestion control;

  • и множество менее значительных изменений и фиксов.

Подробнее можно посмотреть в докладе Ильи Щербака или позже в виде статьи в нашем блоге. 

Кроме того, мы перепробовали несколько клиентских решений под iOS и Android, выбрали одно из них и доработали так, что для внедрения протокола потребуется добавить всего несколько строк кода. Наш клиент для QUIC также доступен в open source.

Продуктовые результаты от смены стека

Из названия статьи понятно, что оптимизации сработали и мы получили очень существенное ускорение в работе сервиса. Но рассмотрим полученный эффект детальнее, чтобы вы могли лучше прикинуть пользу для своих задач. 

Результат перехода на QUIC:

  • на 45% снизилось время доставки изображений; 

  • на 2% сократилось время ответа API, потому что основной вклад в него вносит работа бэкенда. И несмотря на то, что доставка API стала быстрее в десятки раз, пользовательский эффект небольшой;

  • на 1,6% выросло число просмотров контента — мы ускорили доставку, и за то же время пользователи могут посмотреть больше контента.

Перемножив результаты от внедрения QUIC и алгоритмов сжатия, получили суммарное ускорение в 2 раза

Причём сначала мы обкатывали новинки на Германии, Бразилии и Молдавии — странах с тем самым RTT в районе 100 мс — там ускорение достигало 4 раз. 

Полный результат ускорений:

  • на 55% быстрее доставка;

  • на 2,7% больше просмотров контента;

  • на 250 млн больше просмотров событий в рамках ВКонтакте.

Может показаться, что год работы не стоит того, чтобы повысить просмотры контента на 2,7%. Но давайте решим школьную задачку.

Дано: рост просмотров по всей ВКонтакте равен 2,7%. Предположим, что у четверти нашей аудитории слабый интернет. 

Найти: на сколько вырастут просмотры у тех, кто пользуется ВКонтакте в плохих сетях — где наши оптимизации действительно имеют значение.

Решение: 0,027 / 0,25 = 10,8%

То есть люди, у которых не очень хороший интернет и которые из-за этого в принципе не очень активно пользуются интернет-сервисами, стали смотреть на 10% больше контента. Да, в абсолюте это может быть всего 2,7%, но на самом деле это очень существенный прирост на части аудитории. 

Будущее, которое уже наступило

Вычислительные ресурсы растут быстрее, чем качество сетей. Поэтому, скорее всего, появятся ML-кодеки, которые будут сжимать фотографии в 10 раз лучше, чем привычные нам алгоритмы. Возможно, им будет требоваться очень много CPU-ресурсов и они будут жрать батарею, но для этого телефоны и становятся мощнее и эффективнее. 

С алгоритмами сжатия, думаю, будет примерно то же самое, что и с форматами кодирования. 

В сетевом стеке всё ещё интереснее — QUIC и его реализации в User Space позволяют теперь добавить много эвристик. 

Во-первых, можно и хитро восстанавливать данные с помощью FEC, и обрабатывать потери так, чтобы это ни на что не влияло. Например, видео или фотографию можно отобразить, даже если пропали пакеты с несколькими пикселями — думаю, скоро это будет добавлено. 

Во-вторых, можно строить congestion control не на точных измерениях, а на основе ML-моделей или статистики. Сейчас мы пытаемся измерить пропускную способность и подстроиться под неё, а могли бы взять статистику по IP-адресу пользователя, учесть в ML что-нибудь ещё и сразу выйти на новый нужный порог congestion. 

В-третьих, можно предсказывать параметры сети, например пропускную способность, процент потери пакетов и другое. 

Наш ML-отдел просчитал, можно ли угадать скорость доставки изображения и что для этого нужно. Оказалось, что её можно предсказать с AUC 0,75 в зависимости от размера картинки, уровня сигнала сети на телефоне, IP-адреса, гео, ошибок и других параметров.

Используя такое предсказание, можно понять, например, что загрузка картинки займёт секунду, и на бэкенде принять решение, что лучше её сначала сжать или отправить в другом разрешении. 

Также с неплохой точностью можно угадать качество сети. Главными характеристиками будут IP и сила сигнала на мобильном телефоне. А потом уже такие показатели, как оператор, тип устройства, ОС, количество ошибок в подсети и другие. С AUC 0,75 можем классифицировать сеть и сразу же подстроить под неё congestion control.

Сетевая конкуренция

Раньше congestion control конфигурировался в ядре, все были «почти» равны — IETF принимал правила игры, а разработчики могли только чуть-чуть менять настройки. Теперь можно сделать свой congestion control чуть ли не для каждого пользователя. С одной стороны, это даёт простор для манёвра и позволяет нам лучше утилизировать сетевые ресурсы. С другой — этим могут воспользоваться и другие сервисы. У кого лучше алгоритм CC, тот получает преимущество — возникает сетевая конкуренция.

Раньше всё управление интернетом проходило через IETF, который следил, чтобы изменения в протоколах не ломали надёжность, безопасность и прочее, в том числе баланс. Теперь и IT-корпорации, и энтузиасты могут не советоваться с IETF и использовать особенности интернет-протоколов для собственной выгоды.

Распространение QUIC

По данным W3Techs, 22,2% всех сайтов используют HTTP/3.

Хотя, возможно, эти 22,2% измеряются в трафике или количестве запросов. В списке сайтов, работающих по HTTP/3, там приводится только Google, Facebook и Cloudflare.

Поэтому я провёл своё небольшое исследование: проверил российский топ-50 сайтов из списка Alexa с помощью сервиса HTTP/3 CHECK. В нём можно вбить адрес сайта и узнать, поддерживаются ли QUIC и HTTP/3. 

Итого, если судить по W3Techs, HTTP/3 CHECK и новостям в интернете, то QUIC уже внедрили:

  • Google для всех своих сайтов, в том числе YouTube и Gmail;

  • Uber — и получил классный прирост, так как его пользователи как раз часто перемещаются и переключаются между станциями;

  • Facebook (вместе с Instagram и WhatsApp) запилил собственный стек — с абсолютно своей реализацией и для сервера, и для клиентов;

  • Snapchat присоединился к этому списку совсем недавно;

  • и ВКонтакте, единственная из крупных российских платформ, успешно внедрила QUIC в сентябре 2021 года.

Выводы

  • Доставку контента можно и нужно оптимизировать.

  • Крупные компании развивают протоколы доставки и форматы сжатия — используйте их и не отставайте.

  • Существует реальная сетевая конкуренция в сфере доставки контента и, хотите вы или нет, в ней придётся участвовать. 

  • Теперь вы знаете, какой профит можно получить и где взять решение: сервер — github.com/VKCOM/nginx-quic, клиенты — github.com/VKCOM/KNet

QUIC уже можно использовать, он позволяет ускориться в разы. Но никому не верьте на слово — проводите A/B, используйте метрики, проверяйте работу различных решений в своём случае. 

Комментарии (204)


  1. Shaz
    20.01.2022 12:43
    +64

    Ура! Теперь реклама скама будет приезжать быстрее. Спасибо.

    Картинка


    1. Number7
      20.01.2022 23:22
      +31

      на самом деле достаточно будет добавить в настройки юзерского профиля опцию:
      [ x ] "я согласен отключить показ рекламы в ленте, потому что я все равно на нее не кликаю"

      после чего и скорость загрузки контента и глубина просмотра и вовлеченность аудитории повысятся в разы... простое решение, но тогда зачем держать штат админов и тратить бюджет на кучу железа и софта? :))


      а по факту: загрузка ленты лагает, открываешь группу - до 3-5 сек лаги на прогрузку, картинки в группе лагают забавно: первая всегда прогружается быстро, вторая или третья лагает до 30 секунд. а иногда вообще лагает пачка картинок, так что проще закрыть группу (и не посмотреть рекламный блок).
      А так да, время ожидания пока все прогрузится видимо считается в статистику как увеличение пользовательского интереса.

      PS. насчет опции отключения рекламы это не шутка. Я рекламу в ленте в упор не вижу, только миссклики 2-3 раза в год делают статистику моего CTR.


      1. nebularia
        21.01.2022 10:11
        +7

        Так ещё и при отключённой автозагрузке видео, видеореклама продолжает грузиться и воспроизводиться... =/


    1. Lure_of_Chaos
      22.01.2022 06:49

      Да, рекламы стало больше и грузится только она, зайти в чат и ответить человеку - по-прежнему несбыточная мечта

      не в сторону администрации ВК, но в целом - ВК паблики более чем полностью состоят из рекламы на рекламу (классический дорвей)


      1. Shaz
        22.01.2022 18:31

        Я не то чтобы против рекламы, понятно что надо зарабатывать, но блин, можно же как-то фильтровать откровенное мошенничество. Окей если это какой-то паблик продвигает, все на совести их админов. Но нет, это нативка вк.


  1. nin-jin
    20.01.2022 12:44
    +158

    Как мы отказались от JPEG, JSON, TCP и ускорили ВКонтакте в два раза

    Как пользователь я вижу скорее обратную ситуацию: вконтакт всё сильнее тормозит, особенно на нестабильном соединении. 20 мегабайт скриптов, которые грузятся 2 минуты, это совсем зашквар. Не в том месте вы оптимизируете


    1. tangro
      20.01.2022 15:03
      +54

      Чтобы оптимизировать это место нужны люди, способные сказать начальству "та вы задолбали пихать это говно сюда!" - а откуда же такие возьмутся, если деньги тебе платят как раз за обратное?


      1. nin-jin
        20.01.2022 15:35
        +56

        Архитектор тут нужен нормальный, который разгребёт эти авгиевы конюшни, а не толпа олимпиадников, закатывающих Солнце вручную.


        1. twenty
          20.01.2022 16:35
          +12

          Дима, привет! Нам сейчас как раз не хватает опытных ребят, вроде тебя, которые помогут разгребать авгиевы конюшни.

          https://vk.com/jobs?w=job517


          1. nin-jin
            20.01.2022 18:28
            +42

            А меня ваши HR уже как минимум 4 раза хантили.

            Первый раз предложили сделать тестовое задание и пропали в ответ на предложение его оплатить.

            Второй раз меня уже позвали на экскурсию и дали порешать задачек на листочке, а потом просто забыли.

            Третий раз очень удивлялись, что во второй раз про меня забыли, поэтому снова провели экскурсию, посулили придумать интересное тестовое задание и.. опять забыли.

            Ну а в четвёртый раз про меня всё же не забыли:

            Беглый анализ вакансии

            Ну, я вижу, что вы выбрали самый не эффективный технологический стек. Поэтому текущие программисты разрабатывают не очень быстро. Что требует постоянное наращивание штата исполнителей. А рынок труда дефицитный, поэтому толковых разработчиков найти сложно. Даже с учётом того, что была выбрана самая популярная технология. Результат этого пути видно по приложениям: что мобильное, что веб очень тяжеловесные и сильно тормозят. А чтобы хоть как-то это оптимизировать - это нужно много времени, которого и так не хватает. Поэтому всё катится по наклонной.

            Если более конкретно:

            • React/Redux - много бойлерплейта, плохая производительность по умолчанию, куча подводных граблей, замедляющих разработку.

            • styled-components - плохая кастомизируемость компонент, что порождает горы копипасты, слабая типизация.

            • normalizr - свидетельствует о кривой выдаче сервера, которую исправляют на клиенте, вместо исправления сервера. Причём замедляет это не только клиент, но и сервер, так как ему дешевле выдавать данные сразу в нормализованном виде.

            • Enzyme - хрупкие тесты, замедляющие разработку.

            Я предпочитаю прежде всего интенсивное, а не экстенсивное развитие. То есть правильным выбором технологий можно повысить продуктивность программистов на порядок, что позволило бы ещё долго даже не думать о расширении штата, при этом выдавая результат куда быстрее и качественнее. Но для этого у руля должен стоять человек с соответствующим опытом. Но таких вакансий, как обычно, нет.)

            • я уточню у коллег, возможно в других продуктах сейчас есть открытые вакансии на руководящие ставки и вернусь к тебе

            • Пока у коллег тоже не нашлось подходящих вакансий????

            Вот и получается, что тормозит даже тривиальное приложение, написанное с нуля на самых распоследних технологиях.


            1. Doman
              20.01.2022 20:00
              +4

              Добрый день! А можете, пожалуйста, написать какие UI тесты будут не хрупкими и не замедляющими разработку?


              1. nin-jin
                20.01.2022 20:19
                +10


            1. Rukis
              22.01.2022 09:57

              Ну, я вижу, что вы выбрали самый не эффективный технологический стек.

              React/Redux - много бойлерплейта, плохая производительность по умолчанию, куча подводных граблей, замедляющих разработку.

              Поделитесь, пожалуйста, менением, какой стек был бы лучшим в обсуждаемом контексте?


              1. nin-jin
                22.01.2022 10:18
                -2

                React -> $mol_view

                Redux -> $mol_wire

                Тут подробности почему:


          1. Mi7teR
            21.01.2022 13:15
            +4

            о, вк переедет на $mol


            1. Massacre
              21.01.2022 13:50
              +2

              И будет работать только в последних версиях браузеров(


              1. nin-jin
                21.01.2022 14:22
                +1

                Зато рекламой спамить не будет.


    1. Timofeuz
      20.01.2022 15:18
      +12

      Присоединюсь со своей колокольни. Раньше настройки качества видео запоминались для сессии. С какого-то момента оно теперь каждый раз автоматическое, что жутко бесит на моем не особо толстом канале.


    1. Sektor2350
      20.01.2022 16:32
      +7

      Присоединяюсь к комментарию. То картинку открываешь она долго грузит, то видео. Либо вообще раздел какой-то открываешь и оно просто тупит и после подгрузки ЖыЭса подгружает. Да и многие знакомые начали высказывать о VK, о том что mail-***** накрутила.


    1. kowack
      20.01.2022 16:49
      +38

      Согласно А/В тестам теперь вы проводите на сайте на 2 минуты дольше — в релиз!


    1. mortadella372
      20.01.2022 17:16
      +4

      Оптимизируют в том месте, где у компании расходы — сторедж, трафик..


      1. Keyten
        21.01.2022 07:32
        +1

        Обычно mail.ru так и делает.


      1. nin-jin
        21.01.2022 09:05
        +5

        Думаю оптимизация ФОТ тут дала бы больший эффект.


        1. mvoronin
          22.01.2022 02:28

          Что такое ФОТ?


          1. gecube
            22.01.2022 02:56

            Фонд оплаты труда


    1. andreyiq
      20.01.2022 20:28
      +7

      Почему не в том? Во-первых 20МБ наверняка не в сжатом виде, во-вторых они должны закешироваться и вы про них забыли, в третьих 20МБ это пара десятков изображений, а ВК подразумевает, что вы грузите тысячи изображений, ну и в четвёртых бекэндер рассказал про оптимизации со своей стороны


      1. nin-jin
        20.01.2022 20:53
        +13

        Почему не в том?

        Потому что это латание дыр в тонущем корабле.

        20МБ наверняка не в сжатом виде

        В сжатом 4 метра. Скажете это мало?

        они должны закешироваться

        И никогда не обновляться. Но даже из кеша поднимать 20 метров скриптов - это не слабо греет батарейку.

        20МБ это пара десятков изображений

        Которые могли бы загрузиться, если бы канал не был забит скриптами.

        ВК подразумевает, что вы грузите тысячи изображений

        Скорее десяток превьюшек и чуть крупнее при клике.

        бекэндер рассказал про оптимизации со своей стороны

        Которые пользователю просто не видны.


        1. andreyiq
          20.01.2022 21:21
          +2

          В сжатом 4 метра. Скажете это мало?

          копейки, первое же видео выкачает в разы больше

          Которые могли бы загрузиться, если бы канал не был забит скриптами.

          так они уже в кеше, поэтому никак на канал не повлияют


          1. nin-jin
            20.01.2022 21:30
            +8

            Я как-то в поезде ехал из Москвы в Питер на пафосе соло в двухместном вагоне, но тут ВК сказал мне "подержи моё пиво". Текстовый чат пол часа открывался и сообщения отправлялись с десятой попытки. О видео я мог даже не мечтать.


            1. andreyiq
              21.01.2022 06:52
              +3

              сообщения отправлялись с десятой попытки

              Как это связано с размером скриптов?


              1. nin-jin
                21.01.2022 14:23
                +7

                Это связано с хреновым UX, где повторять запросы на нестабильном соединении приходится вручную.


    1. icCE
      20.01.2022 23:09
      +1

      я бы тут докинул , что после факапа mozilla с http3 , многие его отключили и скорее всего не включили обратно. Все еще не все браузеры его поддерживают, QUIC  не все пропускают (да да есть и тут проблемы). На хреновых сетях, QUIC  ну и про zstd - тут бротли то не все поддерживат нормально. В общем модно стильно молодежно и делать конечно надо, но все не так радужно как хочется.


      1. gecube
        21.01.2022 18:41
        +3

        QUIC вероятно отличный вариант для СВОЕГО МОБИЛЬНОГО приложения. Вот сами подумайте - какова доля тех кто заходит в ВК с браузера, а кто - с нативного клиента из апстора. И каково распределение по устройствам...


    1. klounader
      21.01.2022 02:04
      +13

      когда они музыку оптимизировали, это было днище. задолбаешься искать чего-то там, свою музыку бегаешь по вкладкам и тумбочкам ищешь. когда видео оптимизировали — этим говном вообще стало пользоваться невозможно. яйцы бы оторвать этим оптимизаторам.


    1. gecube
      21.01.2022 18:38
      +1

      они решили перегнать фейсбук в изощренности (я не хочу ругаться, но тут было нецензурное слово) и тормознутости интерфейса... а чо - конкурентов на горизонте все равно нет


    1. wapmorgan
      21.01.2022 19:20
      +2

      У них и акции оптимизировались на 72% с момента выхода на биржу, за полтора года!

      Отрицательный рост - тоже рост!


  1. andreykour
    20.01.2022 12:45
    +1

    Интересная статья, спасибо!


  1. Javian
    20.01.2022 12:46
    +5

    Нет времени объяснять — внедряем!

    Во во! Именно недавно об этом подумал, когда разобрался с проблемой пользователя мобильного приложения ВК - с десктопа сайт открывается, с мобильного приложения открыватся, а мобильное приложения без контента - пустая лента, пустые сообщения и прочее. Оказалось там у мобильного приложения есть нечто, что adblock блочит. Скорее всего трекеры - дальше не рыл. При работающем vpn у пользователя проблемы с содержимым приложения нет.


  1. vvk78
    20.01.2022 12:54
    +13

    Фундаментально


  1. kasiopei
    20.01.2022 12:57

    Обфускацию конечно делать не нужно)


  1. Massacre
    20.01.2022 13:22
    +65

    Это стоило бы назвать «Как мы испортили кучу изображений, пережав из одного формата с потерями в другой такой же». Хотя бы в JPEG-XL пережимали бы — там можно как раз конвертировать в новый формат без потерь (утверждается про выигрыш в 20%), правда, пока что этот формат поддерживается только последними версиями браузеров, да и то не по дефолту. Но явно за этим форматом будущее, т.к. единственный из новых, оптимизированный для сжатия изображений, а не видео.

    А про самый медленный уровень у вас сейчас… Нет, он не сетевой. Он находится в JS, и про 20мб тормозящих скриптов там выше правду написали. Оптимизируйте лучше это, да.


    1. ganzmavag
      20.01.2022 14:09
      +14

      Кстати вот та же мысль возникает при чтении рекомендаций по переходу на webp. У меня на практике не получалось этого "выглядит как jpeg, а весит меньше". Выходило, что либо очень заметны артефакты, либо экономия призрачная. Возможно, если жать сразу в webp, то будет нормально. Или хотя бы жать в момент конвертации загруженного многомегапиксельного исходника с камеры в картинку на 1280 пикселей. Но пережимать уже маленький jpeg в такой же маленький webp - значит скорее всего сильно потерять в качестве. Когда речь, например, о художественных снимках, очень критично.


      1. Torrion
        20.01.2022 14:19
        +2

        У меня на достаточно простых изображениях получалось получить уменьшения размера в разы, и даже на порядок, при визуально неотличимой разнице между jpeg и webp . Но с чем-то похожим на художественные снимки работать не приходилось, возможно там действительно разница уже не такая значительная.


        1. VEG
          20.01.2022 14:52
          +20

          У меня на достаточно простых изображениях получалось получить уменьшения размера в разы, и даже на порядок, при визуально неотличимой разнице между jpeg и webp .
          Вероятно, у вас были очень неоптимизированные JPEG. Например, с камеры (там очень упрощённое сжатие). На самом деле, WebP иногда даже оказывается хуже JPEG. На более высоких уровнях качества JPEG точно лучше WebP (если не считать lossless) из-за низкого цветового разрешения WebP, которое он унаследовал от видеокодека VP8. Из-за этой особенности в принципе нельзя получить WebP lossy хорошего качества, всегда будет потеря деталей из-за того что в полном разрешении хранится только чёрно-белая версия изображения (luma, один канал), а цветовая информация (chroma, два канала) всегда с вдвое меньшим разрешением. JPEG тоже так умеет, но в нём это опционально, на высоком уровне качества можно сохранять все цветовые детали в полном разрешении. В зависимости от изображения, это может быть очень заметным. То есть, с WebP lossy даже на самом высоком уровне качества могут быть хорошо заметные цветовые искажения (обычно на контрастных границах), от которых никак не избавиться, если не использовать lossless.

          WebP lossless — это на самом деле отдельный формат (его поддержка даже не одновременно с WebP lossy появилась), и если его сравнивать с PNG, то по крайней мере он оказался неплох.


        1. Massacre
          20.01.2022 18:51

          Вы потом ресайз (без сглаживания) сделайте оригиналу и получившемуся webp, затем посмотрите на количество свежих артефактов в увеличенном масштабе :)


      1. perfect_genius
        20.01.2022 14:47
        +1

        А ещё цвет или тон заметно искажает.


        1. Balling
          21.01.2022 06:34
          +1

          ICC профили сейчас в любом iphone даже если снимаашь в avif. Display P3 профиль там правда ужасный... С отрицательной z в красном после color adaptation до D50 per ICCv4.


          1. Spaceoddity
            22.01.2022 03:50

            Только Хромиум и понятия не имеет про эти ваши профили. Вы не поверите - даже в Фигме (сделанной как раз на движке Хрома) нет управления цветом. Т.е. в софтине, предназначенной для создания дизайн-макетов, нет управления цветом. Всем вдруг стало плевать на эти ваши CMS. Вырвиглазно - норм!


            1. Balling
              22.01.2022 07:22

              Все работает в самом chrome. Так что...


      1. gecube
        21.01.2022 18:45
        +1

        бурно плюсую

        https://photocrew.ru/blog/67-vkontakte-portit-fotgrafii.html

        Где-то я видел такую же критику для фоток, которые были загружены когда-то давно. Пользователи наивно думали, что фотографии будут неизменны на протяжении лет, а хрен там был. Место на дисках само за себя не заплатит


    1. landy
      20.01.2022 17:12
      +11

      Реальность еще хуже я думаю :)

      Пользователь отправляет свой JPEG, который пережимается (оптимизируется) при сохранении в VK, а потом это еще и в другой формат конвертитуют.


  1. iliasam
    20.01.2022 13:32
    +2

    Интересно, а скорость распаковки JPEG и WebP на телефоне отличается? В тексте сказано, что алгоритм WebP более ресурсоемкий.


    1. Torrion
      20.01.2022 14:07
      +4

      На своих проектах разницу в скорости отрисовки одинаковых jpeg и webp картинок, находящихся прямо на девайсе мы не проверяли, но уменьшение размера картинки на порядок за счет перехода к webp дает ощутимый прирост к отзывчивости приложения, если картинка грузится по сети. Условно, даже если на отрисовку webp телефон тратит на 1 мс больше, чем на jpeg, то это с лихвой окупается за счет ускорения загрузки на 100+ мс.


      1. Balling
        21.01.2022 06:37
        -3

        Вы хоть понимаете, насколько более оптимизирована TurboJPEG библиотека по сравнению с тем, что там google родил в своем webp? Мда.


        1. Alendorff
          22.01.2022 02:38
          +4

          Нет. Расскажите?


  1. akomiagin
    20.01.2022 13:46
    +4

    Спасибо за подробный отчет по оптимизации! Очень интересно. А почему вместо JSON не перешли на BSON, не меняя все остальное? Возможно, тогда бы не было вилки для небольших и больших страниц. По возможности поделитесь информацией.


  1. AWE64
    20.01.2022 14:06
    +8

    Что за процессор 300 кГц?


    1. Riddlah
      20.01.2022 15:58
      +5

      Возможно речь о 8008 (200-800КГц), но там не до диалапа точно было)


      1. K0styan
        20.01.2022 16:38
        +7

        Тоже зацепило соседство килогерцовых процессоров и диалапа, даже перечитал фразу. Строго говоря, она не говорит напрямую, что это было одновременно или в рамках одного девайса, просто что и с тем, и с тем приходилось дело иметь)


    1. 5oclock
      20.01.2022 16:12
      +6

      В 1960е годы у машин примерно такие тактовые частоты были.
      Может быть автор их застал ¯\_(ツ)_/¯


      1. Oxyd
        20.01.2022 20:26
        +7

        Ой вряд-ли... 32 килобайта памяти и единицы мегагерц, это конец 70-х, начало-середина 80-х. Но не в этой стране. Не думаю что автор застал ЕС/СМ/ ДВК/БК.


        1. Valser
          20.01.2022 22:10
          +12

          Pentium II 300 мГц 32мБайт память , как раз по возрасту автора и начало диалапа. Он просто попутал килобайты и мегабайты


          1. klounader
            21.01.2022 02:14
            +7

            автор во время запуска этих машин только родился. он не может их помнить априори. пень второй он мог иметь опять же только лет в 13-15, и то это наверняка был крутой папин комп. сам по сути особо не помнит, но пытается козырять какой он дядька детишкам, которые «ностальгируют» по временам, когда трава была зеленее, а процессоры ламповее.


            1. BearLion
              21.01.2022 10:23
              +4

              Вы чет совсем уж ерунду пишите. Автор мой ровестник, мой первый комп 386sx, около 30мГц, 764Кб оперативки, это был мой 5-ый класс, конечно, не новый комп, но тогда они были у единиц. И я отлично помню, как пытался doom запустить на этой тачке. И весьма возможно, что автор начал знакомится с компами и раньше моего.


              1. klounader
                21.01.2022 13:45
                +2

                так второй пень в его 13 лет это самый топ, примерно седьмой класс. ваш 386 в вашем 5м классе был таким же устаревшим барахлом, примерно как у меня сейчас сион е5450. комп, конечно, не новый, но вот прямо с него вам привет передаю.)


            1. PsyHaSTe
              22.01.2022 02:20

              Люди родившиеся в 93м помнят 386й, вы думаете автор сильно моложе? Не уверен


              1. klounader
                22.01.2022 02:56
                +2

                пусть помнят, это их детство.


    1. Valser
      20.01.2022 22:08
      +2

      Там опечатка, 300мегагерцовый процессор, посмотрите возраст автора и начала диалапа в его родном городе.


      1. AWE64
        20.01.2022 23:19
        +3

        Я примерно прикинул, и поэтому удивился. Получается, либо опечатка два раза, т.к. в скобках дано пояснение (кило — не гига!), либо автор сильно старше чем мы думаем)


  1. Elepse
    20.01.2022 14:07
    +4

    Всё по полочкам, очень полезным был экскурс в работу сети. Спасибо!


  1. Travisw
    20.01.2022 14:26
    +6

    Дооптимизировались что смотреть картинки в вконтакте такие убожеские на новых устройствах совсем по сравнению с тем же инстаграмом


  1. ermouth
    20.01.2022 14:34
    +41

    У вас ошибка в заголовке в слове «ускорили», правильно пишется «замедлили». Всё ваше километровое нечитаемое пыжево про отказ от того-сего и модную героическую движуху по оптимизации – полная ерунда с тз пользователя: вК откровенно тормозит, и тормозов со временем становится только больше.


    1. d33
      20.01.2022 19:43
      +25

      *Ускорили вконтактик в 0.7 раза.


      1. gecube
        21.01.2022 18:47

        но только на новых айфонах... пользователи старых андроидов с процессора загруженными под 100% нервно курят в сторонке

        Пора бы вконтакте проспонсировать покупку каждому гр-ну РФ нового телефона со встроенной системой слежения от майора.


    1. ildarz
      21.01.2022 12:47
      +4

      с тз пользователя

      Очевидно ведь, что статья написана не для пользователя, и притягивать к ней за уши проблемы с вышележащим слоем не слишком осмысленно. Как админу мне было интересно почитать даже несмотря на то, что у меня совершенно другая область работы.


      1. ermouth
        21.01.2022 13:23
        +1

        Очевидно ведь, что под глаголом «ускорили» подразумевается ускорение для пользователя.

        Так вот, никакого ускорения нет, есть замедление – ребята врут прямо с заголовка. Да и дальше в тексте не всё гладко типа громких заявлений, что webp лучше жмёт. Если открыть jpeg-картинку и пересохранить даже в тот-же jpeg с теми же настройками компрессии, тоже будет «лучше». И в публикации такое примерно всё (то есть кроме откровенного мусора).


        1. ildarz
          21.01.2022 14:33
          +4

          Очевидно (да и прямо написано), что под глаголом "ускорили" понимается конкретно доставка контента. Более того - даже написано, что в реальности повлияло это все практически только на загрузку картинок.

          Да и дальше в тексте не всё гладко типа громких заявлений, что webp лучше жмёт. 

          В тексте, насколько я вижу, дается в том числе реальная статистика по собственным данным, а не просто абстракции и чужой опыт. Да еще с дисклеймерами "в вашем случае все может отличаться, думайте сами". Если у вас она другая - ну ок, но ситуацию для данного конкретного кейса это меняет как?


          1. ermouth
            22.01.2022 13:20
            -1

            Вы не поняли. Плохо именно с доставкой, и «реальная статистика» по пережатию – просто чушь собачья, с тем же успехом можно от файлов последние 20% отрезать и говорить «вот, улучшили же». Да и к слову даже если жать с нуля (с непережатого оригинала) выигрыш у webp против mozjpeg только для небольших картинок – и как раз именно они в вК и не пережаты.


    1. PsyHaSTe
      22.01.2022 02:21
      +2

      Мне кажется это не очень справедливый упрек. Возможно статью стоило назвать "как мы пытались скомпенсировать все более тормозной фронт на своей стороне" :dunno:


    1. justmara
      22.01.2022 12:07
      +1

      ну это де классический уроборос: технические команды бьются над оптимизацией и ускорением (на своём уровне - алгоритмы, протоколы), которая под ноль сжирается стремительно растущими аппетитами продуктовых/маркетинговых команд (больше контента и за меньший TTM и потому руками обезьян, собирающих кадавров из лего).


      1. ermouth
        22.01.2022 13:12

        Тут тоже фронтэнд виноват, ага.


        1. justmara
          22.01.2022 13:43

          а жпеги на этом скриншоте не намекают о том, что эта выдача не имеет никакого отношения к описанному в статье?


          1. ermouth
            22.01.2022 13:56

            Ой, простите, скорость работы выдачи вК надо же теперь мерять только по webp ггг. А то конечные пользователи и не узнают про героизьм бэкэндеров – глазами то только тормоза видны.

            И в 3-секундных джпегах по 5 кб и выдаче списка с TTFB в 2 секунды тоже фронтэндеры проклятые виноваты.

            Вот ещё нашлось про героев бэкэнда: 452 кб пустоты выдачи бэкэнда, сжатые до 367 байт – это тоже всё фронтэнд виноват.


            1. justmara
              22.01.2022 14:27
              +1

              ещё раз: вы пытаетесь на заведомо некорректном примере показать, что всё описанное в статье не работает. проблема в примере - на нём нет ничего, описанного в статье.

              я не работаю в вк и не имею к ним никакого отношения, так что я не защищаю их. я лишь удивляюсь от явно нелепых претензий "уминянеработает", с помощью которых пытаетесь доказать отсутствие эффекта от работ, описанных к статье. притом рвя рубаху и потрясая примерами, которые не имеют отношения к тому, что описано в статье.

              там явно и недвусмысленно сказано:
              1. основная польза именно на доставке картинок: конвертация + оптимизация использования канала + меньший оверхед
              2. на data-вызовах (а именно api calls) польза на уровне погрешности измерений и её вообще можно игнорировать
              вот эта картинка
              https://habrastorage.org/r/w1560/getpro/habr/upload_files/514/35d/d7f/51435dd7fb02fb5499d5303ab5d7c7c0.png

              в итоге вы тычете выдачу в jpeg, а затем json call на api в качестве примера "НИРАБОТАЕТ!". логика где?


  1. sled
    20.01.2022 14:36
    +1

    Начиная читать статью все догадались, что из себя представляет из себя модифицируемый объект-система? Какая его концепция, архитектура, фреймворки, языки и взаимодействие между ними? Я лично вводной части не увидел.


  1. MagisterLudi
    20.01.2022 14:40
    +6

    Забыл название, в экономике есть такой парадокс.
    Чем сильнее мы оптимизируем процесс, который создает самую высокую нагрузку, тем больше нагрузка возрастает.

    Пример: в городе Н все пользовались лампами накаливания и это давало большущую нагрузку на электросеть. Придумали энергосберегающие лампочки и нагрузка на сеть… возросла!!! Потому что народ вместо одной старой лампы стал покупать 10 энергосберегающих и пихать их везде, они же не такие вредные как старые.


    1. perfect_genius
      20.01.2022 14:50
      +5

      Парадокс Джевонса
      Т.е. ВК начали пользоваться чаще, потому что он ускорился, поэтому он стал тормознее?


      1. MagisterLudi
        20.01.2022 16:10
        +18

        не
        они оптимизировали показ рекламы, поэтому стали загружать не 1 объявление а 10


    1. cepera_ang
      20.01.2022 16:16
      +4

      Просто уменьшение стоимости открывает ранее подавленный спрос. И в целом это же хорошо — суммарно становится доступно большее количество благ.


      1. Zalechi
        20.01.2022 19:34

        Не, там не так очевидно, как кажеться. Все эти диодные лампочки, это не просто свет в вакууме, это куча побочных технологических прорывов. Загляните за переборку из гипсокартона. Сколько там и сям понатыкано этих светодиодных лент? Одна за шкафом, другая на изголовье кровати, третья в ванной над умывальником. Такие красивые: сиреневые, желтые, красные, - переливаться туда сюда.

        Никто не спорит, что это красиво и уютно, но факт есть факт. Энергосбережение не пришло само в этот мир, ему сопуствуют и другие технологии из мира электрики и строй-дизайна. Да и не только строй)))


        1. klounader
          21.01.2022 02:40
          +7

          помимо этих «энергосберегающих» технологий, они стали генерировать кучу мусора физического, захламлять радиоэфир некачественными электронно-схематическими решениями, нагрузка на зрение выросла голимой цвето и светопередачей, а в дешёвых решениях ещё и откровенной пульсацией. отчего общее внутреннее состояние организма человека приходит в упадок. и на всём этом фоне просто всё становится грустно. дооптимизировались. но т.к. выхода из этого всего болота не шибко много, то выбора особо нету, оно везде теперь такое.


          1. Zalechi
            21.01.2022 08:41
            +1

            Дельное замечание. Стробоскоп.


        1. cepera_ang
          21.01.2022 10:22
          +1

          Я не понимаю как ваше уточнение изменяет то, что я сказал. Более дешевое освещение в энергетическом плане, более дешевое в плане требований (не нужно рассеивать сотни ватт, у накаливания или подводить кислород и топливо как к керосиновой лампе/свечам) ведет к большему использованию. Всё как я и говорю — свет был желаем во всех этих местах, где сейчас ставят лампочки, а раньше не ставили, но был слишком дорог (в широком смысле этого слова).


          1. klounader
            21.01.2022 14:00
            +1

            дороговизна на свет и пропаганда энергосберегающих технологий создана искусственно, дабы скрыть проблемы нехватки мощностей на старой электропроводке при стремительно увеличивающейся мощной нагрузки в каждом доме в виде бытовой техники. повальный переход на электроплиты с электрочайниками и прочими микроволновками повлиял на нагрузку уже существующих электростанций при отсутствии новых. лампы накаливания и правда имеют очень низкое кпд освещения по современным меркам, но светодиодные лампочки в большинстве своём до сих пор половина из них барахло, и люди этим всё равно пользуются, потому что продаётся в любом фикспрайсе за 50 рублей. а на качественную лампочку за 200 рублей не каждый желает раскошелиться под лозунгом «и так сойдёт».


    1. Exclipt
      20.01.2022 22:10
      +3

      Очень сомнительный пример, попробуйте поставить вместо стандартной советской люстры на 3х60Вт лампы - светодиодных на 180Вт. Даже не так, светодиодных на 120Вт и еще лишние 60Вт в кладовку. Даже не считая, сколько это будет стоить, просто прикиньте, насколько весело будет в такой комнате находиться.


  1. Gordon01
    20.01.2022 15:04
    +21

    ускорили ВКонтакте в два раза

    мне кажется, вы просто сделали все, чтобы пользователи от вас ушли, ресурсы освободились и вк стал работать быстрее, несмотря на всю ненужную мишуру, которую туда ринесли эффективные менеджеры)


  1. laatoo
    20.01.2022 15:08
    +65

    Дальний Восток, Ростелеком, 100мбит, Ublock. Загружаю свою пустую страничку

    193 requests

    19.64 MB / 4.66 MB transferred

    Finish: 19.71 s

    DOMContentLoaded: 6.97 s

    load: 12.26 s

    Расскажите ещё чего-нибудь про отпимизацию 100мс, пожалуйста, очень интересно


    1. Max_JK
      20.01.2022 15:42
      +6

      Тоже Дальний Восток, ситуация такая же, никакими 100мс не пахнет, даже после загрузки переход по страничкам занимает 2-3 секунды


      1. klounader
        21.01.2022 02:44
        +2

        у меня в москве контач за 9 секунд загружается, судя по вкладке. сама главная страница появляется только спустя три секунды.


      1. vladkorotnev
        21.01.2022 05:27
        +1

        Сервера, видимо, где-то на западе страны. Из Японии у меня страница с сообщениями ВК грузится секунд 40-50, видео на пол-минуты — минут пять в полном качестве, средний музыкальный трек минуту-две. Позже даже замерю для точности, если не забуду.


        1. Volkerball
          21.01.2022 10:09
          +4

          Лол, Япония это практически worst-case scenario, на самом деле. Казалось бы даже есть пресловутое оптоволокно через Японское море, но на самом деле пакеты норовят идти через маршрут Тихий Океан - Северная Америка - Европа - Россия. Короче полшарика обогнёт, пока до России доберётся.

          А почему? А потому что пресловутый Russia-Japan Cable Network принадлежит KDDI и Ростелекому. Хочешь пинг поменьше(там дай боже 70-80 мс выигрыш) до Москвы? Придётся поднимать VPN в сети Ростелекома и гонять весь трафик через него. Причём юзать KDDI(au) в качестве оператора тоже не канает - при любом удобном случае они тоже норовят гнать трафик через Северную Америку.

          traceroute vk.com через мой VPN в сети KDDI

          1 22 ms 8 ms 20 ms VPN
          2 7 ms 7 ms 7 ms Home Gateway
          3 11 ms 10 ms 10 ms
          4 11 ms 17 ms 10 ms sjkBBAC07.bb.kddi.ne.jp
          5 11 ms 11 ms 11 ms 27.80.241.125
          6 110 ms 110 ms 112 ms sjeGCS001.int-gw.kddi.ne.jp.13.187.106.in-addr.arpa [106.187.13.14]
          7 142 ms 147 ms 119 ms 111.87.3.234
          8 117 ms 121 ms 167 ms sjo-b21-link.ip.twelve99.net [62.115.180.213]
          9 184 ms 190 ms 186 ms nyk-bb2-link.ip.twelve99.net [62.115.119.228]
          10 * 1120 ms * kbn-bb2-link.ip.twelve99.net [80.91.254.90]
          11 272 ms 267 ms 268 ms s-bb2-link.ip.twelve99.net [62.115.139.172]
          12 274 ms 275 ms 273 ms sap-b4-link.ip.twelve99.net [62.115.115.247]
          13 * * * Request timed out.
          14 275 ms 275 ms 284 ms srv78-190-240-87.vk.com [87.240.190.78]

          Как видно пакеты идут из Японии в San Jose(SJO), Нью-Йорк, Европу и наконец в Россию.

          А вот tracert rt.ru даёт пинг в 200 мс до Москвы

          6 5 ms 4 ms 4 ms tokyo1-RM-ET-6-0-0-552.s5.sinet.ad.jp [150.99.190.97]
          7 3 ms 4 ms 3 ms tokyo1-GM-AE0-100.s5.sinet.ad.jp [150.99.64.29]
          8 4 ms 3 ms 7 ms 210.173.176.137
          9 208 ms 205 ms 207 ms 87.226.181.87 (Хуяк, и сразу Москва...)
          10 200 ms 201 ms 200 ms 87.226.140.30
          11 * * * Request timed out. (Ростелеком не любит, когда его пингуют)

          Тест через универскую сеть, но по факту та же картина у Докомо, и у au KDDI. Мне теперь интересно - а пакеты до Новосибирского ростелекомовского ЦОДа тоже пойдут через Москву? Что-то мне подсказывает, что да...


          1. edo1h
            21.01.2022 14:40

            при любом удобном случае они тоже норовят гнать трафик через Северную Америку.

            интересно, а в чём причина? кабель перегружен?


            1. Volkerball
              21.01.2022 18:26
              +1

              По идее 3 причины:

              • Трафик гонится по пути с меньшей стоимостью

              • RJCN не особо рассчитан на нагрузки, чтобы через него гонять весь трафик Япония-Европа.

              • Гнать трафик через чебурнет не самая лучшая идея.

              В итоге получается, что через RJCN гонят только трафик до самого Ростелекома.

              Но если ты потребитель, которому и 70 мс важен(то бишь финтех), то KDDI всегда готов тебе продать отдельный канал втридорога. А обычному потребителю либо сосать лапу, либо быть отчаянным и поднимать VPN в России(лол).


              1. edo1h
                22.01.2022 01:19

                Гнать трафик через чебурнет не самая лучшая идея.

                не думаю, что рт как-то вмешивается в транзитный трафик


                Но если ты потребитель, которому и 70 мс важен(то бишь финтех)

                +70мс к ртт вполне заметно и при просмотре страниц


          1. vladkorotnev
            21.01.2022 15:11

            До ВК у меня поближе пролетело


            Аж через Стокгольм

            1 <1 ms <1 ms <1 ms gayway.local
            2 4 ms 3 ms 3 ms 118.23.172.198
            3 9 ms 3 ms 4 ms 118.23.172.222
            4 15 ms 17 ms 21 ms 122.1.164.229
            5 5 ms 4 ms 5 ms 221.184.5.201
            6 34 ms 23 ms 26 ms 125.170.97.97
            7 25 ms 28 ms 20 ms 125.170.97.130
            8 21 ms 21 ms 21 ms ae-5.r02.tokyjp05.jp.bb.gin.ntt.net [120.88.53.17]
            9 19 ms 19 ms 19 ms ae-3.r30.tokyjp05.jp.bb.gin.ntt.net [129.250.3.23]
            10 36 ms 34 ms 34 ms ae-0.a00.tokyjp09.jp.bb.gin.ntt.net [129.250.7.14]
            11 21 ms 24 ms 21 ms ae-13.edge2.Tokyo4.Level3.net [4.68.75.129]
            12 293 ms 290 ms 285 ms ae-2-3202.ear2.Stockholm2.Level3.net [4.69.135.138]
            13 Request timed out.
            14
            Request timed out.
            15 284 ms 301 ms 293 ms srv194-139-240-87.vk.com [87.240.139.194]


            А вот до rt наоборот —


            Сан Хосе и все дела

            7 22 ms 21 ms 38 ms 125.170.97.130
            8 19 ms 19 ms 20 ms ae-5.r03.tokyjp05.jp.bb.gin.ntt.net [120.88.53.25]
            9 20 ms 21 ms 29 ms ae-4.r30.tokyjp05.jp.bb.gin.ntt.net [129.250.3.34]
            10 123 ms 123 ms 123 ms ae-4.r25.snjsca04.us.bb.gin.ntt.net [129.250.5.78]
            11 124 ms 124 ms 124 ms ae-45.r01.snjsca04.us.bb.gin.ntt.net [129.250.3.175]
            12 126 ms 127 ms 126 ms sjo-b21-link.ip.twelve99.net [62.115.12.52]
            13 183 ms 184 ms 184 ms nyk-bb2-link.ip.twelve99.net [62.115.119.228]
            14 288 ms 285 ms 291 ms kbn-bb2-link.ip.twelve99.net [80.91.254.90]
            15 282 ms 282 ms 287 ms s-bb2-link.ip.twelve99.net [62.115.139.172]
            16 292 ms 314 ms 292 ms sap-b3-link.ip.twelve99.net [80.91.250.98]
            17 301 ms 299 ms 299 ms rostelecom-svc071029-ic357274.ip.twelve99-cust.net [62.115.36.75]
            18 286 ms * 299 ms 87.226.183.87
            19 321 ms 322 ms 325 ms 87.226.140.30


            1. edo1h
              21.01.2022 15:35

              только по задержкам можно предположить, что трафик и в первом случае пошёл через штаты )


              1. vesper-bot
                21.01.2022 15:44

                del


    1. MonkAlex
      20.01.2022 17:10
      +1

      Урал:

      281 запрос

      23,81 МБ / 8,08 МБ передано

      Передано за: 12,54 с

      DOMContentLoaded: 2,21 с

      load: 2,91 с

      Так что у меня в целом комфортно =) А дальше скрипты то догружать уже не надо, остальное работает намного более плавно.


    1. lgorSL
      20.01.2022 18:38
      +4

      Хаха, мне кажется проблема не в географии. Подмосковье, 40 мегабит, моя страничка, firefox, uBlock:

      298 requests

      21.56 MB / 5.79 MB transferred

      Finish: 19.18 s

      DOMContentLoaded: 6.87 s

      load: 13.87 s


    1. vp7
      21.01.2022 23:38
      +1

      Мне кажется, что ответ кроется в использовании Ublock Origin - приложение пытается обойти блокировки и хоть как-нибудь показать рекламу.

      Вы же помните - "если вы получаете что-то бесплатно, то помните, что товар в этой схеме - вы сами". Пользователи, которые не смотрят рекламу им неинтересны. Вы забьёте, а какая-нибудь домохозяйка увидит, что с блокировщиком рекламы любимый вконтакт тормозит, а без - работает норм и отключит этот тупой блокировщик рекламы. Эффект достигнут, товар начал опять приносить прибыль.


      1. vesper-bot
        22.01.2022 07:28

        Скорее так: приложение пытается показать рекламу, ublock дропает запрос, приложение ждет таймаут и только после него пытается работать дальше.


      1. laatoo
        22.01.2022 11:13

        Нет, дело не в ublock


  1. TaksShine
    20.01.2022 15:16
    +1

    В беспроводных сетях они теряются легче: для 4G и Wi-Fi packet loss
    составляет примерно 0,1–0,5%. Это не очень много, но так как 92%
    аудитории ВКонтакте использует мобильные

    Не очень понятно, почему это аргумет обозначен существенный именнодля мобильных. Десктопы сейчас в подавляющем большинстве на вайфае. Packet loss указан общас для 4g и wi-fi, так что видимо у десктопов те же проблемы, с точки зрения сети.


  1. Akuma
    20.01.2022 15:18
    +13

    Это те же самые люди, что подсовывают каптчу в ответ на серверные api запросы :)


    1. init0
      20.01.2022 16:24

      Серьезно, а можно подробнее?


      1. Akuma
        20.01.2022 16:27
        +11

        https://vk.com/dev.php?method=captcha_error

        https://qna.habr.com/q/42482

        и т.д.

        По факту, у меня оно возникает при выкладке фото или товаров. Т.е. ВК заявили, что вот вам серверное АПИ для публикации товаров, вот вам лимиты, а вот вам еще каптча, потому что чет вы много публикуете (хотя укладываемся в лимиты).

        Бесячая штука, завставляющая подключать индусов для решения каптчи.


        1. init0
          20.01.2022 16:38
          +8

          Охренеть, и эта дичь даже задокументирована у них... спасибо.


          1. Akuma
            20.01.2022 16:50
            +3

            Ну да. У них весело )

            Еще и лимиты такие, что повеситься можно.


  1. cepera_ang
    20.01.2022 16:19
    +2

    Понравилась мысль про добавление избыточности в поток данных, чтобы восстанавливать дропнутые пакеты и ML для предсказания характеристик канала, довольно хитро, но очевидно задним умом.


  1. Akr0n
    20.01.2022 16:31

    Сколько бы было сэкономлено электроэнергии и ресурсов, если бы все подходили подобным образом к разработке своих сервисов... Так и глобальное потепление немного подвинули бы. Эх.


    1. domix32
      20.01.2022 17:29

      Да ну врядли ЦОДы настолько вредят экологии в сравнении с какими-нибудь дефолтными теплоцентралями и всяиким заводами по переработке. Да и двигать уже поздновато, тут уже уменьшать последствия нужно.


    1. vodopad
      20.01.2022 17:30
      +4

      Скажите это майнерам.


      1. klounader
        21.01.2022 02:54
        -3

        у биткоина кпд покрепче самых урановых технологий.
        переварить дохулиард мегаватт, чтобы набрать монетку весом 0,0000000000000… хрен знает сколько граммов биткоина, ценность которой абсолютно ничем не обеспечена кроме фантазии человека. маленький кусочек урана таки может делов натворить, если его раздавить «случайно». вангую, что если раздавить биткоин, то взорвётся пол интернета и пробьётся дохрена пуканов. крики от горящих пуканов будут слышны даже на марсе. маленький да удаленький комочек денег, который не весит даже нанограмма. мощь. можно смело добавлять биткоин в таблицу менделеева.


      1. Akr0n
        21.01.2022 05:05
        +1

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


    1. nixtonixto
      20.01.2022 18:19
      +4

      Судя по фразе «Немного легче, но 160 тысяч фотографий в секунду всё равно нужно как-то перекодировать, причём желательно подгоняя под разрешение экрана. Этим занимается небольшой кластер из GPU и FPGA» — с глобальным потеплением у них всё нормально… Вместо того, чтобы однажды перекодированные картинки складывать в хранилище и при следующих запросах брать их уже из этого хранилища, а не снова перекодировать — они тупо в бесконечном цикле кочегарят перекодировку до 160к картинок в секунду по запросам пользователей…


      1. Akr0n
        21.01.2022 04:55
        +1

        Очень часто те же сайты-визитки у нас пишут так, что они весят десятки мегабайт, если бы все веб-программисты изначально подходили к этому рационально, то и в глобальном масштабе был бы ощутимый эффект.


      1. Balling
        21.01.2022 06:26

        У них хотя бы этим GPU занимается. https://github.com/CESNET/GPUJPEG Типо.


      1. WraithOW
        21.01.2022 12:29
        +1

        однажды перекодированные картинки складывать в хранилище

        Это отлично работает, если картинки всегда отдаются одним размером. Если же вы хотите трафик экономить, и не отдавать на клиент трехмегапиксельный жипег каждый раз, когда нужно показать аватарку 100х100 пикселей, то перекодировать нужно сразу под все размеры, и требования к объему хранилища маленько вырастают. Бонусная жопоболь, когда появляется еще один размер, и вам нужно все терабайты загруженных картинок еще раз перекодировать под него.


        1. nixtonixto
          21.01.2022 13:28
          +2

          Для соцсетей с ленточным интерфейсом достаточно превьюшки с каким-то разумным размером 600...800 пикселей и фуллсайза по клику, который может быть хоть в bmp — раз пользователь кликнул, значит, он согласен подождать, да и одна картинка загрузится всяко быстрее, чем страница с сотней скриптов, баннеров и трекеров. Или вы предлагаете по клику на превьюшке вываливать пользователю список разрешений для выбора? Это сейчас актуально только для видеохостингов. А под размер экрана прекрасно подгоняет сам браузер.

          А аватарки конечно же нужно хранить отдельно, иначе каждый запрос любой страницы с комментариями потребует перекодировки сотни картинок-аватарок.


          1. WraithOW
            21.01.2022 13:42
            +1

            Для соцсетей с ленточным интерфейсом достаточно превьюшки с каким-то разумным размером 600...800 пикселей

            Недостаточно. Во-первых, есть банальная ретина, на которой ваши превьюшки будут выглядеть мыльными. Во-вторых, на дворе 2022й год и половина пользователей ходит с мобильных устройств, а это вагон форм-факторов и плотностей экрана, а значит — требований к разрешению.

            фуллсайза по клику, который может быть хоть в bmp — раз пользователь кликнул, значит, он согласен подождать

            Во времена моей молодости было популярно постить на форумы фотки Вассермана, апскейлнутые до 50-100 мегапикселей, браузер на такое обычно делал «кря» и падал. Девайсы сейчас, конечно, стали помощнее, но вместо них теперь есть мобильная связь и лимиты на траффик. Я думаю, вы будете очень недовольны если при попытке рассмотреть какую-то фотку поближе соцсеть выжрет ваш дневной лимит трафика.

            Или вы предлагаете по клику на превьюшке вываливать пользователю список разрешений для выбора?

            Нет, это решает клиент в момент построения ui, когда понимает размер картинки в экранных пикселях (и на основе этого решает, какую именно картинку запросить).


            1. nin-jin
              21.01.2022 14:46
              -1

              есть банальная ретина, на которой ваши превьюшки будут выглядеть мыльными

              Разве что если уткнуться носом в экран.

               вагон форм-факторов и плотностей экрана, а значит — требований к разрешению

              Требования к разрешению зависят исключительно от углового размера изображения.

              это решает клиент в момент построения ui, когда понимает размер картинки в экранных пикселях (и на основе этого решает, какую именно картинку запросить).

              А может это пользователь будет решать хочет он грузить картинку 864x1080 весом 300КБ, чтобы показать превьюшку 90x178, или нет?


              1. WraithOW
                21.01.2022 15:24
                +3

                Разве что если уткнуться носом в экран.

                Соболезную вашим проблемам со зрением.

                Требования к разрешению зависят исключительно от углового размера изображения.

                То-то я думаю, почему все пользователи айпадов в метро носят их исключительно на вытянутой руке — это чтобы угловой размер был одинаковый!
                А нет. Стоп. Никто так не делает.

                А может это пользователь будет решать хочет он грузить картинку 864x1080 весом 300КБ, чтобы показать превьюшку 90x178, или нет?

                Пользователю, разумеется, заняться больше нечем, кроме как сидеть и разрешение выбирать. Давайте еще будем спрашивать, с какого сервера из CDN загружать, с какими таймаутами, он ведь ради этого приложение ставит.


                1. nin-jin
                  21.01.2022 17:11

                  И правда, давайте ещё будем спрашивать каких его друзей показывать всем подряд, а каких скрывать.


                  1. WraithOW
                    21.01.2022 17:22

                    Ну то есть с концепцией «нам нужно больше одного размера для картинок» вы согласны. Вопросов больше не имею.


                    1. nin-jin
                      21.01.2022 17:40

                      Я скорее согласен с концепцией "дать пользователям настройку, убедиться, что никто её не включит, и выпилить нахрен, раз уж это не очевидно с самого начала".

                      Вон, ниже жалуются на КДПВ на 500КБ. А ведь это ни разу не превьюшка даже.


                    1. gecube
                      21.01.2022 18:53
                      +1

                      Ну то есть с концепцией «нам нужно больше одного размера для картинок» вы согласны. Вопросов больше не имею.

                      да, но это не бесконечное множество размеров, а вполне определенное. И можно посмотреть на статистику использования конкретных размеров. И точно можно кэшировать на диске, чтобы не жечь процессорное время.


                      1. WraithOW
                        22.01.2022 02:15
                        +1

                        Определенное, но, тем не менее, большое. Ну просто для контекста — под один только андроид вам нужно сейчас в среднем 4 иконки для каждого типоразмера (hdpi/xhdpi/xxhdpi/xxxhdpi, lpdi/mdpi откину ибо устарели, но наверняка есть доля старых девайсов, которые нужны). Прибавьте сюда айфоны, веб, а потом вспомните, что типоразмеров-то может быть много. Фотография на стене — один размер, та же фотография в составе сетки — другой размер, в альбомах — третий, в истории — четвертый, в фотопросмотрщике пятый.

                        И можно посмотреть на статистику использования конкретных размеров.

                        Вы думаете, что такие решения внедряются вообще без статистики? Типа приходят ребята в бухгалтерию и такие: а дайте нам много миллионов, мы на них FPGA покупать будем.
                        Если у вас много кеш-миссов, то толку от вашего кеша мало. А лично мне видится, что у соцсети миссов будет дофига.

                        И точно можно кэшировать на диске, чтобы не жечь процессорное время.

                        Если жечь время дешевле с точки зрения оборудования и обслуживания — почему не жечь?


                1. gecube
                  21.01.2022 18:52

                  Пользователю, разумеется, заняться больше нечем, кроме как сидеть и разрешение выбирать. Давайте еще будем спрашивать, с какого сервера из CDN загружать, с какими таймаутами, он ведь ради этого приложение ставит.

                  не согласен в корне. Пускай это определяется в настройках веб-приложения. И выбирается автодетектом. И будет возможность поменять настройки, если очень надо. Потому что грузить фуллсайз, когда он мне нафиг не уперся - тоже выглядит как ... слабоумие и отвага.


                  1. WraithOW
                    22.01.2022 02:22
                    +1

                    Потому что грузить фуллсайз, когда он мне нафиг не уперся — тоже выглядит как… слабоумие и отвага.

                    Я буквально только что описал систему, которая как раз направлена на то, чтобы качать только то, что нужно для качественного отображения, вместо «600х800 хватит всем», и уж тем более фуллсайз. Вы принципиально спорите чисто ради спора?

                    А если надо экономить — так для этого есть свой режим. За мобильную версию не скажу, но в приложении в настройках галочка «Save data». Будет шакально и экономно.


      1. Urvin
        22.01.2022 11:49
        +2

        В разных контекстах нужно применять различные стратегии.

        Смотрите, если у нас, например, интернет-магазин, то пользователи будут всегда видеть одни и те же картинки. Для этого приложения действительно лучше будет один раз сгенерировать сжатые картинки, сохранить и подсовывать пользователям каждый последующий раз из кеша.

        Если мы берем соцсеть, то сжатые изображения нам нужны буквально три раза - для юзера, загрузившего фотографию и наблюдающего свою физиономию, его мамы и давнего коллеги, который по каким-то причинам еще не выпилился из соцсети. И таких, никому не нужных фотографий - тонны, миниатюр так же тонны. Хранить кладбище никогда не загружаемых миниатюр стоит денег, которые профита не приносят ни как.

        Вот поэтому соцсеть и жмет картинки каждый раз.


        1. nin-jin
          22.01.2022 11:53

          Миниатюра занимает на порядок меньше места, её размером можно пренебречь. А ещё бывает никому не нужная картинка бешенно вирусится. Ну или не бешенно, но ощутимо.


        1. gecube
          22.01.2022 12:38
          +1

          Если мы берем соцсеть, то сжатые изображения нам нужны буквально три раза - для юзера, загрузившего фотографию и наблюдающего свою физиономию, его мамы и давнего коллеги, который по каким-то причинам еще не выпилился из соцсети. И таких, никому не нужных фотографий - тонны, миниатюр так же тонны. Хранить кладбище никогда не загружаемых миниатюр стоит денег, которые профита не приносят ни как.

          агрессивное кэширование на стороне клиента ? Тогда экономим сильно на трафике. Касательно соцсети не согласен. Есть куча пабликов, на которые подписаны тысячи и сотни тысяч человек. С лентами тредов ответов. Поэтому распределение загрузок картинок будет очень неравномерное - какие-то будут затребоваться в разы чаще, чем остальные.

          @WraithOWв принципе, я с вами согласен, что может статься, что поискать картинку на диске, поднять ее с диска и отдать клиенту может оказаться дольше, чем перекодировать ее и отдать клиенту. Но очень было бы тогда интересно почитать обзорную статью на каких именно типах нагрузок становится выгоднее один подход или другой. Понятно, что технарям всегда интересно поиграть в свежие технологии и построить тот же кластер FPGA, но вот реально - насколько это оправдано? Кэшики тоже, очевидно, бесплатно не даются.


          1. WraithOW
            23.01.2022 01:28

            агрессивное кэширование на стороне клиента? Тогда экономим сильно на трафике.

            А кто сказал, что его нет? Я вот открываю на вебе свою страничку и вижу в консоли кучу запросов картинок с If-Modified-Since в заголовках и 304 Not Modified в ответе.

            Но очень было бы тогда интересно почитать обзорную статью на каких именно типах нагрузок становится выгоднее один подход или другой.

            В первом-то приближении там всё просто: с одной стороны у вас полная прегенерация контента, с другой — ресайз на лету. Первое хорошо, если уникального контента мало в сравнении с числом пользователей (например, иконки услуг в платежном приложении), второе — если уникального контента больше (фотографии в соцсети). В реальности у вас, скорее всего, будет некоторая комбинация, а вот какая — тут нужно смотреть на конкретную нагрузку конкретного проекта, обмазывать всё метриками и гонять а/б.


  1. ViktorZ
    20.01.2022 16:45
    +12

    Ускорьте, пожалуйста, рост цены акции.


    1. zhulan0v
      20.01.2022 22:28
      +1

      Да уж, там вообще провал конкретный


  1. F0iL
    20.01.2022 16:45
    +3

    С данными в инфографике у вас беда местами. Например, там где типы подключений и скорости, пропущено число для dial-up (56 КБит/с) и неправильно указано для Ethernet (там не 50 Мегабит, а 10/100/1000). То же самое про стек - JPEG был изобретен не в 2000 году, а в 1992.


    1. vesper-bot
      20.01.2022 16:58
      +1

      Лимиты провайдеров, в которые упирается клиент при передаче данных, необязательно совпадают с ограничениями конкретно подключения Ethernet. Скорее всего, в инфографике указаны наиболее часто встречающиеся лимиты на провайдерской стороне. Так правильно в самом деле писать там «10-100 Мбит/с».


    1. Balling
      21.01.2022 06:24

      JPEG как и почти тот же самый TIFF был создан в 1992. https://en.wikipedia.org/wiki/JPEG


      1. F0iL
        21.01.2022 10:33

        Так я в своем комментарии ровно об этом и сказал.


  1. elisoff
    20.01.2022 16:51

    Вывод: делай как Google!


    1. domix32
      20.01.2022 17:31

      До гугла тут очень далеко AFAIK. Гугл своё железо сам крафтит и сам же утилизирует, не представляю такого на террритории России, к сожалению.


  1. fk0
    20.01.2022 17:27
    +10

    Есть такие мнения, что mozjpeg в целом не сильно хуже, а иногда и лучше webp. И что Google немного намухлевал с тем, что сравнивал свой webp с референсной реализацией jpeg которая далеко не идеальна. И наверное не было смысла вводить какой-то новый формат файлов картинок, кроме как для того, чтоб получить свой, пусть и не патентованный, но свой подконтрольный алгоритм, библиотеку, формат файлов... которые в будущем может запросто обрасти патентами и запретами. В то время JPEG является международным стандартом (SO/IEC 10918, ITU-T T.86) и не может в будущем иметь ограничений как "проприеритарный" формат.

    Вы говорите, у вас сжатие там чуть ли не на 50% лучше, а не является ли это тем фактом, что попросту при перекодировании в WebP получается более низкое качество? По-моему это было бы хорошим решением для хостинга картинок, но факт понижения качества альбомов фотографий пользователи бы не приняли. И даже дело не в том, что вы что-то сделали плохо, но просто из-за особенностей кодирования так могло получиться, что двойное перекодирование (raw -> jpeg -> raw* -> webp) теряет часть данных и в итоге они сжимаются лучше. Ведь этот случай не то же самое, что raw -> webp. Подразумевается что изображение помеченное как raw* может иметь, например, отфильтрованные некоторые компоненты изображения.


    1. Balling
      21.01.2022 06:29

      Там уже webp2 есть. Но да в то время как атономная система твиттера уже lossless 4:4:4 делает (и не перекодирует JPEG), а facebook уже думает о JPEG-XL...


  1. z3apa3a
    20.01.2022 18:32
    +16

    С QUIC есть нерешенная проблема, которая имеет все шансы выстрелить по мере того, как он становится более популярным. В IPv4 подавляющее количество пользователей приходят на конечный сервер через NAT, или провайдера или свой собственный. Особых альтернатив кроме перехода на IPv6 нет, тк адреса кончились. А девайсов за натом все больше, потому что интернет вещей. Размер любой NAT таблицы ограничен, а для UDP, из-за отсутствия закрытия сессии, маппинг может пропасть только по таймауту, поддержки QUIC на уровне NAT пока не видно. Это значит что постепенно из-за ограниченных размеров таблиц время жизни маппингов будет падать и клиенты одного NAT будут конкурировать не только за канал, но и за места в таблице трансляций. При этом сам QUIC достаточно "живуч" и учтойчив к пропаданию маппингов, но вот другие протоколы, типа того же голоса, игр, да и DNS тоже, могут серьезно пострадать. Уже сейчас видно что у некоторых провайдеров время UDP маппингов упало до нескольких секунд и есть жалобы. Поэтому QUIC в какой-то степени переложил проблемы с больной головы на здоровую. Вангую, что первыми начнут резать QUICK сотовые операторы.


    1. NickKolok
      20.01.2022 19:01
      +1

      Контрвангую, что не начнут, потому что тогда (особенно в городах) начнутся рассужения не тему "у синего оператора ВК лагает меньше, чем у розового, переключусь на него".


      1. zzzzzzzzzzzz
        21.01.2022 22:41
        +1

        Контр-контрвангую, что разница по скорости между QUIC и обычным HTTPS будет настолько мала по сравнению с остальными тормозами, что среднестатистический пользователь ничего не заметит (конечно, кроме случая, когда уже на сервере возьмут и выпилят всё, кроме QUIC).

        Хотя тут ещё вопрос, каким образом клиент определяет, что по QUIC не получилось.


    1. z3apa3a
      21.01.2022 12:09
      +1

      Кстати ниже жалобы что "в чате что-то написали, а появляется только после обновления", это может быть резутатом того что вебсокеты переключили на QUIC, чего делать ни в коем случае нельзя из-за маленьких таймаутов на UDP-маппинги.


      1. creker
        21.01.2022 12:22

        А вебсокеты умеют ли по QUIC летать? Стандарт предполагает HTTP1 и TCP. Даже на http2 толком не переехали. Я видел только разговоры, что неплохо бы что-то сделать, а что непонятно. Есть WebTransport, но вроде еще не готово и все равно это не вэбсокеты.


        1. z3apa3a
          21.01.2022 12:55

          На HTTP/2 переехали (RFC8441), по крайней мере Chrome использует его по умолчанию при наличии уже установленного соединения. По HTTP/3 пока похоже нет, но скоро будут https://datatracker.ietf.org/doc/draft-hamilton-httpbis-h3-websockets/

          На самом деле в quic по умолчанию должен идти пинг-пакет каждые 15 секунд, что существенно митигирует проблему для самого quic, но поскольку реализация quic фактически унесена на прикладной уровень, очень сложно сказать что там будет происходить на самом деле.


          1. creker
            21.01.2022 13:11
            +1

            Это ж сколько мусорного трафика будет от этого QUIC в глобальном масштабе, если он пинги постоянно слать будет


            1. gecube
              21.01.2022 18:55

              будто в HTTP или TCP keep-alive нет (но это не глобальный масштаб обычно)


              1. mayorovp
                21.01.2022 20:25

                Там интервал keep-alive измеряется минутами если не часами.


    1. VEG
      21.01.2022 12:15

      По идее, чем более популярен QUIC, тем более у операторов мотивации научиться распознавать QUIC, и поддерживать его соединения должным образом. Он же только-только начал активно использоваться, не было у них ещё времени нормально среагировать.


      1. z3apa3a
        21.01.2022 14:06
        +1

        Проблемы возникнут не в QUIC - он "из коробки" готов к конкуренции за записи в NAT-таблице, а в других UDP-протоколах. Скорей всего, в итоге многие UDP протоколы придется адаптировать под короткое (менее минуты) время жизни маппинга, т.е. фактически добавлять зачатки транспорта поверх UDP из-за того что QUIC это по сути транспорт поверх UDP и с ним надо конкурировать за ресурсы. Именно поэтому со стороны QUIC использование UDP вместо собственного транспортного ротокола это перекладывание проблемы с больной головы на здоровую.

        Проблема в том, что QUIC не транспортный протокол, транспортный протокол UDP. NAT это зло, но пока оно неизбежно. Ограничения UDP и NAT возникают из свойств UDP, а не QUIC, в лучшем случае размер NAT таблицы ограничен количеством UDP портов. Операторы могут либо расширять внешние диапазоны NAT чтобы не допускать падения времени жизни маппингов, что требует и оборудования и новых IP адресов, которых брать негде, либо заворачивать трафик в QUIC прокси, что убьет преимущества в скорости либо забить на проблему, потому что большая часть пользвоателей ничего не заметит. Сильней (и скорей всего неожиданней для себя) с проблемой столкнутся администраторы небольших (например офисных) роутеров с одним внешним адресом на каком-нибудь специфичном софт поверх UDP. Даже в OpenVPN дефолтные кипэлайвы сейчас порядка минут и их скорей всего придется снижать.


    1. vikarti
      21.01.2022 14:50

      При этом сам QUIC достаточно "живуч" и учтойчив к пропаданию маппингов, но вот другие протоколы, типа того же голоса, игр, да и DNS тоже, могут серьезно пострадать.

      С DNS есть решение! -:)
      https://adguard.com/ru/blog/dns-over-quic.html
      https://www.rfc-editor.org/rfc/rfc9000.html


  1. ifap
    20.01.2022 18:34
    +12

    Хотите еще ускорить ВКонтакте? Расскажите ответственному, что отправка корневого сертификата при установке TLS-соединения - маразм и жрет трафик, что TLS_RSA_WITH_AES_128_CBC_SHA насквозь дырявый и сегодня никем не используется, а трафик все так же жрет, что session resumption - полезная штука, если правильно готовить (правильно - это не присваивать сессиям ID, а потом их не принимать)...


    1. Balling
      21.01.2022 06:32

      >отправка корневого сертификата при установке TLS-соединения - маразм и жрет трафик

      Ой, вот не надо. Это очень спорно.


      1. ifap
        21.01.2022 12:26
        +5

        Давайте это обсудим (с) Моя позиция: отправка корневого сертификата означает, что либо сертификат сайта по сути самоподписан (если клиент полагается на присланный сертификат, а не сертификат в своем постоянном хранилище), либо что трафик на его доставку выжран зря. Ваши возражения?


        1. Balling
          21.01.2022 22:16

          Промежуточные сертификаты все же желательно отправлять. Корневой и правда нафиг.


          1. ifap
            21.01.2022 23:01
            +5

            Промежуточные требует передавать RFC, но кто про них-то говорил?


  1. homm
    20.01.2022 19:23
    +2

    Расскажите пожалуйста, что конкретно у вас запускается на FPGA?


  1. Darkhon
    20.01.2022 20:18

    Почему-то, несмотря на заголовок, у ВК и сейчас присутствуют JPG (проверил первые попавшиеся картинки в пабликах), и Flagfox обычно показывает HTTP/2, хотя изредка всё-таки может показать HTTP/3.


    1. Balling
      21.01.2022 06:31

      Работает норм только через Chrome.


  1. SergeiMinaev
    20.01.2022 20:26
    +3

    Статья реально очень классная, но опыт использования ВК говорит совсем не об ускорении...
    Сайт ВК стал лагать. Поясняю:
    1) У меня в браузере почти постоянно открыты две вкладки с ВК - одна для чатов, другая для музыки. Сейчас постоянно случается ситуация, когда человек мне что-то написал, а в чате пусто. И только после обновления страницы сообщение показывается. Такое было уже раза три за последний месяц.
    2) Интерфейс стал менее отзывчивым. Если вкладка с ВК открыта долго, то часто бывает, что тыкнешь на кнопку и.... ничего не происходит. Или происходит, но с задержкой. Это появилось недавно. Я уж подумал, вы фронт на другом фреймворке переписали.


    1. vadimk91
      20.01.2022 22:02
      +1

      Подтверждаю, в последние месяцы интерефейс десrтопной версии стал тормозить, вот сейчас ткнул по кнопке Музыка - прошло 4 (!) секунды, прежде чем открылся соответствующий раздел. Пинг до vk.com 14мс, подключение FTTB 100 Мбит/ А вот сайт Хабра отрисовывает всё менее чем за секунду.


      1. Balling
        21.01.2022 06:30

        > А вот сайт Хабра отрисовывает всё менее чем за секунду.

        Уже неправда.


        1. Massacre
          21.01.2022 08:16

          Можно ведь взять «неподдерживаемый» браузер и получить нормальный «старый» дизайн, там это именно так и будет.


    1. klounader
      21.01.2022 03:05
      +1

      вчера было открыто две-три фоновых вкладки. на одной из них шёл какой-то вк-стрим на прослушке, на второй музыка на паузе с каким то обсуждением, на третьей сообщения. чую, стал звук пропадать, потом вовсе пропал звук. тыкаю по вкладке, всё сразу же затранслировалось. они даже с фоном чтото намудрили. а вк музыка так вообще местами на некоторых песнях глючат так, что не понятно, файл у них на сервере битый или правообладатели криво сожрали, а то и зависает на подобном треке.


  1. nkretov
    20.01.2022 21:16
    +2

    Сложилось впечатление что статью намешали как минимум из 3х. И можно было выпустить только часть про квик.

    Есть первая часть в которой как-то вскользь проходят по вопросам использования различных форматов изображений в вебе и одной картинкой рассказывают про чудоподорожник вида FPGA.

    Часть номер два бросается с места в карьер фразой о дип дайв на сетевой уровень L3. Но потом сразу-же режет глаза - ''конечно, сервер 100 Гбит/с на пользователя не шлёт'' - какой такой пользователь на л3 ? его заначенный провайдером айпишник ? о чем тут вообще речь. И так далее...

    Часть номер 3 про квик вроде ничего, но уже очень сложно ее воспринимать в рамках общего изложения.

    Очень смущает качество рисунков в статье. Не все из них подписанны. Не на всех есть понимание кто источник данной иллюстрации. На многих графиках нехватает осей, масштабов, расшифровки легенды.

    Лично мне очень хотелось бы почитать какие-то осмысленные технические разборы сетевых проблем и их решений. Но эта статья больше напоминает маркетинговый материал, а не технический.

    PS: ну и конечно, даже если я могу вас покурлить на 100мс быстрее чем 10 лет назад это не имеет никакого значения если потом вебка рисуется по 10 секунд.


    1. ToSHiC
      20.01.2022 23:59
      +1

      Часть номер два бросается с места в карьер фразой о дип дайв на сетевой уровень L3. Но потом сразу-же режет глаза - ''конечно, сервер 100 Гбит/с на пользователя не шлёт'' - какой такой пользователь на л3 ? его заначенный провайдером айпишник ? о чем тут вообще речь. И так далее...

      Это как раз понятно. На стороне сервера быстрая сетевая карточка и десятки/сотни тысяч соединений. Условный nginx начинает в сокет данные пихать, ядер на сервере в районе сотни, так что потенциально можно в 100 соединений сразу пихнуть довольно много данных.

      Клиент со своей стороны видит только свою часть соединения, например, что у него там 100мбит/с сеть. Трафик шейпится где-то между сервером и клиентом, ни один их них ничего про это "облако", соединияющее их не знает. Вот CC алгоритмы и пытатся угадать, что же там происходит. Наличие ната между ними на процесс не влияет.

      В идеале, кстати, на стороне сервера должен быть ещё и pacing пакетов, синхронизированный с CC.


      1. Korobei
        21.01.2022 01:28

        Интересно, если учитывать кому принадлежит сеть и автоматически подстраиваться к максимальным лимитам. Типа если соединение с сеткой сотового провайдера, то достаточно маленькая максимальная скорость, а если домашний провайдер, то в принципе должно быть сильно побольше.

        Можно ещё статистику по соединениям на подсетку собирать и на неё ориентироваться, можно даже по времени суток, типа ночью сильно свободнее канал чем днём.


  1. YuryB
    20.01.2022 23:10
    +8

    Результат перехода с JPEG на WebP:

    • на 40% в среднем уменьшили размер фотографий;

    скрупулёзное сравнение показывает что webp ни чем не лучше jpeg, который получили через кодек mozjpeg. размер то на 40% уменьшился, а уверены ли вы, что качество картинки осталось тем же? :) в той же мозиле не просто так долго тянули с внедрением этого декодера, у них на гитхабе есть и приложение по вычислению структурной разницы между картинками, чтобы понять как меняется качество при изменении настроек компрессии. из того что можно сходу сказать - webp лучше на низком и шакальном качестве + альфаканал. для фото на которое будут смотреть скорее всего выигрыша не будет (а хранить при этому fall back дупликат jpeg скорее всего захочется для совместимости).

    Насчёт gzip vs brotli - я лично не тестировал, но по всем тестам brotli лучше, как минимум быстрее + у gzip низкая скорость извлечения. + есть вопрос целесообразности сжатия мелких запросов: на сколько я понимаю всё равно по сети будут передаваться кадры по 1500 байт, т.е. что 8 кб что 9, всё равно физически по сети вы отправите 9, только в первом случаи ещё кучу лишней работы сделаете.


  1. Maximil
    21.01.2022 00:10
    +1

    Признаюсь у меня 10 секунд стартует ВК из за тонны фильтров. Дальше лента прогружается без проблем.
    Блок сторис, блок рекламы, блок подписки на коменты, блок рекомендаций в ленте, блок в ленте рекламных постов(от вк и те что помечены меткой реклама от сообщества), блок "Сообщества для вас " + Dark Reader меняет все цвета, ну и так по мелочи убрал некоторые кнопки вроде "короновирус" и блок Блог Разработчикам Для бизнеса целиком. На выхое имею практически чистую ленту. Из хотелок думаю как блочить посты по ключевым словам.


  1. u007
    21.01.2022 07:50

    Видел я ваши оптимизации. Растёт нагрузка - отваливаются картинки. Ещё растёт - отваливаются комменты... Верните Дурова!


  1. 1A1A1
    21.01.2022 08:32
    -3

    Ниасилил многабукаф. Остановился на нелепом посыле, мол проблема в сети.

    Можно придумать свою мельницу и беспощадно с ней сражаться, с графиками и выкладками, но по-сути просто увеличивая энтропию.


  1. 13werwolf13
    21.01.2022 09:47
    +2

    фотографию можно отобразить, даже если пропали пакеты с несколькими пикселями — думаю, скоро это будет добавлено. 

    можно.. но зачем?!?!?!

    а вообще присоеденяюсь к коментаторам выше: можно хоть до усёру тюнить сеть, хранилище, базы.. но если сам сайт/приложение написаны криворукими макаками это не поможет.
    для примера можем взять vk messenger. ужастное поделие, которое похоже забыли доделать и выкинули в прод, и с тех пор не поддерживают. мобильное приложение получше, но и его я удалил когда понял что 90% контента превратилось в рекламу (сириусли, видео на 3.5 минуты, в него сунули рекламу на 7 минут), да ещё и UI убог (сделали бы его хоть кастомизируемым, вот например почему бы не дать возможность менять книпки на нижней панельке? ну вот почему безполезная кнопка "клипы" там есть а полезной например "сообщества" нет?).
    сам сайт ужасен, весит много, не делает ничего..
    да и вообще после того как ВК'шники решили похоронить xmpp мост вк стал для меня таким редким другом что пора прощаться.. (ну или сделайте мост в matrix чтоли если вам кажется что xmpp слишком устарел)


  1. Rhoads
    21.01.2022 09:53
    +3

    На протяжении всей жизни мне приходится экономить вычислительные и сетевые ресурсы: сначала были компьютеры с 300 кГц (кило — не гига!) и 32 Кбайт RAM

    не было таких. Персоналки в 1980-х начались с мегагерцовых процессоров. Или речь про БЭСМ (сколько же автору лет)))? Но и там были мегагерцы.


    1. Stanislavvv
      21.01.2022 16:55

      Вангую, что имелось ввиду быстродействие в командах/секунду. Оно как раз такого порядка было — 300-500-800т.к/сек в те времена, когда память измерялась десятками кб.


  1. Pavel1114
    21.01.2022 12:15
    +2

    статья об оптимизации трафика, а КДП 500Кб хотя это даже не фото.


    1. Massacre
      21.01.2022 13:59

      Ну так, почему-то, в PNG. Там и прочие ассеты в нём же, иногда и до мегабайта за картинку достигает в итоге.


  1. Gennadij_Kalin2020
    21.01.2022 12:26
    +4

    То то я смотрю вк стал тормознее, а вы его оказывается ускорили.


  1. mitradir
    21.01.2022 12:27

    Отличная статья! А можете уточнить в контексте вашего А/Б теста QUIC vs TCP, какой CC был использован в TCP? Вы сравнивали TCP BBR1 vs ваш СС QUIC внутри NGINX?


  1. PanDubls
    21.01.2022 16:29
    +2

    Я понимаю, конечно, что эта претензия совершенно не по адресу разработчику-бекэндеру, но только насколько бы процентов не ускорилась бы прогрузка запроса она не компенсирует то время, которое я потрачу на просмотр 20-секундного непропускаемого рекламного ролика, приклеенного к 5-секундному видео, которое снял и отправил мне друг в личных сообщениях. Показываемого при каждом просмотре. При наличии у обоих премиум-подписки VK. Менеджмент у автора - пичаль. А автор крутой и всяческих ему успехов.


  1. anonymous
    00.00.0000 00:00


  1. AlexunKo
    21.01.2022 19:38
    +1

    Важно не то что ты выиграл, важно то для чего ты это выигрыш будешь использовать. Неконфуций.


  1. Arris
    21.01.2022 20:22

    А можно как-нибудь отказаться от картинок в webp-формате в настройках аккаунта ВК?


  1. zzzzzzzzzzzz
    21.01.2022 23:15

    Ах, эти расуждения про 100 мс и отзывчивость для пользователя!

    Особенно меня это у Гугла впечатляет. Одной рукой они рассказывают про вот эти миллисекунды, а другой лепят фреймворки с ленивой загрузкой картинок (проматываешь страничку, видишь мутные прямоугольники, ждёшь N секунд, картинки загрузились, смотришь, не то, мотаешь дальше, опять мутные прямоугольники и т.д.). У ВК в этом плане всё ещё не так плохо, или, по крайней мере, это выглядит не так откровенно издевательски.


    1. d1gital_love
      22.01.2022 09:09

      лепят фреймворки с ленивой загрузкой картинок (проматываешь страничку, видишь мутные прямоугольники, ждёшь N секунд, картинки загрузились, смотришь, не то, мотаешь дальше, опять мутные прямоугольники и т.д.

      Так текст важнее картинок почти всегда... Изображения-формулы важны как и текст.

      По скорости прокрутки viewport можно предсказывать сколько именно тяжелых изображений подгружать.

      Помню как годами читал сайты в Opera с подзагрузкой картинок по клику на изображении, но это на ПК. С мобильииками я не знаю что теперь делать.


      1. zzzzzzzzzzzz
        22.01.2022 15:39
        +1

        А вот, например, Youtube (раз уж начали про Гугловое). Во-первых, там картинки как раз очень даже важны. А во-вторых, текст тоже сначала выводится мутными прямоугольниками...

        Подгрузка по клику -- это счастливое время "Web 1.0", с гипертекстом в том виде как он задумывался. Когда ты сам решаешь, хочешь грузить картинки сразу все на километровой странице или по щелчку. А ещё были такие "дикие" вещи, как возможность скачать статью или книжку себе в файл целиком и почитать офлайн...


  1. DabjeilQutwyngo
    22.01.2022 07:34

    можно ли угадать скорость доставки изображения

    Осталось реализовать предсказание запроса контента и ветвление по действиям пользователя на клиенте. Почти как в своё время сделал Intel для своих процессоров с предвычислениями и помещением предварительных результатов в кэш. Тогда сможете доставить контент заранее, и вопрос предсказания скорости доставки изображения или иного контента станет менее актуальным. Возможно, вы уже это делаете или пробовали. Тогда будет интересно узнать, что получилось.


    1. vikarti
      22.01.2022 08:20

      Собственно предсказание запроса контента давно умеют делать те кому надо.
      В "бытовых" задачах это Globax/TelliNet, ускорители для спутникового интернета. Идея то простая — если пользователь загрузил страничку — ему нужны и картинки с нее, и так далее. Но надо читать трафик (проблема с https).
      Но в http/2 есть push который именно под задачу "сервер знает что если клиент загрузил вебстраничку — ему потребуется и контент с нее и можно сразу послать"
      Тут предсказывать то ничего не надо.


      1. edo1h
        22.01.2022 15:43

        В "бытовых" задачах это Globax/TelliNet

        давно интересует что там внутри, есть ли открытая информация по основным идеям?


  1. ovel1
    23.01.2022 01:39

    Quic заблокирован, потому что не поддаётся ssl decryption и на корпоративных девайсах нельзя добиться нормального dlp.


  1. PavelVKovalenko
    23.01.2022 02:29
    -4

    Очень классная статья! Спасибо! Понимания по многим моментам добавилось!

    Хейтерам автора и вконтакта: Кто бы что ни говорил, сейчас основная проблема - не реклама на сайтах, а тормознутые браузеры, в частности хром и производные, да и мозила не блещет. Слишком много они кушают памяти (гигабайты). Слишком много переоптимизаций и улучшений, постоянно что-то пишут на диск, нет прозрачности по хранимым данным, в том числе персональным. Храните кеш в блобе - дайте возможность его примонтировать к фс.

    Я смотрю на список процессов на своем пк и вижу не хром, а тормознутый апач времен до появления nginx. Множество процессов (конкретно в моменте - 34), количество которых якобы обеспечивает улучшение быстродействия и безопасности. Надеюсь кто-то вроде Игоря Сысоева напишет "nginx браузер". И не только сервера будут быстрее работать, но и клиенты не будут жрать проц и озу!

    Всем хорошего настроения!