LINUX.ORG.RU

Ограничение по-умолчанию потребления ОЗУ браузером (аналог systemd-run -p MemoryHigh=bytes -p MemoryMax=bytes)

 , ,


3

4

Я хочу сделать по-умолчанию ограничение потребления памяти приложением (а именно браузером). Желательно с возможностью легко временно изменять ограничения, например, если я хочу однократно увеличить лимит доступной памяти браузеру до 4 Гб только для одной сессии.

Сейчас я пользуюсь systemd-run:

systemd-run --user --no-block -p MemoryHigh=2G -p MemoryMax=3G firefox -P default

Выдержка из man:

MemoryHigh=bytes

Specify the high limit on memory usage of the executed processes in this unit. Memory usage may go above the limit if unavoidable, but the processes are heavily slowed down and memory is taken away aggressively in such cases. This is the main mechanism to control memory usage of a unit.

MemoryMax=bytes

Specify the absolute limit on memory usage of the executed processes in this unit. If memory usage cannot be contained under the limit, out-of-memory killer is invoked inside the unit. It is recommended to use MemoryHigh= as the main control mechanism and use MemoryMax= as the last line of defense.

Хочется сделать так, чтобы эти ограничения применялись к любому запущенному firefox, не важно, из консоли, через GUI или через xdg-open. И чтобы ограничения были и для самого приложения, и для всех его порождённых тредов и процессов.

В systemd-run это сделано с помощью unified control group hierarchy.

man cgroups && man cgconfig.conf ... memory.limit_in_bytes

anonymous
()

Сейчас я пользуюсь systemd-run

Всё делаешь правильно. Только проверь, что у тебя в системе включены эти самые cgroups v2 (systemd.unified_group_hierarchy в cmdline) и что для всех юнитов включен memory accounting (DefaultMemoryAccounting=true в /etc/systemd/system.conf).

Хочется сделать так, чтобы эти ограничения применялись к любому запущенному firefox

Напиши обёртку (exec systemd-run ...) и положи в /usr/local/bin (или в любой другой каталог из $PATH, который стоит раньше каталога с настоящим бинарником).

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

Обёртка не всегда работает. Например, xdg-open и использует /usr/share/applications/firefox.desktop, в котором абсолютный путь к бинарнику.

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

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

абсолютный путь к бинарнику

Гм.

Тогда напиши хук к ПМ, который будет перемещать /usr/bin/firefox в /usr/bin/firefox.real, а в /usr/bin/firefox положи обёртку.

Но это больший костыль, конечно.

intelfx ★★★★★
()
11 августа 2019 г.
Ответ на: комментарий от intelfx

Только проверь, что у тебя в системе включены эти самые cgroups v2

Это не обязательно. Для systemd-run достаточно cgroupo_v1.

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

. Для systemd-run достаточноcgroupo_v1

И тут такая каждая вкладка в отдельном процессе

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

Сейчас я пользуюсь systemd-run

Всё делаешь правильно.

systemd-bash с systemd-cp, systemd-mv и systemd-emacs когда ждать?

anonymous
()
Ответ на: комментарий от hakavlad

Это не обязательно. Для systemd-run достаточно cgroupo_v1.

В cgroups v1 пользовательским экземплярам systemd не делегируется управление ресурсами.

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

systemd-bash с systemd-cp, systemd-mv и systemd-emacs когда ждать?

Уже давно:

$ grep intelfx /etc/passwd
intelfx:x:1000:1000::/home/intelfx:/usr/lib/systemd/systemd-bash

$ type -t cp
builtin

$ type -t mv
builtin

$ ls -la $(type -p emacs)
lrwxrwxrwx 1 root root 4 авг 10 12:13 /usr/bin/emacs -> ../lib/systemd/systemd-emacs

$ $SHELL --version
systemd 243 (243.rc1.61-1-arch)
+PAM +AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 +SHELL +COREUTILS +EMACS default-hierarchy=hybrid
intelfx ★★★★★
()
Ответ на: комментарий от Pravorskyi

