Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Скорость с доставкой до пользователя / Анатолий Орлов (Self Employed), Денис Нагорнов (Яндекс)

3,277 views

Published on

1. Многие коллективы разработчиков пытаются измерять скорость отклика сайта и пишут, например, “эта страничка сформирована за 300 ms”.
2. Проблема в том, что 300 ms — это "у нас на сервере". Пользователю, на самом деле, все равно, сколько это "у вас на сервере”, ему надо “сколько у меня в браузере”. В среднем по больнице, 300 ms на сервере с размером странички в 60-70 Кб, могут быть 2.5 секунды на клиенте.
3. Перед тем, как это лечить, надо это измерить. Есть 2 способа:
а. Navigation timing api, поддерживается сейчас много где, но не везде поддерживается одинаково, есть места, сложные для понимания и осмысления (тут много слайдов).
б. Можно взять tcpdump, в нем есть ACK ответов от клиентов, и измерять по ним. Есть Open Source soft (софт нап Насретдинов исан мной в Яндексе, есть договоренность его выпустить), который это делает. В tcpdump большой бонус в том, что можно понять, что происходит.
4. Что происходит в соединении, что такое rtt, как это влияет на latency. Как на это влияет cdn и вынесение всяких фронтендов ближе к пользователю.
5. Почему, вообще, бывает медленно, почему у пользователя может медленно работать wi-fi даже на широком и хорошем канале, уже не говоря про мобильный интернет.
6. Как влияют на скорость антивирусы и еще некоторая неведомая DPI херня (tm), которая делает так, что в советской России (а, возможно, во всем мире) https часто быстрее, чем http (и с чем, собственно, связано то, что на него куча компаний переходят).

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Скорость с доставкой до пользователя / Анатолий Орлов (Self Employed), Денис Нагорнов (Яндекс)

  1. 1. Скорость с доставкой до пользователя Анатолий Орлов Денис Нагорнов v. 0.5t
  2. 2. 430ms
  3. 3. 625ms?
  4. 4. Скорость на клиенте • Что измерять? – ??? (нет одной циферки) • Как измерять – Измерять на клиенте – Загружать обратно – Считать статистику
  5. 5. … молоток и гвозди • API – Navigation Timing API – Resource Timing API – firstPaintTime (Chrome) – msFirstPaint (IE)
  6. 6. События браузера
  7. 7. Первый байт быстрого* сервера -500 500 1500 2500 3500 Новосибирск Владивосток Алматы Киев Астана Екб Стамбул Минск Анкара Спб Москва 50% 70% 90% 95%
  8. 8. Посл. байт быстрого* сервера (60kb) 0 500 1000 1500 2000 2500 3000 3500 Новосибирск Киев Алматы Владивосток Астана Екб Москва Спб Стамбул Минск Анкара 50% 70% 90% 95%
  9. 9. … наглая ложь, и статистика • Не все браузеры поддерживают – На мобилках только Chrome • Считают разное – firstPaintTime/msFirstPaint* • Подвержено bias
  10. 10. До первого байта 0 200 400 600 800 1000 1200 1400 Chrome/Windows Firefox/Windows MSIE/Windows Opera/Windows Safari/Macintosh YaBrowser/Windows
  11. 11. Особенности HTTPS • Должно быть медленней – время на handshake • Первый байт быстрее – aртефакт? • Становится быстрее* – What?! *без НДС
  12. 12. Соотношение…
  13. 13. Proofpic - СПБ
  14. 14. Proofpic - Владивосток
  15. 15. Proofpic - Киев Киев? Кажется это не великий русский firewall
  16. 16. Proofpic - Стамбул В Стамбуле с другой стороны нет почти разницы… (тут 10% https траффика, но влиять не должно)
  17. 17. Конец первой части • Поняли: – Серверное время – не всё – Как измерять клиентское • Непонятно: – 0ms (60kb) –> 3249ms в 95%, ping < 200ms
  18. 18. tcpdump - оружие героя • Можно понять все. • Сервер знает о доставке. • tcpdump – трудоемко, точечно. • Можно ли автоматизировать?
  19. 19. tcplanz • github.com/yandex/tcplanz • Парсит tcpdump-ы, быстро • Hardcore tool, не продукт.
  20. 20. Постановка проблемы
  21. 21. Распределение 490ms 170ms Web сервер отработал за 170ms, а TCP стек решил задержать на 320
  22. 22. TCP за 1 слайд • rtt – время туда и обратно. ping ~ rtt. • ACK – подтверждение доставки • cwnd – сколько можно отослать без подтверждения
  23. 23. Скорость доставки • На каждые CWND пакетов нам нужно rtt времени. • cwnd = 10, rtt=100, 145kb/s • cwnd = 100, rtt=50, 2900kb/s • cwnd медленно растет, пока все хорошо, сильно падает, когда пакет теряется.
  24. 24. TCP - Summary • Новейшие технологии 70-х • Для деления канала, не для latency • Для проводов • Потеря -> congestion
  25. 25. WiFi Длина волны 2.4Ghz – 12.5 сантиметров Пакеты пропадают сами по себе без congestion
  26. 26. WiFi vs TCP
  27. 27. Уменьшайте размер* странички
  28. 28. CDN для динамики
  29. 29. Крутите параметры • Параметр Initial CWND • Initial CWND=10 (был = 4, до этого =2) • Страничка в 60кб ~ 40 пакетов ~ 3-4 rtt.
  30. 30. Initial cwnd=20 Разница между первым и последним пакетом ответа Разница между ACK последнего пакета от пользователя
  31. 31. Безумный пример • Игнорируем cwnd, шлем все 40 пакетов каждую 1ms следующий. • Получаем selective ack, досылаем то, что потерялось. • Страница на хорошем канале придет за 1-2 rtt, на плохом будет хуже. • Сейчас такое сделать нельзя* в QUIC можно * внутри CDN примерно так все и ходит, cwnd учитывается, но он запредельного размера.
  32. 32. Итоги • Задержку доставки сервер делает сам из-за ограничений протоколов • Серебряной пули нет, но место для оптимизаций есть. • Делая оптимизации следите за метриками Timing API и tcpdump
  33. 33. Спасибо! Вопросы? Анатолий Орлов anatolix@yandex.ru Денис Нагорнов den@yandex-team.ru
  34. 34. Выкинуто • Тут остались слайды, которые видимо не удастся рассказать, так чтобы все поняли
  35. 35. Пару слов о HTTP • Новейший протокол 90-х • Второй запрос в соединении = лишний rtt. • Количество соединений ограничено. • Фиксится SPDY/HTTP2
  36. 36. GPRS/Edge/LTE • Первые два просто медленные с большим RTT • сами разбираются ретрансмитами (см. HARQ), может страдать Latency • Ретрансмит внутри LTE выглядит для TCP как самопроизвольное временное возрастание rtt. Будет ли лишний ретрансмит от TCP? • Мелкий декларируемый application window у мобильников
  37. 37. QUIC • Сейчас революционного ничего нет. • Вытаскивает в user-space то, что сейчас зашито в ядре – Можно сделать разную политику передачи в зависимости от user agent. • Если вы пишите приложение под iPhone/Android, то играться с протоколами можно прямо сейчас.

×