Библиотека сайта rus-linux.net
Высокопроизводительный сетевой стек Chrome
Глава 1 из книги "Производительность приложений с открытым исходным кодом".
Оригинал: High Performance Networking in Chrome
Автор: Ilya Grigorik
Дата публикации: 21 Сентября 2012 г.
Перевод: А.Панин
Дата перевода: 2 Декабря 2013 г.
История и принципы развития веб-браузера Google Chrome
Первый релиз веб-браузера Google Chrome был выпущен во второй половине 2008 года в формате бета-версии для платформы Windows. Созданный разработчиками компании Google код, лежащий в основе Chrome, был также доступен в соответствии с условиями пермиссивной лицензии BSD и послужил основой известного на сегодняшний день проекта Chromium. Для большинства наблюдателей эти события были достаточно неожиданными: неужели снова могли начаться войны браузеров? Сможет ли компания Google создать на самом деле качественный продукт?
"Это было настолько прекрасно, что мне пришлось изменить мнение..."
- Eric Schmidt комментирует свое изначальное негативное отношение к идее разработки Google Chrome.
В итоге все удалось. На сегодняшний день Chrome является одним из наиболее широко используемых для работы в сети браузеров (в соответствии с данными StatCounter рыночная доля составляет более 35%), при этом он доступен на платформах Windows, Linux, Mac OS X, Chrome OS, а также Android и iOS. Очевидно, что возможности и функции программного продукта привлекли внимание пользователей и многие инновации из Chrome также нашли свое место в других популярных браузерах.
- Скорость
- Необходимо создать самый быстрый браузер
- Безопасность
- Необходимо предоставить пользователю самое безопасное окружение
- Стабильность
- Необходимо предоставить гибкую и стабильную платформу для веб-приложений
- Простота
- Необходимо реализовать сложные технологии, окруженные простым пользовательским интерфейсом
Многогранность вопросов производительности
Современный веб-браузер является практически такой же сложной платформой, как и ваша операционная система, и Google Chrome проектировался с учетом этой аналогии. До появления Google Chrome все наиболее популярные браузеры были монолитными приложениями, использующими по одному процессу. Все открытые страницы делили одно и то же адресное пространство и пытались использовать одни и те же ресурсы. Ошибка на любой из страниц или в браузере могла привести компрометации всех страниц.
Chrome, в отличие от описанной выше модели, использует многопроцессную модель, которая позволяет осуществить изоляцию процесса и памяти и предоставить ограниченный безопасный контейнер для каждой вкладки. В мире многоядерных процессоров возможность изоляции процессов наряду с защитой каждой вкладки от воздействия других некорректно работающих страниц указывает на то, что Chrome имеет значительное преимущество по сравнению с конкурирующими продуктами. На самом деле, стоит упоминания и тот факт, что большинство браузеров уже последовали примеру Chrome или находятся в процессе миграции на аналогичную архитектуру.
В рамках созданного системного процесса ход исполнения веб-приложения в общем случае состоит из трех задач: получение ресурсов, формирование и вывод страницы и исполнение сценариев JavaScript. На этапах вывода страницы и исполнения сценариев используется однопоточная последовательная модель исполнения, так как невозможно осуществлять параллельные модификации результирующей объектной модели документа (Document Object Model - DOM). Частично это происходит из-за того, что JavaScript сам по себе является языком, предусматривающим однопоточное исполнение. Таким образом, оптимизация метода взаимодействия механизмов вывода страницы и исполнения сценариев критически важна как для веб-разработчиков, создающих приложения, так и для разработчиков, работающих над браузером.
Для вывода страниц Chrome использует систему Blink, являющуюся быстрой, открытой и соответствующей стандартам системой вывода страниц. Для исполнения сценариев на языке JavaScript Chrome поставляется со своей собственной реализацией в значительной степени оптимизированного интерпретатора JavaScript V8, который также был выпущен в виде отдельного проекта с открытым исходным кодом и нашел свое место в составе многих других популярных проектов - например, в проекте Node.js в качестве интерпретатора. Однако, оптимизации процесса исполнения сценариев на языке JavaScript интерпретатором V8 или оптимизации конвейеров разбора и вывода страниц системы Blink не улучшат пользовательские качества браузера в том случае, если браузер блокируется при обращении к сети, ожидая доставки ресурсов.
Реализация в рамках браузера возможности оптимизации последовательности, приоритета и задержки для каждого сетевого ресурса является одним из наиболее важных улучшений его пользовательских качеств. Вы можете не замечать этого, но сетевой стек веб-браузера Chrome буквально каждый день становится умнее, пытаясь скрыть или сократить задержки доставки для каждого из ресурсов: он сохраняет вероятно полезные в будущем данные DNS, он запоминает топологию сети, он предварительно соединяется с вероятными целевыми узлами, а также выполняет другие действия. Снаружи он представляется простым механизмом получения ресурсов, но внутри это сложный и занимательный пример того, как следует оптимизировать производительность работающих с сетью приложений для реализации лучших пользовательских качеств.
Давайте разбираться.
По мере исследования сети командой разработчиков становилось понятно, что многие используемые на сегодняшний день сайты являются не исключительно веб-страницами, а приложениями. В свою очередь, наиболее амбициозные приложения требуют высокой скорости работы, безопасности и стабильности окружения. Каждое из этих требований заслуживает отдельной главы для описания, но поскольку темой данной главы является производительность, мы сфокусируем наше внимание главным образом на вопросах скорости работы.
Продолжение статьи: Чем является современное веб-приложение?.