LINUX.ORG.RU

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

 , , ,


0

2

Фокс конкретно достал своим прожорством. Шестнадцать гигов, а я постоянно вижу как всё свапится из-за этого гада. (и не гыкайте мне тут, все браузеры ведут себя одинаково) Ладно бы я что-то сложное делал. Но он явно не отпускает страницы из памяти, хотя уже и выставил кучу всяких уловок. Но вот что мне не давало покоя - этот гад видит сколько в компе памяти и не собирается останавливаться пока не выжрет всё. В результате все программы должны по стеночкам обходить. А тут вы со своими спорами про 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. Хоть и можно было без него, но раз уж он есть, то пусть хоть что-то делает для меня полезное.



Последнее исправление: CrX (всего исправлений: 3)

И тут я понял, что он смотрит куда-то в meminfo насчёт доступного рама

Ааа, я так и подозревал! После того как установил 16гб вместо 8гб - фф стал жрать больше памяти, при этом не улучшив никак свою работу.

Подозреваю, ты мог бы и без лимита памяти просто /proc/meminfo ему подменить. Сейчас попробую подменялку сделать без системдшных штук и посмотрю что выйдет.

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

Добавлю почему я делал именно через cgroups - чтобы не менять лайнчера и не делать всякую хрень каждый раз когда запустил фокс. Особенно с учётом того, что при запуске компьютера восстанавливаются окна приложений, и восстаналиваются они по имении в /usr/bin/, а не твоих кастомных лайнчеров. А поскольку все окна Фокса являются одним головным приложением, то мешанина увеличится, если мы будем экспортировать переменные в лайнчере.

Надеюсь понятно написал.

PcheloBiaka
() автор топика

Да в принципе, это всё и через about:config в самом firefox можно обуздать, через параметры вроде browser.cache.memory.capacity и подобые, которые при дефолте (-1 обычно, хотя иногда может быть что-то вроде 10 — в процентах от количества RAM в системе) зависят об количества RAM в системе. Их можно установить в конкретные желаемые значения (в байтах, иногда в процентах).

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

хм… Странно. По идее должно. Но справедливости ради, я никогда не пробовал играться с ними в сторону уменьшения. Обычно наоборот — в сторону увеличения.

Ну а так вообще по идее это и без systemd можно сделать, через cgroups v2.

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

Не совсем. Я использую сэндбоксинг с помощью bwrap.

upd: а, ты меешь в виду контейнеры внутри самого firefox? Да, я использую, но в основном чисто чтоб куки разные были. Они по-моему, только для этого и годятся.

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

Ой, я думал про bwrap, но там какое-то слишком всё. Я даже с помощью ИИ не понял :)) А если я это не понимаю, то и контролировать не смогу. Ограничения же я сам придумал, сам разобрался. И значит пойму что дальше делать. А дальше надо сделать всё более менее по уму. Надо в /tmp вывесить такой ложный meminfo и зеркалировать в него реальные значения если памяти реально осталось меньше, чем я выставил. Тогда это будет лучше и правильнее. Только надо найти такую висюльку, которая это будет делать без накладных расходов.

PcheloBiaka
() автор топика

Оригинальный подход, однако.

Будет время поиграюсь с конфигом firejail. Там тоже можно файлы системы подменять. :)

Только я бы в фейковом meminfo SwapTotal в 0 выставил. Нехер фаерфоксу в свап лазать.

Дожили - браузеру приходится фейковый /proc/meminfo подсовывать, чтобы он просто, жёваный крот, работал нормально, а не выжирал всю память. :) И после этого всякие дебилы будут рассказывать сказки про то, как никаких заговоров не существует. Подонки.

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

Хм, файрфокс не делает ни open() ни openat() на путь /proc/meminfo, по крайней мере в начале своей работы. Может быть он его делает потом или открывает сначала proc а потом из него уже файл. При этом куча других открываний файлов в том числе из /proc/ перехватывается успешно.

Или он делает ему openat2() или ещё что-то? fopen() вроде должно на open() само заворачиваться.

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

Хм. А у меня блогодааать… уже несколько часов не поднималось выше 2 гигов, и вообще держится в районе 1.7-1.8. Хотя даже это какой-то зашквар, конечно.

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

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

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

Ну тогда наливай чай, рассказывай :)

Да что там особо рассказывать? Для ограничения памяти я его не юзал (как сразу и сказал). В основном, главные аргументы это --bind и --ro-bind соответственно. С их помощью можно забиндить в песочницу нужные файлы или каталоги (можно сразу весь корень, если пофиг, а можно прям выборочно только нужное). Особенно полезно забиндить $HOME на что-то другое (специальный каталог, который является хомяком именно только для этого сэндбокса) — по-моему, это прям самое нужное. Ну и caps’ы всякие, а также --unshare-net для отключения доступа к сети. Это простое, но при этом самое часто нужное. Ну а про более продвинутое в мане всё есть. Не знаю, там вроде всё понятно написано довольно.

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

С ограничениями домашнего каталога я когда-то игрался, да. Но потом подумал, что проблем больше чем пользы. Особенно семье было непонятно, почему из любой папки файл не закинуть? И я сдался. А фокс был ещё тот, старый, 3.6.чегото :)

А ограничение сети - чтоб локалку не сканировал? Вроде же это отключили в фоксе? Или нет?

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

Но потом подумал, что проблем больше чем пользы.

Кому как. По-моему, очень удобно для многих приложений: можно и несколько конфигов иметь там, где путь захардкожен и нельзя задать, и доступ к приватным данным (а это всё не от этого приложения) заркыть, и много чего такого. Даже банально узнать, куда срёт очередная проприетарная игра — в пустом хомяке очень удобно получается :)

Особенно семье было непонятно, почему из любой папки файл не закинуть?

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

А ограничение сети - чтоб локалку не сканировал?

Чтоб в интернет ничего не слало. Я ж не только для firefox юзаю, но и например для игр. А им точно (сингловым) в интернет ни к чему — только лишнее шпиёнство.

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

Особенно семье было непонятно, почему из любой папки файл не закинуть?

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

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

Не, там не xdg-open а как минимум патчить gtk придётся (он же диалог показывает?). Или может быть и сам фф. Как устроен драгдроп я не знаю, мне даже проверить его негде. Подозреваю тоже что-то тулкитовое.

xdg-open это когда ты скачал файл (из инета) и хочешь его запустить после этого из браузерного гуи.

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

Я подозревал что где-то такое уже есть. Хотя думал что скорее в смартфонах.

Но я не зря подписал это как «извращённая».

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

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

Технически, во флатпаке это реализовано путем монтирования выбранного файла во внутрь песочницы.

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

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

Так а что произойдет, когда вкладок открыто больше, чем стоит лимит? Скорей всего он выгрузит их в .cache(ахахах). А оно в 99% случаев на nvme. И будет елозить весь веб по накопителю

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

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

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

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

Ну а кому сейчас легко?

x22 ★★★
()