LINUX.ORG.RU

Похоже я нащупал как обуздать Firefox и скармливать ему чуть-чуть памяти

 , , ,


1

3

Фокс конкретно достал своим прожорством. Шестнадцать гигов, а я постоянно вижу как всё свапится из-за этого гада. (и не гыкайте мне тут, все браузеры ведут себя одинаково) Ладно бы я что-то сложное делал. Но он явно не отпускает страницы из памяти, хотя уже и выставил кучу всяких уловок. Но вот что мне не давало покоя - этот гад видит сколько в компе памяти и не собирается останавливаться пока не выжрет всё. В результате все программы должны по стеночкам обходить. А тут вы со своими спорами про systemd. И придумал я гадкое, засунул фокса в персональную группу с ограничениями. Сделал так: Создал директорию ~/.config/systemd/user/app-firefox@.service.d/ В ней файл override.conf со следующим содержимым

[Service]
MemoryHigh=1.5G
MemoryMax=4G
MemorySwapMax=0

Перезапустил всё и стало хорошо на душе, фокс стоит на полтора гигах, как вкопанный. Но только включил ютуб, переключился на другое окно с другой вкладкой в другом фоксовском контейнере и всё дико тормозить стало. Я поднял до 2.5G, стало полегче, но всё равно, дойдёт до черты и тормоза лютые сразу. И тут я понял, что он смотрит куда-то в meminfo насчёт доступного рама, но не видит ограничений системды. И поэтому сходу влетает в ограничение, полагая, что все 16 гигов его. Тогда я создал фейковый ~/.fake_meminfo в домашней папке где заменил MemTotal: 4194304 kB и произошло чудо. Всё стало вполне сносно. Но вдруг внезапно он стал падать после нескольких видео на ютубе. Видимо недостаточно я ему наврал. Тога я попросил у ИИ сгенерить meminfo чтобы было похоже, что мы подходим к границе доступной памяти. Вот такой файл ~/.fake_meminfo в итогу получился

MemTotal:        4194304 kB
MemFree:          350000 kB
MemAvailable:     512000 kB
Buffers:           50000 kB
Cached:           600000 kB
SwapCached:            0 kB
Active:          2500000 kB
Inactive:         800000 kB
Active(anon):    2000000 kB
Inactive(anon):     4000 kB
Active(file):     500000 kB
Inactive(file):   800000 kB
SwapTotal:      15580020 kB
SwapFree:       15580020 kB
Dirty:              1000 kB
Writeback:             0 kB
AnonPages:       2000000 kB
Mapped:           400000 kB
Shmem:            150000 kB
Slab:             300000 kB
CommitLimit:    22656768 kB
Committed_AS:   15171448 kB
DirectMap4k:      800000 kB
DirectMap2M:     3000000 kB

а файл override.conf стал таким

[Service]
MemoryHigh=2.5G
MemoryMax=4G
MemorySwapMax=0

# "Обман" - подмена файла для Firefox
BindReadOnlyPaths=/home/pchelobiaka/.fake_meminfo:/proc/meminfo

И… иии… вроде работает. Полноценный Фокс с контейнерами, по собственной воле держит около 2 гигов и не больше.

Спешу поделиться наблюдением. Пробуйте кому интересно. И может что дельное подскажете.

Впервые в жизни придумал как использовать systemd. Хоть и можно было без него, но раз уж он есть, то пусть хоть что-то делает для меня полезное.

Upd.: Важное дополнение. При рассчёте занимаемой памяти я беру не просто размер процесса firefox, но суммы всех процессов фокса вместе взятых. Как оказалось люди не поняли сразу и пфыкают :)



Последнее исправление: PcheloBiaka (всего исправлений: 4)
Ответ на: комментарий от cobold

Но вывод free покажи.

И кстати ещё тест (проводить сейчас я его не предлагаю, но иногда, при случае, можно воспользоваться): если сделать файрфоксу kill -9, можно увидеть ступеньку общесистемного потребления памяти, по-моему это самый надёжный способ оценки.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от cobold

Фокс плодит процессы и тут вопрос что показывает, размер процесса firefox, или всей этой банды?

В дкешном мониторе появилась возможность смотреть «Приложения» или смотреть «процессы». Процессы все собирать надо по кусочкам, а приложениями он сам всё собирает. И вот именно в этом, общем размере у меня теперь фокс помещается в два гига. На все процессы вместе.

PcheloBiaka
() автор топика
Последнее исправление: PcheloBiaka (всего исправлений: 1)

Так а ради чего ограничивать доступ к ОЗУ, если свободная память есть? Она не для этого что ли установлена? ОЗУ что, портится от использования? Система всеми силами старается приспособить хоть подо что-то свободную проставивающую память, а Вы типа: «нееееет, не сейчас, не трогай, оставь это на Новый Год!»

