Хром и скорость
Подробное руководство по ускорению любимого браузера подручными средствами. В помощь домохозяюшкам, студентам и высшему руководству — всем у кого нет под рукой топового железа с 64Гб памяти для работы в современном интернете.
Хром
Браузер Chrome, созданный и разрабатываемый корпорацией Google давно стал главным инструментом для большинства пользователей компьютерной техники:
в вашем телефоне, планшете, телевизоре, ноутбуке и стационарном компьютере в подавляющем большинстве случаев будет установлен именно этот браузер, либо что-то на его основе.
Исключения редки, это продукция Apple со своим собственным браузером Safari, медленно умирающий Firefox и совсем уж сказочная альтернативщина.
Два вечных конкурента в виде браузеров Opera и Internet Explorer сдались и ныне используют под капотом одинаковый движок от Chrome.
Так что Google это мировой монополист в области браузеростроения, Chrome — его самый популярный продукт и фактически главное приложение для большинства современных пользователей.
Даже эта статья создавалась с помощью браузера Chrome:
Скорость
Конечно высокооплачиваемые разработчики самого популярного браузера на планете, щедро финансируемые «корпорацией добра» — не полные идиоты и разбираются в вопросах производительности собственного продукта гораздо лучше автора.
Но только проблемы производительности на дешевом, устаревшем и тем более неподдерживаемом оборудовании сотрудников Google.. мягко говоря не очень волнуют.
Поэтому в очередной раз простому пользователю, не желающему продавать почку ради современного компьютера придется заботиться о себе самостоятельно.
Применимость
Описываемые ниже инструкции — для десктопной версии браузера Chrome и с учетом специфики трех разных операционных систем: Windows, Linux и FreeBSD.
Мобильная версия браузера довольно сильно отличается, но также поддается подобной настройке. Однако чтобы не раздувать статью — про тюнинг мобильной версии расскажу в следующий раз.
Замечу также, что эта статья — далеко не самый возможный максимум оптимизации и если Господь наградил вас знанием языка С++, дав в руки компилятор, то сотворить с браузером можно гораздо больше.
Но тут все же для обычных людей, не обезображенных высшим техническим образованием и навыками системного программирования.
Производительность
Я использую Chrome на ноутбуках с момента его появления и часто работаю «в поле» — от батареи и без подключения к розетке. Помимо браузера на машине постоянно присутствуют еще несколько тяжелых приложений — в первую очередь среды разработки и разнообразные редакторы.
Все это в итоге формирует следующий набор требований:
- браузер не должен
нападать на человекаотбирать себе все доступные ресурсы; - браузер не должен «сжирать» батарею ноутбука;
- браузер должен продолжать работать с современными сайтами, сохраняя отзывчивость интерфейса.
Время «холодного запуска» и скорость отрисовки страниц при таких вводных разумеется могут пострадать, но будут оставаться в пределах разумного.
Версии Хрома
Чтобы не было путаницы, стоит сразу прояснить ряд нюансов с названиями продуктов и используемыми терминами.
Официально браузер от Google называется «Chrome» и поставляется (даже для Linux) в виде готовой сборки с инсталлятором, т.е. это закрытый коммерческий продукт, хотя и бесплатный для пользователя.
Именно эта версия доступна для скачивания с официального сайта и имеет максимальную интеграцию с сервисами и другими продуктами Google.
Открытая часть браузера Chrome (движок) называется «Chromium» и с точки зрения обычного пользователя никак не поставляется, поскольку Chromium предназначен в первую очередь для технических специалистов, участвующих в процессе разработки и тестирования.
Именно Chromium а не Chrome чаще всего установлен по-умолчанию в различных дистрибутивах Linux, в виде сборки от ментейнеров дистрибутива.
Chromium по-умолчанию имеет минимальную интеграцию с сервисами Google, что например не позволяет без дополнительных шагов устанавливать расширения из официального магазина.
Наконец существует проект «Ungoogled Chromium», авторы которого постарались удалить из Chromium абсолютно все интеграции с сервисами Google и все закрытые инструменты сборки.
Ungoogled Chromium за последние годы набрал немалую популярность, поэтому активно используется в BSD-системах и дистрибутивах Linux, ориентированных на безопасность.
Поскольку использование сервисов Google в наше непростое время может приводить к непредсказуемым проблемам и сбоям подключения, я буду использовать для всех оптимизаций Ungoogled Chromium либо просто Chromium, но не официальный Google Chrome.
Тем не менее, для простоты повествования в статье используется термин «Chrome» в качестве обозначения браузера, поскольку описываемые методы оптимизации полностью совпадают и частично применимы и к другим браузерам на основе Chromium.
Тестовая среда
Для статьи использовались современные 64-битные сборки браузера, с версиями начиная с 147 и выше:
147.0.7727.101 (Official Build) (64-bit)
Версии разные под разными операционными системами, но самые последние на момент написания статьи.
Замечу, что описанные ниже настройки постоянно используются на всех моих ноутбуках, как мощных и современных, так и откровенно.. винтажных.
Разумеется разницу лучше всего видно на устаревшем оборудовании, поэтому в качестве тестовой среды будут использованы два «боевых пенсионера»:
Эти весьма устаревшие по любым меркам (особенно второй) машины станут отличным тестовым полигоном для демонстрации результатов всех моих вивисекций оптимизаций.
Оптимизация
Поскольку целевая аудитория статьи — обычные пользователи, не владеющие с пеленок компилятором и отладчиком, ограничусь тремя вариантами оптимизации браузера, доступными без залезания непосредственно в код:
хитрые настройки, хитрые плагины и хитрое окружение.
Все ради того чтобы крутить ленту каких-нибудь Reddit/LinkedIn без зависания браузера и 100% загрузки системы.
Linux-версия
Так исторически сложилось, что я использую множество разных Linux-дистрибутивов в своей непростой деятельности:
Debian, Ubuntu, Manjaro, Mageia, Calculate — и это только на хосте.
Описанные ниже инструкции работают на всем этом зоопарке и по своей сути применимы для любого окружения на базе Linux, везде где используется браузер Chrome.
Замечу, что Calculate Linux (на базе Gentoo) использует OpenRC вместо systemd, поэтому там не используется трюк с systemd-run.
Начнем со скрипта запуска браузера, в котором специальными параметрами включаются или отключаются разные хитрые опции, а также используется специальное окружение:
#!/bin/bash
systemd-run --user --slice=chromium.slice chromium \
--enable-features=VaapiVideoDecoder,VaapiVideoEncoder \
--enable-gpu-rasterization \
--disable-gpu-compositing \
--enable-zero-copy \
--disable-background-networking \
--disable-client-side-phishing-detection \
--disable-prompt-on-repost \
--disable-sync \
--metrics-recording-only \
--no-first-run \
--safebrowsing-disable-auto-update \
--ignore-gpu-blocklist \
--renderer-process-limit=4 \
--disable-smooth-scrolling \
--wm-window-animations-disabled \
--animation-duration-scale=0 \
--disable-spell-checking \
--disable-features=WhatIsNewPage,Promotions,LensOverlay \
--enable-unsafe-swiftshader "$@"Сохраняете текст выше в какой-нибудь /opt/own/bin/chrom, выставляете бит запуска:
chmod +x /opt/own/bin/chrom
И используете этот скрипт для первого запуска браузера.
Переназначать обработку всех HTML-страниц в рабочем окружении на этот скрипт не стоит, поскольку процессы браузера Chrome умеют общаться между собой и пока есть хоть один работающий процесс — его настройки будут использоваться для запуска новых копий.
Теперь рассказываю страшную сказку про «прожорливый» Chrome и пропавшую память, точнее про эту интересную строку:
systemd-run --user --slice=chromium.slice chromium
Дело в том, что у браузера Chrome есть дурная привычка считать весь компьютер своей собственностью и захватывать максимум доступных ресурсов — всю свободную память и все доступные процессоры и ядра.
Пока вы работаете насервересовременной машине с кучей памяти, не держите открытыми сотни вкладок с 3D-графикой а конкуренцию браузеру за доступные ресурсы составляет только офисный пакет — проблемы нет.
Но стоит лишь немного просесть по мощности используемого оборудования или доступным ресурсам для более прожорливых программ (привет Davinci Resolve) и любимый браузер от «корпорации добра» немедленно показывает звериный оскал свое истинное лицо.
В случае ноутбука (тем более мощного) проявляется еще один дурной эффект:
скачки бесконтрольной нагрузки, создаваемой браузером очень быстро разряжают батарею.
Так что становится жизненно необходимым сажать браузер на ресурсную диету с помощью systemd и функционала cgroups.
Делается это в современных Linux-дистрибутивах довольно просто, для начала создаем файл ~/.config/systemd/user/chromium.slice со следующим содержимым:
[Slice] MemoryAccounting=yes MemoryHigh=1G MemoryMax=1.5G MemorySwapMax=3000M CPUAccounting=true CPUQuota=70%
Помимо очевидных лимитов на объем используемой памяти (MemoryHigh и MemoryMax), тут еще задается квота на загрузку процессора (CPUQuota), что не дает поднять ее выше заданного лимита — 100% загрузку CPU от процессов Chrome вы больше не увидите.
все указанные лимиты применяются ко всем дочерним процессам, которые запускает Chrome во время работы.
По сути создается ограниченный по ресурсам контейнер, внутри которого запускается браузер.
Ну и сам запуск с помощью черной магии systemd-run и указания слайса:
systemd-run --user --slice=chromium.slice chromium
Аналогичным образом можно ограничивать по ресурсам любые другие «жирные» приложения, например Telegram, который в последних версиях повадился генерировать 100% загрузку процессора по любому поводу.
Замечу, что сей хитрый трюк работает и с приложениями, работающими внутри AppImage или snapd-пакетов, так что с его помощью замечательно урезаются аппетиты версий Chrome/Chromium в Ubuntu/Manjaro, управляемые snapd.
Существует одно интересное расширение для Chrome, позволяющее отключать анимированные картинки на всех страницах:
вместо мигающейхтонианимации будет отображаться один статичный кадр.
Нетрудно догадаться, что этим сильно снижается нагрузка на CPU/GPU (особенно в случае устаревшего оборудования), с чего происходит серьезная экономия заряда батареи.
Так что очень рекомендую к использованию.
Ungoogled Chromium и установка расширений
К сожалению для установки расширений из официального магазина для «левого» Ungoogled Chromium и (совсем недавно) официального Chromium стало необходимо специальное расширение.
Без которого вас обрадуют сообщением об ошибке:
CRX_REQUIRED_PROOF_MISSING
А кнопка установки в интерфейсе магазина окажется скрытой.
В качестве альтернативного варианта можно использовать специальный сайт от авторов расширения, который позволяет скачать пакет с расширением .crx и установить его локально в вашем браузере.
Теперь переходим к самому интересному — к параметрам запуска.
Параметры Chrome
У браузера Chrome есть огромное количество разнообразных параметров запуска, как документированных так и не очень.
Часть из них дублируется во внутреннем служебном интерфейсе chrome://flags/ — может быть задана не из командной строки, а с помощью интерфейса браузера, часть — нет.
Поскольку прямого соответствия именований между параметром запуска и названием опции нет, я не стал описывать в статье еще и вариант настройки через переключение опций.
Тем более что ряд опций, доступных через служебный интерфейс не имеют отдельного параметра запуска.
Этих самых параметров настолько много, что энтузиастами был создан отдельный сайт, посвященный только лишь их описанию, выгружаемому непосредственно из исходного кода браузера.
Так выглядит их небольшая часть в динамике:
С учетом постоянного устаревания и регулярных ломающих изменений в функционале браузера нет ни возможности ни особого смысла описывать абсолютно все, поэтому ниже описаны только те параметры, которые постоянно используются на моих машинах в целях оптимизации.
--enable-features=VaapiVideoDecoder,VaapiVideoEncoder
Ключ --enable-features= как нетрудно догадаться из названия используется для принудительного включения опций браузера.
В данном случае принудительно включаются кодеки для аппаратного декодирования видео, работающие на базе Video Acceleration API (VAAPI).
По-умолчанию, если библиотека VAAPI в системе не установлена либо работает неправильно, браузер автоматически переключится на медленный программный кодек, с чего будет сильно нагружаться процессор при проигрывании видео.
С данной настройкой, при проблемах с VAAPI браузер либо перестанет запускаться совсем, либо покажет явную заглушку вместо видео — таким образом появится однозначный сигнал о серьезной проблеме.
Комфортно смотреть видео даже на современном оборудовании без работающего VAAPI врядли получится из-за сильной загрузки процессора, поэтому настройка весьма актуальна для всех пользователей.
--enable-gpu-rasterization
Данный ключ принудительно включает аппаратную отрисовку страниц с помощью GPU:
Chrome 37 introduced a GPU rasterizer. When enabled, some paint workloads can go from 100ms/frame to 4-5ms/frame.
Несмотря на то что опция является «экспериментальной» и вроде как работает не во всех случаях — ее включение это единственный вариант для комфортного использования современного браузера на устаревшем железе.
--disable-gpu-compositing
Принудительное отключение GPU-реализации композитора страниц.
Актуально для сильно устаревшего оборудования, вроде моего Asus F3KE, поскольку GPU-композитор на нем порождает визуальные артефакты и искажения:
--enable-zero-copy
Согласно строчке с описанием в исходном коде браузера:
Enable rasterizer that writes directly to GPU memory associated with tiles.
Немного ускоряет рендер страниц и снижает нагрузку на память, но может порождать визуальные артефакты, так что включать стоит не всем.
--disable-background-networking
Запрещает браузеру использовать фоновые сетевые запросы, например проверку обновлений для установленных расширений.
--disable-client-side-phishing-detection
Отключает фоновую проверку сайтов на фишинг.
Этот параметр вроде как удален в новых версиях браузера, но все еще часто встречается в различных руководствах и материалах.
Фоновое обновление этих баз отнимает ресурсы а сама проверка плохо работает в современных реалиях разделенного интернета, поэтому отключаем.
--disable-prompt-on-repost
Отключает дурацкое предупреждение о повторной отправке формы:
--disable-sync
Отключает облачную синхронизацию учетной записи Google.
Актуально только для обычного Chromium, для ungoogled-версии не используется, поскольку функционал глобальной учетной записи там вырезан.
--metrics-recording-only
Указывает браузеру только записывать отчеты с метриками производительности, но запрещает отправлять их на сервера Google.
Отчеты сохраняются в текущем профиле, актуальны при поиске проблем с медленной работой браузера или отдельных сайтов.
--no-first-run
Отключает приветственный диалог при первом запуске браузера.
--safebrowsing-disable-auto-update
Отключает автоматическое фоновое обновление баз для «Safe Browsing» — специального сервиса Google для защиты от фишинга и подозрительных сайтов.
Актуально для обычного Chromium, поскольку в ungoogled-версии функционал «Safe Browsing» удален.
--ignore-gpu-blocklist
Натурально заставляет браузер «работать на дровах» — использовать неподдерживаемое и сильно устаревшее оборудование для аппаратного ускорения.
Очень важная опция, без указания которой браузер тихо и цинично включит программную отрисовку ничего не сказав пользователю, с чего скорость отображения страниц сильно упадет.
--renderer-process-limit=2
Еще один «магический» параметр, критически влияющий на производительность браузера и потребляемые ресурсы.
Именно с его помощью переопределяется лимит на количество запущенных процессов отрисовки страниц — самых тяжелых процессов браузера, создающих основную нагрузку на систему.
Количество таких процессов напрямую влияет на потребляемые ресурсы, поэтому в случае ограниченных ресурсов стоит выставить какое-то небольшое число.
--disable-smooth-scrolling
Просто «имба» за которую вы потом будете благодарить — параметр отключает плавную прокрутку в браузере, которая очень сильно влияет на скорость при работе на слабом или устаревшем оборудовании.
Влияет настолько сильно, что разницу становится видно визуально после перезапуска.
--wm-window-animations-disabled
Отключает всю анимацию в интерфейсе браузера.
--animation-duration-scale=0
Переопределяет длительность воспроизведения CSS-анимации, значение 0 означает полное отключение, но работает к сожалению только для элементов интерфейса самого браузера, не для страниц.
--disable-spell-checking
Отключает фоновую проверку правописания, которая существенно влияет на скорость работы браузера (вплоть до подвисания страниц) и толком не работает для русского языка.
--enable-unsafe-swiftshader
Еще один важный параметр, который разрешает использование «небезопасного» программного рендера WebGL, что позволяет использовать 3D-графику в браузере даже на устаревшем оборудовании, которое не поддерживает современное Vulkan API.
--disable-features=WhatIsNewPage,Promotions,LensOverlay,OptimizationGuideOnDeviceMode
Данный параметр по прямой аналогии с описанным в самом начале --enable-features= переопределяет опции браузера, которые необходимо отключить.
В данном случае отключаем встроенную рекламу новых фич браузера, которые вылезают при обновлениях и очень сильно бесят отвлекают.
Актуально только для обычного Chromium, поскольку в ungoogled-версии все эти радости вырезаны.
Хром и Windows
Я использую Windows 11, 10 и 7 на рабочих станциях а также множество разных виртуальных машин с серверными версиями Windows.
Оптимизации актуальны только при использовании браузера на рабочей станции, поэтому в качестве тестовой среды будут выступать только три клиентских версии Windows: 11, 10 и 7.
Скрипт запуска выглядит следующим образом:
chrome.exe --enable-features=VaapiVideoDecoder,VaapiVideoEncoder^
--disable-features=WhatIsNewPage,Promotions,LensOverlay^
--enable-gpu-rasterization^
--disable-gpu-compositing^
--enable-zero-copy^
--disable-background-networking^
--disable-client-side-phishing-detection^
--disable-prompt-on-repost^
--disable-sync^
--metrics-recording-only^
--no-first-run^
--safebrowsing-disable-auto-update^
--ignore-gpu-blocklist^
--renderer-process-limit=4^
--disable-smooth-scrolling^
--wm-window-animations-disabled^
--animation-duration-scale=0^
--enable-unsafe-swiftshader %*Сохраняете текст выше в файле run.cmd, кладете в каталог рядом с chrome.exe и используете для первого запуска.
Используемые параметры браузера и их логика полностью совпадают с описанными выше для Linux, шаги по установке расширения для отключения анимации также полностью аналогичны описанным выше.
Замечу лишь что символ^— аналог\в UNIX-мире и используется для переноса длинных строк в командных скриптах под Windows.
Поскольку в последние версии и Chrome (и даже Chromium) под Windows авторы напихали AI-фич под завязку, на моих рабочих станциях используются только и исключительно Ungoogled-сборки.
Chrome и Windows 7
Google перестала поддерживать работу на Windows 7 для Chrome/Сhromium начиная с 2023го года, поэтому если у вас еще осталась живая «семерка» и необходимо использовать современный браузер — ждите мою следующую статью, в которой описан процесс бекпортирования современной версии браузера в Windows 7.
А пока посмотрите этот репозиторий, ныне к сожалению заброшенный, в котором некий китайский автор выкладывал бекпортированные под Windows7 сборки браузера вплоть до 2025 года.
Chrome и FreeBSD
Наконец последним разделом описываю то, с чего началась эта статья в далеком 2023м году:
оптимизация работы браузера Chrome под FreeBSD на очень сильно устаревшем оборудовании.
«Очень сильно устаревший» — про тот самый Asus F3KE из 2007 года, спасенный автором от достойного погребения:
Конечно же для столь мощного эффекта пришлось провести немало нечистых ритуалов оптимизаций (начиная с кастомного ядра), но как минимум половина производительности — результат подбора правильных параметров браузера.
#!/usr/local/bin/bash
source ~/.exports.sh
/usr/local/bin/ungoogled-chromium
--enable-features=VaapiVideoDecoder,VaapiVideoEncoder \
--enable-gpu-rasterization \
--disable-gpu-compositing \
--enable-zero-copy \
--disable-background-networking \
--disable-prompt-on-repost \
--metrics-recording-only \
--no-first-run \
--ignore-gpu-blocklist --renderer-process-limit=2 \
--wm-window-animations-disabled \
--animation-duration-scale=0 \
--enable-unsafe-swiftshader "$@" Довольно давно в FreeBSD используется ungoogled-версия браузера, поэтому были убраны параметры для функционала из обычного Chromium, который был вырезан в ungoogled-версии.
source ~/.exports.sh
на самом деле скрывает портал в ад отдельный механизм повторного использования сессии DBus, файл ~/.exports.sh создается таким специальным скриптом:
#!/usr/local/bin/bash
FF=0
if [[ -z $DBUS_SESSION_BUS_ADDRESS ]]; then
lines=$(pgrep "dbus-daemon" -u "$USER" | (while read -r line
do
echo $line
exp=`procstat -h -e $line`
if [[ "$exp" == *"DBUS_SESSION_BUS_ADDRESS="* ]]; then
echo "DBus session found"
exp2=`echo $exp |sed 's/.*DBUS_SESSION_BUS_ADDRESS=\([^ ]*\).*/\1/'`
echo export DBUS_SESSION_BUS_ADDRESS="$exp2" > ~/.exports.sh
FF=1
break
fi
done; echo $lines) )
echo $FF
if [[ "$FF" = 8 ]]; then
echo "DBus session not found, starting.."
dbus_out=`dbus-launch`
echo $dbus_out > ~/.exports.sh
fi
if [[ -f ~/.exports.sh ]]; then
source ~/.exports.sh
fi
fiЭтот скрипт натуральным образом ворует сессию работы с DBus, забираясь для этого в окружение запущенного процесса (да, так можно было) — все ради того чтобы ее не дублировать и не запускать процесс dbus-launch повторно.
Помимо приседаний с параметрами, в версии для FreeBSD также используется описанное выше расширение браузера для отключения анимации, а вместо изоляции через cgroups используется более простой вариант со сниженным лимитом на количество запущенных процессов рендера:
--renderer-process-limit=2
Чего вполне достаточно для комфортной работы.
За кадром
В качестве небольшого бонуса, ряд дополнительных параметров запуска браузера Chrome, которые остались за кадром.
Они также применимы ко всем версиям и вариациям браузера и работают на всех операционных системах.
--profile-directory=test-profile
Указывает альтернативное название профиля, по-умолчанию он называется Default и находится в каталоге пользователя.
Актуально в первую очередь для тестов, но может влиять на системы защиты от ботов, поскольку данный ключ часто используют системы автоматизации, работающие поверх браузера.
--single-process
Заклинание чудовищной силы, которое заставляет браузер работать в одном единственном процессе:
Этот весьма опасный (во всех смыслах) параметр переключает Chrome в нестандартный режим работы, при котором браузер не порождает отдельные процессы на каждую вкладку.
К сожалению такой режим работы является весьма нестабильным и браузер будет падать, особенно на сложном контенте и с большими расширениями вроде AdBlock.
Тем не менее, это единственный известный мне способ заставить Chrome работать без порождения дополнительных процессов, что актуально для тестов и автоматизации.
--disable-features=UseSkiaRenderer
Отключает современный бекэнд Skia Renderer, используемый в браузере для отрисовки практически всей графики:
Chrome uses Skia for nearly all graphics operations, including text rendering. GDI is for the most part only used for native theme rendering; new code should use Skia.
К сожалению этот параметр является обязательным если вы собираетесь использовать --single-process, думаю очевидно что скорость отрисовки страниц при этом упадет.
Эпилог
Мой опыт оптимизации браузера весьма специфичный и далеко не глобальный, поскольку решаемая задача касается производительности на устаревшем оборудовании и не самых популярных операционных системах.
Поэтому с радостью почитаю про ваш опыт и применяемые практики.