Всем привет! Меня зовут Максим Смирнов, я руковожу командой, которая работает над производительностью Яндекс Браузера и отвечает за его графическую подсистему. В этой статье я расскажу об одном неочевидном улучшении, которое наша команда внедрила в Браузер для Windows. Если описать его в двух словах, то нам удалось улучшить стабильность и производительность браузера, убедив драйверы видеокарт, что наше приложение — это Google Chrome.

Что мы знаем о взаимодействии драйверов с программами

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

А еще не секрет, что производители видеокарт сильно вовлечены в индустрию геймдева и зачастую оптимизируют свои драйверы под конкретные игры. Об очередной прибавке fps или починке бага в том или ином тайтле любят рассказать как AMD, так и Nvidia

Критерием для применения определённых оптимизаций при этом иногда может выступать не что иное, как название исполняемого файла программы. Хрестоматийный пример — Quake III. При переименовании экзешника quake3.exe в quaff3.exe в игре изменялись производительность и качество текстур. 

Применение workaround по названию исполняемого файла не ограничивается только играми. Когда-то наша команда столкнулась с одним багом: на ноутбуках Lenovo в Яндекс Браузере скроллинг веб-страниц с тачпада был слишком резким, но при этом в других браузерах (Chrome и Edge) такой проблемы не наблюдалось. 

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

Интереса ради мы попробовали переименовать исполняемый файл нашего браузера из browser.exe в chrome.exe — и вуаля! Скачки при скроллинге починились. Вероятно, в драйверах тачпада был «захардкожен» определённый список названий файлов приложений, для которых применялся фикс этой проблемы. 

Как нам пришла в голову идея переименовать браузер

Мы регулярно ищем новые способы для оптимизации производительности Яндекс Браузера и улучшения стабильности его работы. Некоторые оптимизации даже прорастают в Chromium. 

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

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

Проверяем гипотезу

Чтобы проверить нашу гипотезу про оптимизации, мы воспользовались особенностью архитектуры Chromium. GPU-процесс в браузере работает в специальной песочнице. Она предназначена для обеспечения безопасности приложения — ограничивает доступ процесса к ресурсам системы и другим процессам. Такая схема уменьшает потенциальный результат работы зловредного кода, если злоумышленникам каким-то образом удастся внедрить его в процесс. Также песочница позволяет устанавливать хуки для перехватывания вызовов системных API и обрабатывать их в своём коде.

Мы воспользовались этой особенностью, чтобы подменять подстроку browser.exe на chrome.exe в значениях, которые возвращают функции GetModuleFilenameA/GetModuleFilenameW и GetModuleFilenameExA/GetModuleFilenameExW

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

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

Экспериментируем

Дальше дело за малым: завернуть функциональность с подменой названия под отключаемый feature-флаг и провести A/B-эксперимент, то есть включить её в одной группе пользователей и отключить в другой, после чего сравнить полученные технические метрики. 

Результаты нас немало удивили: у пользователей с видеокартами AMD из экспериментальной группы число крэшей GPU-процесса уменьшилось в 5,5 раз, потребление памяти GPU-процессом снизилось в среднем на 8%, а ещё незначительно ускорилось открытие веб-страниц в браузере и отзывчивость интерфейса. 

Это означало, что в драйверах AMD действительно есть код, который применяется в зависимости от названия исполняемого файла приложения — в нашем случае для chrome.exe

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

Но ждать нам не хотелось, поэтому мы включили фичу с мимикрией под Google Chrome в GPU-процессе для всех пользователей на Windows. Если вы хотите проверить, что она работает и у вас, посмотрите в графу Executable Path на служебной странице browser://gpu в Яндекс Браузере (доступно с версии 22.9.0).