Обёртка не всегда работает. Например, xdg-open и использует /usr/share/applications/firefox.desktop, в котором абсолютный путь к бинарнику.

Сделай ~/.local/applications/firefox.desktop в котором пропиши путь до обертки

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

В который раз убеждаюсь что systemd для неосиляторов. Уже сколько лет это можно делать через cgroups.

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

Уже сколько лет это не делается из коробки, хотя необходимо для подкостыливание вешающегося линуксовго ядра.

Нафиг таких «осилияторов», независимо от systemd.

anonymous
()
Ответ на: комментарий от Deleted

По дефолту, убивается oom-killer'ом.

When the OOM killer is disabled, tasks that attempt to use more memory than they are allowed are paused until additional memory is freed.

Но правильный подход с systemd - написать сервис, который будет убиваться oom-killer'ом и автоматически перезапускаться постоянно. 😂

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

При превышении лимита systemd же просто убьёт браузер?

Да, убьет процесс с наибольшим oom_score в пределах проблемной сигруппы, запись появится в ядерном логе.

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

systemd ведь тоже это делает через cgroups.

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

Юзкейс уже описывал: однократно запустить браузер с отключёнными лимитами по памяти; однократно запустить браузер с увеличенным лимитом памяти. Следующий запуск должен быть с дефолтными лимитами.

Статически можно описать лимиты в конфигурационных файлах cgroups v2 без использования systemd-run. А динамически чем менять лимиты?

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

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

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

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

Какого именно лимита? Перечитай тему, там есть выдержка про MemoryHigh и MemoryMax. Убивает только при превышении MemoryMax.

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

проверь, что у тебя в системе включены эти самые cgroups v2

Всё включил, но оганичения от --user не работают.

Так systemd-run --uid=1000 --gid=1000 -p MemoryMax=1G tail /dev/zero только работают, с запросом пароля.

hakavlad ★★★
()
Ответ на: комментарий от hakavlad
$ cat /proc/cmdline     
<...> systemd.unified_cgroup_hierarchy=1 <...>

$ cat /etc/systemd/system.conf | grep -vE '^(#|$)'
[Manager]
RuntimeWatchdogSec=1min
ShutdownWatchdogSec=1min
DefaultCPUAccounting=yes
DefaultIOAccounting=yes
DefaultIPAccounting=yes
DefaultBlockIOAccounting=yes
DefaultMemoryAccounting=yes
DefaultTasksAccounting=yes

$ cat /etc/systemd/user.conf | grep -vE '^(#|$)'
[Manager]

$ systemctl --version
systemd 242 (242.84-1-arch)
+PAM +AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid

$ systemd-run --user -p MemoryMax=1G -p MemorySwapMax=0 tail /dev/zero                       
Running as unit: run-rc01c7cf3d4f045adb1c55e39df2813b9.service

$ journalctl -f --user-unit run-rc01c7cf3d4f045adb1c55e39df2813b9.service 
-- Logs begin at Mon 2019-08-19 12:57:59 MSK. --
авг 22 23:51:22 stratofortress systemd[1109]: Started /usr/bin/tail /dev/zero.
авг 22 23:51:22 stratofortress systemd[1109]: run-rc01c7cf3d4f045adb1c55e39df2813b9.service: Main process exited, code=killed, status=9/KILL
авг 22 23:51:22 stratofortress systemd[1109]: run-rc01c7cf3d4f045adb1c55e39df2813b9.service: Failed with result 'signal'.
авг 22 23:51:22 stratofortress systemd[1109]: run-rc01c7cf3d4f045adb1c55e39df2813b9.service: Consumed 502ms CPU time.
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

$ systemd-run --user -p MemoryMax=1G -p MemorySwapMax=0 tail /dev/zero

Это работает на Ubuntu 19.04 (systemd 240, Linux 5.0), но не работает на моем Debian 9 (systemd 232, Linux 4.9). Возможно дело в старом ядре.

hakavlad ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.