PeleWin
()
Ответ на: комментарий от PcheloBiaka

Да, оказалось это 1 процесс. По дефолту гномий монитор показывает process name, а не command. А ff своих детишек переименовывает, поэтому отсортировав процессы по имени я их принял за что-то другое. В итоге при выходе из фф освободилось 7 гб

cobold ★★★★★
()
Ответ на: комментарий от PeleWin

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

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

firkax ★★★★★
()
Ответ на: комментарий от PcheloBiaka

Там же внизу комментарий как запускать. Да, надо менять «лаунчер».

[FAKEFILE_VERBOSE=1] MEMINFO=/path/to/fake/meminfo.txt LD_PRELOAD=/path/to/fake-meminfo.so exec /usr/bin/firefox-esr "$@"

при старте фокса сообщает ему ложную информацию?

При старте - недостаточно, он каждые сколько-то секунд meminfo проверяет.

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

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от PcheloBiaka

У меня открыто много вкладок (наверное под две сотни).
Но они все в основном не загружены (после принудительного завершения FF их перезагружает из WWW только при просмотре вкладки).

И всё в контейнерах. Хотя вижу, что ютуб везде видит мой аккаунт, значит контейнеры эти дырявые.

И у меня всё в основном все в контейнерах. Дырявости не замечал. (может у тебя какой-то автологин в youtube, по паролю запомненому FF или каким ещё плагином)

Явных утечек не замечаю. Память растет примерно пропорционально количеству подгруженных вкладок и тяжести контента.
Когда память заканчивается (вкладки я нечасто закрываю), то перезапускаю FF, чтобы все вкладки перешли в неподгруженныое состояние.
Правда youtube я почти не смотрю..

MirandaUser2 ★★
()
Ответ на: комментарий от firkax

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

PcheloBiaka
() автор топика
Ответ на: комментарий от PcheloBiaka

Он каждый раз заново его открывает. Если бы открыл один раз и потом читал из открытого - да, подменить надо было бы один раз.

Тут наверно про разные подмены речь. Если подмену делать через bind-mount (mount --bind /fake/meminfo /proc/meminfo) то да, сделанное разово, оно дальше «перехватывает» все обращения само на уровне ядра. Но для mount нужны повышенные права (и systemd у тебя ими и пользуется чтобы его сделать), а я хотел обойтись без них. Я перехватываю конкретный вызов функции fopen (man 3 fopen) файрфоксом, и если вижу что он хочет открыть /proc/meminfo - вызываю настоящий fopen с подменённым путём, а для остальных просто вызываю настоящий fopen. Файрфокс этот fopen вызывает заново каждый раз когда проверяет память.

firkax ★★★★★
()
Ответ на: комментарий от firkax

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

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Ну… Наверное это имеет смысл. Но мне не нравится то, что запуск фокса становится зависимым от конкретного способа запуска. Вот ты читаешь письми, или описание в файле, там ссылка. Ткнул и фокс отрылся без этой подмены, так? (при условии что до этого он не был запущен правильно) А если я нажал лаунчер с твоей подменой один раз, он сделал всё правильно. А нажму второй раз, что произойдёт? Я не знаю что должно быть в таком случае. Не создастся какаянить коллизия?

PcheloBiaka
() автор топика
Ответ на: комментарий от firkax

У меня тоже так было пока не подменил полностью меминфо эмулировав пограничное состояние. Тепперь всю ночь проработало, ютуб во сне насиловал, но за память не вышло и фризов нет и активной чистки постоянной тоже. Моим способом. Но что там с твоим fopen? может именно с ним проблема?

PcheloBiaka
() автор топика
Ответ на: комментарий от PcheloBiaka

Ткнул и фокс отрылся без этой подмены, так? (при условии что до этого он не был запущен правильно)

Назови скрипт firefox и положи в $PATH с более высоким приоритетом (обычно юзерский ~/.local/bin, например), будет всегда запускаться с этой подменой.

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

Нет.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Ну тогда гут. Я же глупенькой :) Я вообще не понимаю в этих ваших канплюкторах :)) Накопал такое в моём извращённом мозгу, а дальше и сам не знаю как правильно. И конечно же, в целом так делать неправильно, но правильного выхода не вижу.

PcheloBiaka
() автор топика
Ответ на: комментарий от PcheloBiaka

Ткнул и фокс отрылся без этой подмены, так?

Ну тут есть несколько соображений.

1) лично я такое не использую (для обычных ссылок), у меня файрфоксов открыто несколько штук с разными профилями, и открывать ссылки в не пойми как выбранном из них я всё равно не захочу - сам выбираю нужное окно и вставляю в него, да и «фокс открылся» обычно случается в начале работы компа после ребута, а не при желании открыть ссылку