Подытожим

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

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

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


  1. Livefish
    00.00.0000 00:00
    +7

    Интересно, не думал, что нечто такое вообще может быть. Респект вам и вашей команде за то, что делает ебраузер лучше;


    1. Aquahawk
      00.00.0000 00:00
      +4

      Давние фокусы: https://habr.com/ru/post/103598/
      А ещё я помню историю, но не могу найти, когда какая-то очень популярная игра использовала винапи 98 винды недокументированным способом, и когда на xp тестили совместимость всего популярного софта, нашли это и тупо по имени exe файла специально для этой игры апи работало нештатным образом, но так, чтобы игра работала.


      1. dimykus
        00.00.0000 00:00
        +4

        По-моему это было с Win95 и SimCity


      1. blueboar2
        00.00.0000 00:00
        +5

        1. Aquahawk
          00.00.0000 00:00

          Оно. Оказывается Спольски об этом в 2000 году писал, я помнил что давно дело было.


          1. Arioch
            00.00.0000 00:00
            +4

            у Реймонда ( the old new thing ) таких историй масса

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

            Только на днях читал его письмо, которое обсуждалось на уровне замдира MS, суть письма в том, что кто-то слил в Visual C++ недокументированные коды и доки по ядру Win3.1, а они радостно и безальтернативно это запилили в продакшн. В результате на альфа-версиях Cougar (ядра будущей Win95) работали Zortech C++ и Borland C++, но Microsoft С++ падал на хрен.


      1. PresetX
        00.00.0000 00:00
        +5

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

        Старая цитата с какого-то форума

        Any application in AMD panel that is forced to power save find in place folder that was installed and just add _32 or _64 and save and now you can use discrete GPU not only APU or integrated like combination Intel CPU with Intel GPU and discrete AMD now you can use discrete GPU AMD , OK it will look like this explanation Read below

        C:\Program Files\Mozilla Firefox\firefox.exe rename to (in this case i have Mozilla installed in program files not in program files (x86) even this is Mozilla v.51.0.1.6234 32 bit i install all Applications in 64 bit folder , now just rename to C:\Program Files\Mozilla Firefox\firefox_32.exe and save And go to Amd control panel switchable application profiles AND NOW you can have Power Save than High Performance than Not Assigned and Based on Power Source Option Unlocked if you have Notebook and this also is for normal desktop PC with Windows Any Windows version from Win Xp to Win 10.1+

        also this y with _32 AND _64 you can add to any application that is Locked BY AMD DRIVERS.


    1. YuryB
      00.00.0000 00:00

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



  1. grokinn
    00.00.0000 00:00
    +5

    Недавно NVidia представила апскейл youtube видео в браузере Хром. С другой стороны Яндекс.Браузер поверх youtube видео делает свой озвученный перевод. Не возникает ли тут конфликта и как это все работает (или не работает?).


    1. Lof
      00.00.0000 00:00
      +2

      Мы проверили, эта технология от Nvidia работает и у нас в новой версии браузера, которая будет выходить на следующей неделе.


      1. ev_i
        00.00.0000 00:00
        +5

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


        1. IsUnavailable
          00.00.0000 00:00
          +7

          Так если на глаз не понятно то и зачем такая функция?)


    1. dartraiden
      00.00.0000 00:00
      +13

      С другой стороны Яндекс.Браузер поверх youtube видео делает свой озвученный перевод.

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


  1. sci_nov
    00.00.0000 00:00

    Неплохо, конечно, но всё-таки это костыль. Было бы лучше, если бы разработчик движка/драйвера в явном виде выдавал API с разными уровнями улучшения: 0 - бесплатно, но медленно, 1 - платно, но условно "быстро", и т.п.


    1. ZimM
      00.00.0000 00:00
      +7

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


    1. SergeyMax
      00.00.0000 00:00
      +24

      Неплохо, конечно, но всё-таки это костыль. Было бы лучше

      ... найти и устранить причину крэшей? /чувака_выкидывают_из_окна.jpg/


      1. efkz
        00.00.0000 00:00
        +3

        велосипеды_и_костыли.jpg )))


        1. sci_nov
          00.00.0000 00:00

          Эх, hardware, hardware...


  1. vladvul
    00.00.0000 00:00
    +1

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


    1. ksbes
      00.00.0000 00:00
      +14

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


    1. PuerteMuerte
      00.00.0000 00:00
      +3

      А это не ухудшение. Это наоборот, оптимизация. Грубо говоря, АМД собрала данные про проблемам работы в популярных приложениях, и для самых популярных написала заплатки, которые увеличивают стабильность и производительность конкретно этого приложения. Вот, для хрома такая заплатка есть, но она же подходит и для других браузеров на том же движке, просто не активируется, если исполняемый файл драйверу не знаком.


      1. me21
        00.00.0000 00:00
        +2

        А почему заплатка драйвера влияет на стабильность только одного приложения? Разве, если в драйвере исправлен баг, это не отражается на всех приложениях?


        1. PuerteMuerte
          00.00.0000 00:00
          +9

          А это совсем не обязательно баг в драйвере. Это, например, изменение стратегии выделения памяти. Которая для разных приложений может иметь разные настройки, в зависимости от характера работы этих приложений с апи драйвера.


  1. vvviperrr
    00.00.0000 00:00
    +31

    сначала подумал, что "переименование" браузера - это самоирония яндекса, типа взяли хромиум, назвали яндексом, надели стринги - и все летает :)


  1. Aquahawk
    00.00.0000 00:00
    +1

    Вообще конечно webgl близко не так стабилен, как в своё время flash был. Большие сложные webgl игры часто вылетают у игроков на совершенно разном железе.


    1. Format-X22
      00.00.0000 00:00
      +1

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

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


      1. Aquahawk
        00.00.0000 00:00
        +2

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


        1. nidalee
          00.00.0000 00:00
          +1

          Дырявый был. Не осилили дальше костылями подпирать уязвимости и просто прикрыли.
          По крайней мере это официальная версия.


        1. molnij
          00.00.0000 00:00
          +2

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


          1. Aquahawk
            00.00.0000 00:00

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


      1. molnij
        00.00.0000 00:00

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


  1. blik13
    00.00.0000 00:00
    +3

    Во что переименовать хром чтоб он кушал меньше оперативной памяти?


    1. vanxant
      00.00.0000 00:00
      +20

      Возможно, поможет /dev/nul :)


    1. Aquahawk
      00.00.0000 00:00
      +8

      Тут у меня есть только один совет, каждый раз обновляя компьютер заталкивайте туда максимальный поддерживаемый объём памяти. В 2011 я затолкал в ноут 16 GB, в 2013 в десктоп 32. Тогда на меня смотрели как на идиота, а я работал с комфортом. Сейчас, думая обновить настольник я думаю о 128 Gb. Это действительно решает вопрос с потреблением памяти и комфорт работы окупает её цену многократно.


      1. 104u
        00.00.0000 00:00
        +1

        Если не секрет, на что столько памяти? Тысячи вкладок открытыми держать? У меня на десктопе 32, мне на всё хватает. От бесплатных 128 я бы не отказался, разумеется, но подозреваю, что бОльшая часть была бы пустая


        1. PuerteMuerte
          00.00.0000 00:00
          +8

          Вот с моего ноутбучка. Тоже думаю, что пора 128 ставить.


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


          1. 104u
            00.00.0000 00:00

            Спасибо за разъяснение, если честно, не думал, что у разработчиков столько оперативы влёт уходит


            1. Zifix
              00.00.0000 00:00
              +2

              Во-первых, столько уходит далеко не у всех. Во-вторых, объем занятой памяти не всегда означает потребление, возможно туда что-то ОС кеширует, например: https://www.linuxatemyram.com/


            1. vanxant
              00.00.0000 00:00
              +2

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


        1. Aquahawk
          00.00.0000 00:00
          +2

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


          1. 104u
            00.00.0000 00:00

            Всякие телеги со скайпами вроде не много жрут (телега у меня 25МБ кажет), а вот куча браузеров с виртуалками, приправленные фотошопами и правда уничтожают озу. Спасибо и вам за разъяснение


            1. molnij
              00.00.0000 00:00
              +1

              Скайп же вроде на электрон перевели, а значит память он неизбежно жрёт как ненормальный


              1. Aquahawk
                00.00.0000 00:00

                К электрону, по части производительности, у меня вообще нет претензий, особенно к vs code. Единственная претензия которая у меня к нему есть, он всё ещё не поддерживает многооконность. Rider тупит и висит чаще чем VsCode.


            1. DistortNeo
              00.00.0000 00:00

              Телега жрёт довольно много:



              Под линуксом — так вообще 1.3 гига.


              1. zuek
                00.00.0000 00:00

                Извините, Вы что с "телегой" делаете?


                1. morijndael
                  00.00.0000 00:00

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


        1. vconst
          00.00.0000 00:00

          Воркстеншн для обработки 2д графики



          Когда доходит до 90 — ребут


      1. DistortNeo
        00.00.0000 00:00
        +1

        заталкивайте туда максимальный поддерживаемый объём памяти

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


      1. axe_chita
        00.00.0000 00:00

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


        1. vanxant
          00.00.0000 00:00

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


          1. axe_chita
            00.00.0000 00:00
            +1

            Я и не говорю, что частота всегда снижается. Просто нужно быть внимательными, при реализации своих хотелок. К примеру, если на материнской плате с 754 сокете поставить третий модуль DDR, то частота дропалась с 400 на 333. ЕМНИП то что подобное было на старших процессорах Intel и Xeon


            1. DistortNeo
              00.00.0000 00:00
              +1

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


              1. PuerteMuerte
                00.00.0000 00:00

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


      1. dartraiden
        00.00.0000 00:00

        Сейчас, думая обновить настольник я думаю о 128 Gb.

        На актуальных мейнстрим-платформах предел — 192 Гб. Производители материнок сейчас как раз добавляют поддержку 48-гигабайтных модулей DDR5.


        Можно начать с парочки таких модулей (двухканальный режим), а если припрёт, то потом удвоить. Хотя, я сомневаюсь, что припрёт.


    1. 104u
      00.00.0000 00:00

      Сначала стОит переименовать сайты, ведь потребление браузера по большей части зависит от свистоперделок на конкретных сайтах. Одна вкладка какого-нибудь сайта запросто может выжрать 500МБ


    1. MRD000
      00.00.0000 00:00

      Chromebook, куча открытых вкладок + Linux VM + Android приложения. Все работает на 8ГБ, проблем нет.

      Посмотрите для начала сколько ваша система кушает до того как хром открылся.


      1. vtal007
        00.00.0000 00:00

        то, что оно работает на 8гб, значит что часть выгружается на диск.

        ОС сейчас умные. И на 4гб будет работать


        1. PuerteMuerte
          00.00.0000 00:00

          то, что оно работает на 8гб, значит что часть выгружается на диск.

          Эту премудрость менеджеры памяти в ОС на персоналках освоили ещё в 1980-е.


  1. spc
    00.00.0000 00:00
    +21

    Самое смешное, что в эту игру можно играть вдвоем. К примеру, если подменять название браузера (например, Edge на Яндекс) при поиске в Яндексе, то можно видеть дополнительные результаты поиска и кэшированные версии страниц. Фишка, конечно, примитивная и специфическая, не спорю.


  1. Crimento
    00.00.0000 00:00
    +5

    Понимаю, тоже недавно столкнулся с чем-то, вызывающим вопросы "как?" и "почему?". Discord отказывался устанавливаться, даже не оставляя никаких логов.

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

    Ответ лежал в HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Update.exe


  1. ganzmavag
    00.00.0000 00:00
    +3

    Вспомнилась история с Opera, только тогда Течнер (кажется он) говорил, что ее вообще специально замедляли. То есть она могла нормально работать с Гуглом только если мимикрировала под другой браузер.


  1. Latrommy
    00.00.0000 00:00
    +10

    Реализуйте отключение динамического фона в Яндекс.браузере, если активно удаленное подключение к рабочему столу, использующее RLE-подобные алгоритмы сжатия изображения.
    RDP, Radmin, Anydesk, Ammy admin и подобные приложения разрывают соединение, когда Яндекс.Браузер стримит динамический фон.


    1. mihmig
      00.00.0000 00:00

      Да они даже не делают пустой фон. Только картинку.
      Приходится таскать на все компы png-файл с белым цветом...


      1. FTOH
        00.00.0000 00:00

        Одноцветный фон можно выбрать здесь: https://browser.yandex.ru/wallpapers/34


  1. DEamON_M
    00.00.0000 00:00
    +3

    Угу. Есть даже прога https://github.com/Orbmu2k/nvidiaProfileInspector, где можно посмотреть (и поменять и даже создать свои) костыли, которые подрубаются для конкретных приложений. Я так правил кривую работу SLI на 1070 в Apex Legends


  1. Enfriz
    00.00.0000 00:00
    +1

    Заговор корпораций! Авторы из AMD помогают своему Гуглу выглядеть быстрее остальных браузеров :)


    1. chelovek-jpeg
      00.00.0000 00:00

      На вин7 у меня на ноуте все браузеры не особо быстро запускались, наиболее быстрым был brave. Поставил 10-ку, встроенный Edge запускается моментально)


  1. grey_rat
    00.00.0000 00:00

    А что будет с поддержкой вин7 — 8.1 в Яндекс браузере?


    1. Lof
      00.00.0000 00:00

      Мы работаем над тем, чтобы поддерживать Windows 7 - 8.1
      В прошлый раз, когда Chrome отказался от поддержки Windows XP, мы еще год продолжали его поддерживать: https://browser.yandex.ru/blog/windows-xp


      1. grey_rat
        00.00.0000 00:00

        Спасибо


  1. Alvolk
    00.00.0000 00:00

    Да, неплохо придумали:)


  1. esisl
    00.00.0000 00:00

    Не, ну кругом ЖУЛЬЁ!!!