Комментарии 101
Вообще очень круто, молодцы!
Какие преимущества у этого решения по сравнению с имеющимися у операционной системы файлом подкачки? В обоих случаях данные сбрасываются на диск при недостатке памяти. Только в подкачку попадают действительно редко используемые данные на основе статистики, а вы сохраняете и восстанавливаете вообще все содержимое, что явно только замусоривает физическую память редко используемыми данными.
Ну, возможно, в том, что тут будут выгружаться только неактивные данные.
И в чем отличие с фалом подкачки? Только в том, что файл подкачки более гранулярный и может выгрузить неиспользуемую память даже у текущей вкладки, если она не была нужна какое-то время. То есть файл подкачки в этом смысле эффективнее.
2. Браузер гораздо лучше, чем ОС, понимает, какой процесс можно освободить.
3. Мы работаем превентивно и не даем системе «уйти в своп».
4. ОС может загрузить из свопа из-за необязательной фоновой активности.
3 Мы работаем превентивно и не даем системе «уйти в своп».
Вот это я не совсем понимаю. Для того, чтобы что-то ушло в своп, не обязательно должно не хватать памяти. Windows очень охотно вымывает память приложений при обычной дисковой активности. Это конечно большая проблема для пользователей, но для вас это данность. В результате фоновые вкладки скорее всего и так уже уйдут в своп после первой фоновой проверки антивируса или ежедневной индексации диска. Так что когда действительно понадобится память, вы начнете перекладывать старые вкладки с диска на диск, чем только усугубите ситуацию.
4 ОС может загрузить из свопа из-за необязательной фоновой активности.
Так такую фоновую активность нужно в первую очередь останавливать, а уже потом думать над другими способами оптимизации.
Таким образом с Hibernate нужно прочитать с диска объем X данных и при этом в системе достаточно свободной памяти, WorkingSet других процессов не сжимается. А в обычном случае это запись X*10 + чтение X*10. Т.е. дисковой активности в 10-20(!) раз больше. Пользователи с медленными жесткими дисками это очень хорошо заметят.
Когда мы говорим что процесс вкладки лежит в свопе, значит есть нехватка памяти
Нет, не значит. Вы отвечаете на комментарий, в котором я описываю почему так может случится.
ОС потребуется сжать WorkingSet других процессов, чтобы освободить RAM, куда загрузить страницы из свопа. Т.е. потребуется сначала сохранить в своп «не нужные» страницы, а потом загрузить «нужные».
То же самое, что и при гибернации.
И таких страниц в 5-10 раз больше чем нужно для сохранения в режиме Hibernate.
Таких страниц (которых нужно освободить) будет ровно столько, сколько нужно реальной памяти, чтобы в ней поместилась вкладка. Но есть отличие: при свопе будут восстановлены только те страницы, которые нужны здесь и сейчас, их может оказаться 50% или меньше. При Hibernate нужно будет восстановить всю память процесса, даже если 80% не нужно для отображения прямо сейчас.
Каким образом контролируемое поведение в отрыве от всего остального может помочь? Вы можете например на бумажке карандашом исполнять процессорные инструкции, будете иметь 100% контроль над выполнением, но ускорения программы вы этим конечно же не добьетесь.
Мысль о том что это статья об отдельной реализации memory manager'а внутри браузера, который работает в ОС, в которой итак есть memory manager, возникает с самого начала и не развеивается до самого конца.
Вопрос который возникает после всего: почему реализовать собственный процесс управления памятью легче, чем помочь уже существующему memory manager'у ОС понять что некоторые области памяти можно отправлять в pagefile в первую очередь (например управляя активностью потоков, частотой использования памяти и при помощи приоритетов), и оставить эту работу ему?
Тут интересно написано про жизнь pagefile.
На второй — ручное управление, что опять-таки означает более плавную навигацию. К примеру, из свопа не вылезает первым делом скриншот страницы, а лезут какие-то данные, с ней связанные.
На третий — ну как же это же свой, собственный велосипед! Как хочу, так и курочу :-)
П.с. я не из Яндекса, я мимокрокодил.
Что касается загрузки из свопа и выгрузки в Hibernate — работа со свопом и так происходит постоянно (по вашим словам), поэтому вся операция должна занять не больше времени, чем обычная запись на диск. Поправьте меня, если я где-то не прав.
Жаль, что мое вопросы выше остались без ответа (
Прошло уже три года. Я полгода, как перешел с хрома на яндекс браузер. И вот теперь я испытываю неудобства от этого. Несколько раз бразуер висиз-за нехватки памяти. Часто закладки крашатся из-за нехватки памяти.
К сожалению, девелоперы браузеров почему-то считают что гибернацию нужно начинать только когда свободной памяти мало — а это часто неправильно, ибо когда её мало вообще — то обычно поздно пить боржоми (браузер не единственный процесс в системе).
Ещё одно преимущество гибернации в приложении — это как раз независимость от файла подкачки — его можно закрыть (с гибернацией), потом открыть и продолжить с точки закрытия.
Вы несёте бред. Подкачка — это стандартный механизм всех ОС начиная с windows 3.1. Именно благодаря подкачке стала возможна истинная многозадачность и сильно упростилась разработка приложений, т.к. каждому приложению больше не нужно писать свой менеджер памяти. Память теперь условно бесконечная.
Ну а то, что вы её отключили — так это ваше дело. Вы может ещё половину экрана закроете картоном и будете кричать, что разработчики совсем обленились, не оптимизируют программы, чтобы на половине экрана были доступны все функции?
Приложение не имеет контроля над алгоритмами подкачки, а ОС не имеет понятия о том что является горячими или холодными данными для приложения, простой факт длительного неиспользования или редкого использования (пусть даже с элементами эвристики или даже AI) — вовсе не показатель того что память можно выгружать (это зависит от задачи).
Приложение может сказать «не выгружать область памяти X» посредством mlock()/VirtualLock() (хотя и в ограниченных пределах), но не может сказать «выгрузить область X немедленно» или «вернуть область X в память и сообщить когда готово» (неявный возврат при обращении == лаг для приложения). Хуже того, выгруженные данные вне контроля приложения, они не сохраняются при завершении приложения, и приложение понятия не имеет, выгружены они или нет на самом деле. Если некоторые данные (вкладка) мне нужны раз в день, но мгновенно — то подкачка только всё испортит, она не знает что если нечто не использовалось аж 23 часа может вдруг потребоваться мгновенно и заранее подкачать это к нужному моменту.
Насчёт «истинной» многозадачности (не знаю что уж вы имеете в виду под «истинной») — то многозадачность существовала задолго до механизмов подкачки и прекрасно обходится без них и сейчас. Есть масса задач где подкачка вообще явно запрещена (именно в связи с тем что она непредсказуема и неэффективна).
Насчёт своего менеджера памяти — о да, ну конечно не нужно — именно поэтому существует с десяток библиотек а-ля malloc() и сборщиков мусора, и почти каждый крупный проект делает свой. И именно поэтому существуют сотни вариантов сериализации данных и десятки форматов их хранения (не для баз данных), не так ли?
Насчёт половины экрана — во-первых, экран, в отличие от файла подкачки, вещь монолитная и неделимая, если уж он есть, вы вправе расчитывать известное вам разрешение, то он весь ваш. Но тут появляется во-вторых — кто-то додумался до экранов круглой и других форм, и (внезапно) вы даже на это не можете расчитывать (уже почти картонка). И в-третьих, монобровь на некоторых мобильных передаёт вам пламенный привет — это конечно не пол-экрана, но всё же досадное недоразумение в весьма популярном для всяких контролов месте, и нравится вам это или нет, но либо вы это учитываете в своём приложении либо теряете долю пользователей с таким железом.
Так что да — уж извините, но я буду «кричать» — девелоперы должны учитывать реальные системы и реальные потребности пользователей, если они делают продукт не для себя.
В конце концов, если бы файл подкачки был настолько универсальным и единственно правильным («истинным», наверное?) методом — то вопрос гибернации вкладок вообще бы сейчас не обсуждался, и не было бы массы причиндал для этого. Но реальность такова, что он никак не может заменить «нативную» гибернацию, и никакие апологеты механизма подкачки этого не изменят.
На ОС Win7 x64 — 4 ГБ ОЗУ.
ОС не имеет понятия о том что является горячими или холодными данными для приложения
ОС как раз знает по факту, какие данные являются горячими. А приложение может лишь предполагать, потому что приложения большие и сложные и то что ваш код не использует какие-то данные, не значит что их не использует какой-то другой код.
простой факт длительного неиспользования или редкого использования (пусть даже с элементами эвристики или даже AI) — вовсе не показатель того что память можно выгружать (это зависит от задачи).
Верно. Показатель того, что память можно выгружать — наличие виртуальной памяти и подкачки. А показатель того, что память нужно выгружать — нехватка памяти. Что именно выгружать — вопрос алгоритмов ОС. Тут все просто — либо мы хотим многозадачности и тогда нужна подкачка и выгружать можно всё что угодно. Либо мы хотим сами управлять, что выгружать, тогда наш выбор однозадачность. Но что-то я не слышал, чтобы яндекс-браузер можно было загрузить в однозадачном режиме вместо ОС.
подкачка не знает что если нечто не использовалось аж 23 часа может вдруг потребоваться мгновенно и заранее подкачать это к нужному моменту.
А гибернация знает заранее? )
ОС как раз знает по факту, какие данные являются горячими.
ОС как раз не знает — предполагает. В уже приведенном примере — для меня какая-то вкладка в браузере — всегда горячие данные, я хочу их в любой произвольный момент времени в памяти, а не в свопе (даже если я её неделю не трогал) — но ОС может подумать что их можно выгрузить если они длительно не использовались (что она и делает).
то что ваш код не использует какие-то данные, не значит что их не использует какой-то другой код
Простите? Если это моё приложение и весь код — тоже мой, я точно знаю какой код какие данные использует и зачем.
А показатель того, что память нужно выгружать — нехватка памяти.
Да ну? Что ж тогда при её использовании максимум на 50% в своп что-то валится? Где ж эта «нехватка»? Причем и в линухе и в вынь, что примечательно. Да, я в курсе про мантру «выгрузить всё что редко используется и отдать память кэшу» — но я этого не хочу. Это моя система, мне лучше знать когда и кому что отдавать. В конце концов, я специально поставил в два раза больше памяти чем может потребоваться чтобы обходится без подкачки.
Тут все просто — либо мы хотим многозадачности и тогда нужна подкачка и выгружать можно всё что угодно.
Я не совсем понимаю — причём тут вообще «многозадачность»? Без подкачки всё отлично работает (если памяти достаточно) — чем её отсутствие мешает «многозадачности»? Количество процессов или потоков не зависит от наличия или отсутствия подкачки, их одновременная работа и взаимодействие тоже.
А гибернация знает заранее?
Да. Потому что я могу поставить на вкладке метку «не трогать» — и её никто не тронет. Или приложение может реализовать свой алгоритм (типа «гибернировать только если месяц не трогали»). Существует масса способов дать хинт приложению — как алгоритмический, так и явный (от пользователя), а использование подкачки — процесс абсолютно независимый от желания и намерений пользователя и/или приложения, его невозможно контролировать (даже на линухе — swappiness мало помогает).
Вы как будто рассматриваете не реализацию гибернации в реальном мире, где уже есть подкачка и планировщик (откровенно не очень хорошего качества), а рассказываете, как было бы классно, если бы приложение работало в идеальных условиях, где кроме браузера ничего не запущено, а подкачки нет. У вас подкачки нет, хорошо, вы конечно очень важный пользователь для Яндекс.Браузера, но сомневаюсь, что эту фичу делали для вас одного.
ОС как раз не знает — предполагает.
ОС как раз точно знает, какие страницы использовались в последнее время.
В уже приведенном примере — для меня какая-то вкладка в браузере — всегда горячие данные. я хочу их в любой произвольный момент времени в памяти, а не в свопе
И в чем отличие от гибернации? Что будет держать вашу любимую вкладку в памяти при гибернации?
Простите? Если это моё приложение и весь код — тоже мой, я точно знаю какой код какие данные использует и зачем.
Я рад, что вам не приходилось писать приложения больше 100к строк кода. К ожалению, браузеры намного более сложный продукт.
Что ж тогда при её использовании максимум на 50% в своп что-то валится?
Это элементарное логическое утверждение. Из того, что А является причиной для B никак не следует, что других причин у В быть не может. Я уже говорил, что в виндусе дисковые операции активно вытесняют память приложений в своп.
Да, я в курсе про мантру «выгрузить всё что редко используется и отдать память кэшу» — но я этого не хочу
Да еще раз, никто сейчас с вами не обсуждает релизацию подкачки в винде и линуксе. Это вообще не тема статьи и не во власти разработчиков браузера. Им уже дан сверху этот механизм, который как-то работает и им нужно в этих условиях что-то сделать полезное. Ваш прекрасный выдуманный мир, где вы собственноручно решаете какой процесс нужно выгрузить, я рассматривать не хочу.
Потому что я могу поставить на вкладке метку «не трогать»
Что-то я видимо невнимательно прочитал статью, что не заметил там никаких меток. Опять какой-то придуманный мир?
… как было бы классно, если бы приложение работало в идеальных условиях, где кроме браузера ничего не запущено, а подкачки нет
С точки зрения приложения — ему не нужно знать какие ещё есть приложения, ему нужно знать только какие ресурсы ему выделены, а не пытаться взять всё что есть. Если у меня (условно) 8G памяти, я хочу иметь возможность сказать приложению — «у тебя есть 4G, крутись как хочешь». Почему только 4G, это не его дело — и вот тут как раз встроенное управление памятью/гибернацией важно (потому что ОС точно этого не сделает — в рамках установленных ограничений на процесс).
Подобный механизм (ограничение памяти приложения или их группы) встроен в Linux (и похожие системы) изначально (ulimit/cgroup), в Windows есть некий аналог (Job Objects) — и это правильных подход. В реальной же жизни браузер зачем-то ориентируется на свободную память всей системы (как раз «думая» что он один во всей системе) — и это неправильно.
ОС как раз точно знает, какие страницы использовались в последнее время.
Но она не знает когда они понадобятся в следующий раз, и как быстро.
Вообще управление подкачкой в любой ОС очень сферическое в вакууме — несмотря на то что «в среднем» оно делает полезное дело, оно не учитывает (и не может) ряд частных случаев, браузер и его вкладки является одним из них.
И в чем отличие от гибернации? Что будет держать вашу любимую вкладку в памяти при гибернации?
Вероятно, то, что приложению можно явно сказать об этом? Как это реализовано в The Great Suspender, например (хотя и не идеально).
Ещё раз повторюсь — любое приложение лучше чем ОС знает свои потребности (и потребности пользователя), соответственно, лучше справится с управлением выгрузкой. Но посколько ОС средств такого управления не предоставляет (и не гарантирует), то остается только делать всё внутри. Вот если ОС даст возможность приложению сказать «выгрузить эту область памяти» и «загрузить эту и сказать когда готово» — можно будет полноценно это использовать.
И снова — гибернация в приложении позволяет сохранить состояние независимо от ОС, и продолжить в нужный момент (после рестарта или обновления) — Session Buddy является моделью этого (хотя и не посредством гибернации, к сожалению).
Я рад, что вам не приходилось писать приложения больше 100к строк кода.
Одному — не приходилось, в команде — было дело. И можете не верить, но каждый из девелоперов знал (пусть и не в деталях) о взаимодействии модулей, их целях и задачах. При наличии хорошо продуманной архитектуры и наличии соглашений это не так сложно (впрочем, при их отсутствии у вас будет масса других проблем).
Я уже говорил, что в виндусе дисковые операции активно вытесняют память приложений в своп.
До этого вы говорили про «нехватку памяти». Так или иначе, это ещё одна причина по которой своп стоит выключить (при наличии достаточного количества RAM) — что бы ОС не делала то что она «считает» нужным, хотя это не всегда так.
Им уже дан сверху этот механизм, который как-то работает и им нужно в этих условиях что-то сделать полезное.
Им не дан этот механизм — я уже сказал выше почему — ни одна из популярных десктопных ОС не гарантирует наличия файла подкачки, и не дает средств контроля над ним. Расчитывать на то что может быть включено, а может быть нет — это как минимум глупо. Требовать включения — ещё глупее, всё равно что требовать наличия SSD вместо абстрактного диска (который может быть в RAM или сетевым и в 100500 раз лучше/быстрее).
Ваш прекрасный выдуманный мир, где вы собственноручно решаете какой процесс нужно выгрузить, я рассматривать не хочу.
Этот «выдуманный мир» реализован (пусть и не в полной мере) в Vivaldi, например, и также доступен для всех кто использует The Great Suspender (который, кстати, использует встроенные механизмы Chrome) — а это говорит о том что фича нужная. Есть и другие разработки в этом направлении, что тоже говорит о востребованности «выдуманного» мира.
Не могу пояснить, не понимаю, что вы спросили.
В результате фоновые вкладки скорее всего и так уже уйдут в своп после первой фоновой проверки антивируса или ежедневной индексации диска.
Вы говорите, что дисковая активность одних процессов приводит к вытеснению в подкачку памяти других процессов?
Да, приводит, потому что есть такая штука как дисктовый кеш в оперативной памяти. Даже при достаточной сильной загруженности памяти, ОС все равно старается держать его в районе 20%. Например сейчас у меня на маке он 1,3 Гб из 8, хотя запущено много чего и свободной памяти явно нет. А на винде он сейчас вообще 4,5 Гб из 8, потому что не особо много что запущено.
И вот винда имеет свойство иногда решить (если процессами давно никто не пользуется), что приложения можно бы уже скинуть в своп, а освободившее место занять дисковым кешем.
Или если чуть сложнее и поподробнее: панель управления — администрирование — системный монитор — добавить показатель (плюсик) — раздел память. И там разные показатели работы кэша имеются за которыми можно последить в динамике.
Модель браузера предполагает, что несколько табов могут жить под крышей одного процесса. Решение с файлами подкачки хорошее, если 1 таб гарантировано равно один процесс. Но это не так.
Еще я вижу потенциал этой технологии в восстановлении табов после перезагрузки, например.
Вопрос, возможно, не по адресу, но вы наверняка изучали и знаете: разве у Chrome под Android уже не используется подобная технология? Если я правильно помню, он демонстрирует очень уж характерное поведение: когда переходишь на давно не использованную вкладку — она долго восстанавливается, причём успешно восстанавливается даже при отсутствии сети (в метро между станциями) и вместе с текстом, введённым в поле ввода.
А вы уже проводили сравнительное тестирование быстродействия восстановления из hibernate и из mhtml? (кажется очевидным, что объём данных для hibernate заметно больше — но, может, восстановление из них менее ресурсоёмко? Или получается только размен скорости и места на качество восстановления?)
Теперь более-менее понятно с какими сложностями связана реализация этой идеи.
А вот кажется если открыть Мозилу (в довесок к тому Хрому), то хотя бы в ней вкладка открывалась без проблем.
А что с этой технологией для MacOS
А имеет ли это смысл именно на жестких дисках или каких-нибудь галимых еММС? Подозреваю, что половина ваших виндопользователей сидят на каких-нибудь ноутбуках, где стоит какой-нибудь фрагментированный HDD на 5400 оборотах с энергосберегающими костылями. И им будет все равно, из-за чего все лагает: из-за кошмарных затыках в I/O или перегрузки из сети с нуля.
а почему? посчитали излишним костылить еще один планировщик задач + оом-киллер + реализацию подкачки поверх тех, что уже есть в ОС (в 4х ос)?
это не совсем сарказм. выше уже предлагали иные решения, более правильные так же и по-моему мнению. в общем действительно интересно что же по этому поводу подумали в гугле…
На каждую вкладку? Надо тогда попробовать.
Оно будет отдельным плагином, чтобы в чистый хром/хромиум поставить?
И сразу предложение — приготовили сохранить вкладку — сожмите __перед__ записью на диск, потом читать будет гораздо быстрее и места надо меньше. Ну и с оптимизацией структуры файла именно на быстрое восстановление.
Скрин диспетчера
Процессы Хрома тратят 683 МБ оперативки (частный р/н).
Да на таком объеме юзать XP с антивирусом можно было 5 лет назад.
Угу, а если использовать везде short вместо int, то ещё в два раза сэкономить можно память?
А текст и изображения в случае браузера — это тот контент, который скачан с сети (и альтернативные его представления, вроде DOM) — и, казалось бы, для Chrome именно они должны занимать основной объём памяти.
P.S. Ещё есть мало влияющая на потребление памяти, но сильно удивляющая меня вещь: почему-то что в Windows, что в MacOS, что в JavaScript-движках представление текста — 16-битовый Unicode (UCS-2 или UTF-16). Казалось бы, использование UTF-8 и место экономит (для ASCII-строк), и делает ненужным разделение API на char и wchar, да и символ всё равно в 16 бит уже не влазит — но нет, упорно держатся за этот странный формат…
Ну то есть договориться, что юникодный текст представляется, как UTF-8, и избежать лишних перекодировок (ну а перекодировку текста в последовательность codepoints всё равно делать надо, что для UTF-8, что для UTF-16).
Но исторически сложилось, что всё идёт через API для 16-битного юникода…
Каждый день нам приходят жалобы, что такой-то сайт занимает очень много памяти.
Да, в большенстве случаев это происходит из-за каких-то проблем на сайте.
Вот я сейчас открыл сайт мегаплана и у меня он занимает 136мб:
Как видно, на сайте есть и видео с ютуба и много JS и прилично картинок.
Но и сами браузеры имеют большой потенциал для оптимизаций, над чем мы и работаем!
PS. Скоро мы расскажем об одной интересной проблеме с GC V8 и как мы смогли ее решить.
Это внутренний профилировщик самого браузера. Вот тут подробнее
И есть ли способ ускорить браузер, принудительно отдав ему еще ресурсов?
И тогда и статья не превратится в тыкву, и данные из форм не потеряются, и вкладки будут быстрее переключаться
по умолчанию морозит все, есть белый список. работает очень адекватно, запоминает все введенную инфу, место где читал…
технология Hibernate станет доступна всем пользователям Яндекс
… а в каталоге расширений Chrome уже давно доступно расширение The Great Suspender
Пользуюсь обычным Google Chrome и не могу избавиться от проблемы с тем, что своп (Commit size) процесса «Browser» бесконтрольно растёт. В результате на 32-битной ОС браузер со временем крэшится, на 64-бит — начинает жутко тормозить.
Не отслеживал точно, но началось это, по-моему, с «сорок-какой-то» версии. Разные расширения для экономии памяти ставил, они работают, но не оказывают никакого влияния на процесс «Браузер». Помогает только перезапуск.
Вместо тысячи слов, привожу скриншот в состоянии, когда все вкладки засаспенжены с помощью Great Suspender:
P.S.
Не подумайте, что я просто так хочу потянуть время разработчиков браузера или хабравчан, дополнительная проблема в том, что решение не получается загуглить из-за названия процесса. По запросам в духе «google chrome reduce swap size browser process», разумеется, выпадают решения для всего браузера (в основном, те же расширения).
Я бы для начала попробовал с помощью memory-infra посмотреть, чтобы примерно понять откуда ноги растут. Это вполне может быть какая-то утечка. Если повторяется более менее стабильно, то стоит отправить багрепорт с примерными шагами
Вадим, вам случаем не приходилось решать проблему с определением соответствия между процессами и вкладками браузера «снаружи» браузера?
I just hope that it will be implanted in English version as well at the same time as the Russian unlike some other features who are still not implanted in the beta yet. while available to Russian since few months ago…
I admire the hard work you guys are doing and I find yandex browser the best in many aspects… just please work a little bit more on the international version or allow us to help somehow by doing the translation or setting the configuration ourselves by modifying the json config files without breaking the signatures and falling back to default russian mode… most of the features still point to yandex.ru instead of yandex.com unfortunately and it takes no time to fix this but it's been months that I am waiting.
Как сэкономить память на вкладках браузера, но не потерять их содержимое. Опыт команды Яндекс.Браузера