2) проги для открывания ссылок где-то прописаны, их там можно при желании отредактировать (я например сделал себе ассоциацию к протоколу «video+http://» чтобы на такие ссылки открывался mplayer либо, если указаны отдельные субтитры, оно всё скачивалось wget-ом и открывалось в vlc).

3) подмену meminfo я сделал созданием скрипта ~/bin/firefox-esr, а ~/bin/ давно добавлено в $PATH первым пунктом, то есть все вызовы firefox-esr без указанного пути автоматом редиректятся на подменный скрипт, возможно и автооткрытие ссылок тоже (но я не проверял и я не знаю указан ли там путь и вообще что там указано)

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от PcheloBiaka

Как только они узнают

они тут же

это противоречит их цели

Цитируешь «Протоколы файрфокских мудрецов» – поставь ссылку на первоисточник.

frob ★★★★★
()
Последнее исправление: frob (всего исправлений: 1)
Ответ на: комментарий от firkax

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

Ну так-то он всегда в память складывал всё. А так начинает подрабатывать менеджером памяти и диска. Постоянно что-то на диск складывает, потом это берет и в память перекладывает

bryak ★★★★
()
Ответ на: комментарий от frob

Хм. Фоксовцы неоднократно отказывались ввести нормальную внятную настройку ограничения памяти.Для этого нет никаких преград. Но каждый раз они выкатывали ответ в стиле «это ограничит комфортную работу для многих пользователей» или что-то в этом роде, дословно не помню. И искать пруфы нет никакого желания. А с чего такой интерес к такому незначительному саркастическому комментарию? Ты один из мудрецов? :)) Вот и отнеси им глас народа :)))

PcheloBiaka
() автор топика
Ответ на: комментарий от PcheloBiaka

да, кстати, я дисковый кэш отключал в about:config.

Я выше задавал вопрос: что делает фф, когда ты выставил лимит 2Гб, а вкладок открыто больше 2Гб. Что происходит? Наверно он куда-то это всё складывает на диск и при переключении вкладок начинает оверлимитные вкладки брать с накопителя и в память перемещать, а вкладки, которые были в памяти - скидывает на диск

Ты бы промониторил обращение к диску в своем лимитированном фф и нам рассказал, что там в потрохах происходит :)

bryak ★★★★
()
Последнее исправление: bryak (всего исправлений: 2)
Ответ на: комментарий от firkax

Складывание на диск будет грузить не проц, а диск. А у меня грузится проц.

Ну так у менеджмента цена, видимо, не нулевая. А так лень думать, от чего оно там в потрохах так себя начало вести

bryak ★★★★
()
Последнее исправление: bryak (всего исправлений: 2)
Ответ на: комментарий от bryak

Всё просто работает :) А я тем временем занимаюсь агентом, в который раз переписываю с нуля. Лень думать и смотреть. Я уверен, что диск не трогает и не гадит туда, иначе я заметил бы. Кстати, он постоянно свапил. А теперь нет. Тормозов нет вообще. Мой компьютер опять мой (ну, пока агента не доделаю). :)

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

PcheloBiaka
() автор топика
Ответ на: комментарий от PcheloBiaka

Всё просто работает :) А я тем временем занимаюсь агентом, в который раз переписываю с нуля. Лень думать и смотреть. Я уверен, что диск не трогает и не гадит туда, иначе я заметил бы. Кстати, он постоянно свапил. А теперь нет. Тормозов нет вообще. Мой компьютер опять мой (ну, пока агента не доделаю). :)

Ну ты логику включи. Если потреблять больше 2Гб он не может, а вкладок открыто на 5Гб. Куда-то он же складывает эти оверлимитные 3Гб. ВЕДЬ СКЛАДЫВАЕТ ЖЕ, ВЕРНО?

bryak ★★★★
()
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от bryak

5гб вкладок это что? Ты туда iso ему какое-то в js-переменных сохранил что ли? Сами по себе страницы не могут много тратить.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Вопрос про 5Гб - это вопрос про поведение при оверлимите прежде всего, а не про цифры

А так-то, если не иметь привычки закрывать вкладки, то через через неделю использования firefox при открытии и загрузке всех вкладок потребляет и 15 и 20Гб

bryak ★★★★
()
Ответ на: комментарий от bryak

Он столько потребляет не потому что вкладкам столько надо, а потому что там неадекватный жор памяти на мусор. Эта тема как раз показывает что на самом деле он и в 2гб влезет если ему сообщить что больше нет. Если хочешь проверить действительно когда расход памяти неизбежен - напиши какой-нить джаваскрипт который в своих переменных 4гб данных сохраняет.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Он столько потребляет не потому что вкладкам столько надо, а потому что там неадекватный жор памяти на мусор. Эта тема как раз показывает что на самом деле он и в 2гб влезет если ему сообщить что больше нет. Если хочешь проверить действительно когда расход памяти неизбежен - напиши какой-нить джаваскрипт который в своих переменных 4гб данных сохраняет.

Только хотел написать, про бла-бла-бла, я открыл 10 вкладок на фишках и потребление памяти сразу будет ~5Gb. Но только что открыл https://fishki.net/5022012-interesnye-fotografii-vremen-sssr--800.html и сохранил на диск. И внутри оказалось 11M. Т.е 10 вкладок с кучей фоток будут потреблять ~200-250Mb. Так-то так, исходя из этого набрать даже 2Гб вкладок - это надо очень сильно постараться. Чувствую, что браузеры участвуют в hardware заговоре, своим потреблением вынуждая юзеров закупать озушку вёдрами :)

PS: Так-то лимитирую себе фф своей чудесной командой на 5Гб и посмотрю, как оно всё работает

bryak ★★★★
()
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от bryak

Одно видео просмотренное на прошлой странице висит в памяти, одно видео из позапрошлой страницы висит в памяти и т.д., а фокс тебе рассказывает как тяжело они работали чтобы обвешать весь твой ОЗУ этими трупиками. Настройки чтобы выгружать из памяти ненужное выгружают активные страницы, а ютубовские трупики продолжают висеть. Фокс уже в свап лезет, выгружает половину активных окон, колом ставит систему, но… трупики бережно хранятся до конца. «ради вашего удобства» И самое смешное, что если ты нажмёшь кнопку «назад», тебе эту страницу опять будет грузить из интернета, а не расчехлять трупики.

PcheloBiaka
() автор топика
Ответ на: комментарий от PcheloBiaka

А вот и первые ласточки. Память заполнилась «более другими» программами и пришёл реальный лимит памяти о котором Фокс не мог знать из-за поддельного меминфо и он дико завис и пришлось пристрелить. Эх. А такая собачка была…

PcheloBiaka
() автор топика
Ответ на: комментарий от PcheloBiaka

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

bryak ★★★★
()
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от PcheloBiaka

У меня тоже легко и непринужденно вкладки разрастаются до количества 50+. При этом в каждой вкладке что-то такое, что жалко закрывать :). Если держать только нужное, то фф не разрастается до неприличных размеров. Но это могут не только лишь все, мало кто может это делать

bryak ★★★★
()
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от bryak

При этом в каждой вкладке что-то такое, что жалко закрывать :)

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

James_Holden ★★★★★
()
Ответ на: комментарий от James_Holden

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

Глобально и по-феншую да, но в реалиях мозг сопративляется :)

bryak ★★★★
()
Ответ на: комментарий от firkax

Сами по себе страницы не могут много тратить.

Разумеется. Любой, даже самой навороченной странице более чем достаточно нескольких мегабайт.

Но вот браузер, во-первых, рендерит страницы крайне неэффективно, ка по объективным причинам, типа убогости HTML который нельзя рендерить кусочками, так и натурально с целью сожрать как можно больше доступной памяти, во-вторых всеми силами стремится хранить всё поюзанное в памяти, и только в крайних случаях скидывает это в ~/.cache/mozilla. Чтобы типа «вдруг юзер снова захочет посмотреть PDF который он только что моспотрел и понял что он ему не нужен». Не удаляются из памяти и элементы бесконечных скроллов, даже если вебмакака попыталась сделать удаление элементов которые типа скрылись из вида. При этом самое смешное, что жабоскрипт один хер будет подгружать изображения заново при скролле назад, уже по другим URL, которые нынче рандомизированы с целью защиты от скрапинга, но браузер всё равно хранит это всё дерьмо в памяти. А вдруг юзер захочет обратно промотать бесконечный скролл. И нет, эта сожранная память нифига не отображается во всяких about:memory, потому что типа она же не прям насовсем занята процессом обслуживающем страницу, а так, почти свободна же, да и если юзер откроет видосик, то можно будет просто ещё памяти у системы отожрать, там же есть ещё, зачем освобождать то что занято мусором, который чисто теоретически может быть понадобится.

Ну и так далее. Браузеры нынче это лютый звездец фундаментально. Начиная с самого HTML который надо рендерить исключительно целиком, загружая все картинки и видосики, иначе невозможно будет определить положение и размеры элементов. И это принципиально не лечится без отказа от самого HTML. Про DOM и JS который этот DOM обычно перетрахивает я вообще молчу.

И вот вместо того, чтобы как-то решать проблемы с HTML и давать пинков конченным дебилам из W3C которые нынче вообще уже лютую дичь придумывают, браузеры писатели старательно делают и W3C, и производителям железа и прочей мерзоте типа гуглей глубокий минет.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)