LINUX.ORG.RU

Как ограничить потребление памяти+свопа для цгруппы?

 , ,


1

3

Нынче, как известно, много жирнософта, ведущего себя как куча котят возле миски с молоком. Спасибо камраду spijet, претворившему мои вскукареки в реальность, но firejail-песочница мне не нужна, равно как и пачка похожих скриптов для каждой программы, так что чуть перепилил его скрипт: убрал firejail, вынес приложение и ограничение памяти в аргументы запуска, а также расширил согласно шапкодокам сие поведение на своп. Ибо своп у меня в zram и его накопление тоже чревато. Получился такой скрипт:

#!/bin/sh

## Script params:
CGROUP="$1"
MEM_MB="$2"
PROGRAM="/usr/bin/$1"
shift 2

# First, create the cgroup:
sudo /usr/bin/cgcreate -a "${USER}:${USER}" -t "${USER}:${USER}" -g "memory,cpu:${CGROUP}"
# Now, set memory limit:
/usr/bin/cgset -r "memory.memsw.limit_in_bytes=$(( MEM_MB * 1024 * 1024 ))" "${CGROUP}"

# Finally, call the executable:
/usr/bin/cgexec -g "memory,cpu:${CGROUP}" "${PROGRAM}" $@
Но даже несмотря на memsw, приложения лезут жрать вместе со свопом больше памяти. Гляжу по колонке USED в top. ЧЯДНТ?



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

Вещь полезная, тоже была мысль наколхозить такое. Полезность ulimit стремится к нулю на локалхосте.

Только

своп у меня в zram

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

Нужно:
1) своп иметь, для начала
2) не ограничивать его использование

P.S. Обновился до новых дебианокед и теперь Menu не работает как Compose. Страдайте теперь вместе со мной от дефисов вместо тире.

aidaho ★★★★★
()

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

  • Для ограничения свопа используется отдельный контроллер (пока ещё не смотрел, как его включать для новых групп);
  • Swap-контроллер для контрольных групп включен не везде. Проверить можно так:
    ❯ zgrep MEMCG_SWAP /proc/config.gz 
    CONFIG_MEMCG_SWAP=y
    # CONFIG_MEMCG_SWAP_ENABLED is not set
    

    В моём примере сам контроллер собран в ядре и поддерживается, но по умолчанию отключен при загрузке (в документации к ядру говорится, что этот контроллер повышает накладные расходы на что-то там, отчего повышается потребление памяти). Чтобы его включить, нужно либо включить CONFIG_MEMCG_SWAP_ENABLED и пересобрать ядро, либо добавить swapaccount=1 в cmdline ядра.

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

свопа у тебя в таком случае нет, от слова вообще.

Таки неправда, zram — виртуальное блочное устройство в RAM, поэтому это как раз своп, т.к. страницы туда отгружаются, а по надобности распаковываются обратно. Конечно, это не труЪ-своп на HDD, но всё-таки своп.

2) не ограничивать его использование

Скажи это новому недоскайпу, который при ограничении памяти в 384 мегабайта сжирает полтора гигабайта swap.

P.S. Обновился до новых дебианокед и теперь Menu не работает как Compose. Страдайте теперь вместе со мной от дефисов вместо тире.

Дык это:

❯ localectl                                             
   System Locale: LANG=ru_RU.utf8
                  LC_COLLATE=C
       VC Keymap: us-acentos
      X11 Layout: us,ru
       X11 Model: pc105
     X11 Variant: ,
     X11 Options: grp:alt_shift_toggle,grp_led:caps,ctrl:nocaps,compose:ralt

Вместо compose:ralt пишешь в localectl или /etc/X11/Xorg.conf.d/* то, что тебе надо (в твоём случае, наверное, compose:menu) и радуешься жизни. :)

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

Таки неправда, zram — виртуальное блочное устройство в RAM, поэтому это как раз своп, т.к. страницы туда отгружаются, а по надобности распаковываются обратно. Конечно, это не труЪ-своп на HDD, но всё-таки своп.

Нет. Страницы как были в памяти, так и остались. Место они как занимают, так и занимали. И память продолжают фрагментировать, приближая ситуацию с невозможностью выделения куска с нужным размером.
zram - это промежуточный буфер, основное счастье от которого в том, что с i/o куда-либо у нас нынче сплошное разочарование.

Скажи это новому недоскайпу, который при ограничении памяти в 384 мегабайта сжирает полтора гигабайта swap.

Если у программы минимальные системные требования в 2Гб ОЗУ, то она их так или иначе сожрёт.
Если 70% занятой памяти процесса можно без последствий полностью выкинуть из памяти - это же счастье, надо брать пока дают.

Вообще тут или менять программу, или апгрейдить устаревший компьютер :)

Дык это:

Дык пофиг: плазмащель просто решила, что это теперь её кнопка, и она её доит.

aidaho@thinkpad:~$ setxkbmap us -query
rules:      evdev
model:      pc101
layout:     us
options:    grp:caps_toggle,grp_led:scroll,compose:menu-altgr

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

При использовании zram страница не просто копируется в zram-устройство, а по пути сжимается. Оригинальной страницы в RAM больше нет и софт её больше не может прочитать (пока ОС не достанет страницу из zram обратно).

Если 70% занятой памяти процесса можно без последствий полностью выкинуть из памяти - это же счастье, надо брать пока дают.

Если бы! Скайп при этом начинает тормозить так, будто на машине запущено три сервера Garry's Mod с 32 активными игроками в каждом. Ну и top показывает, что скайп начинает гонять страницы туда-сюда с огромной скоростью (только на гоняние страниц в своп и обратно «простаивающий» процесс скайпа тратит 26% user cpu).

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

Дык пофиг: плазмащель просто решила, что это теперь её кнопка, и она её доит.

ЕМНИП, в четвёртых кедах был отдельный раздел настройки расширенных опций клавиатуры, где можно было выбирпть Compose-клавишу и всё такое. В новой плазме такого нет?

Ну и в порядке бреда — попробуй руками задать опции xkb.

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

Оригинальной страницы в RAM больше нет

Ну а где же она? :)
В памяти ядра, родимая. Просто сжата.

Если бы! Скайп при этом начинает тормозить так, будто на машине запущено три сервера Garry's Mod с 32 активными игроками в каждом. Ну и top показывает, что скайп начинает гонять страницы туда-сюда с огромной скоростью (только на гоняние страниц в своп и обратно «простаивающий» процесс скайпа тратит 26% user cpu).

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

Кстати, в cgroups можно ставить лимиты индивидуально на каждый своп?

ЕМНИП, в четвёртых кедах был отдельный раздел настройки расширенных опций клавиатуры, где можно было выбирпть Compose-клавишу и всё такое. В новой плазме такого нет?

Таки есть. И там стояло Compose = 3rd-level Menu вместо просто Menu.
Переключил, заработало. Видимо старые настройки криво подхватились.

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

Нужно:
1) своп иметь, для начала

Не нужно. У меня ноутбучный винт на 5400 RPM, и без того нагруженный ntfs-3g и невыравненным системным разделом; с дисковым свопом при активном свопинге система запросто могла полностью встать раком, даже переключение на tty, чтобы убить обжору, отрабатывало минут 10. С zram же я получаю примерно в полтора раза больше рамы, чем установлено, без мучания диска.

Страдайте теперь вместе со мной от дефисов вместо тире

RCtrl.

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

Нет. Страницы как были в памяти, так и остались. Место они как занимают, так и занимали. И память продолжают фрагментировать, приближая ситуацию с невозможностью выделения куска с нужным размером.
zram - это промежуточный буфер, основное счастье от которого в том, что с i/o куда-либо у нас нынче сплошное разочарование.

Во-первых, zram — это не промежуточный буфер, т. к. перемещение страниц между swap devices в ядре не реализовано. (Возможно, ты путаешь zram и frontswap/zcache?)

Во-вторых, страницы, конечно, технически остаются в памяти, но из page cache они исчезают, поэтому с точки зрения учёта страниц своп в zram — это своп.

В-третьих, фрагментация памяти — щито? man virtual memory (если ты, конечно, не хочешь сказать про kmalloc).

Ну а где же она? :) В памяти ядра, родимая. Просто сжата.

Где угодно, но не «в памяти ядра» и не в page cache.

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

плазмащель просто решила, что это теперь её кнопка

В настройках хоткеев точно бинда не виднеется?

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

Во-первых, zram — это не промежуточный буфер, т. к. перемещение страниц между swap devices в ядре не реализовано. (Возможно, ты путаешь zram и frontswap/zcache?)

Буфер по определению — устройство сглаживания колебаний чего-то. То, что он не отдаёт дальше, это формальность.
Слово «промежуточный» тут было неуместно, согласен.

технически остаются в памяти

О чём и речь. Какие абстракции не натягивай на глобус реальности, а всё осталось в RAM.

Где угодно, но не «в памяти ядра» и не в page cache.

Внезапно, ты прав. Не вижу в slabtop ничего похожего.

ХЗ тогда как и где оно себе выделяет память.

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

минимальные системные требования

Маркетоидная шелуха для упрощения жизни разработчиков. Просто софт может засирать раму всякими кэшами, а может не засирать. Современные браузеры жрут память в зависимости от её наличия. В то время как на системах с двумя гигами рамы они сносно работают, пользователи с 16 ГБ жалуются, что браузер запросто может зохавать 3 ГБ памяти, а то и 5, и так далее.

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

технически остаются в памяти

О чём и речь. Какие абстракции не натягивай на глобус реальности, а всё осталось в RAM.

Мастер выборочного цитирования? Ты до конца дочитывай, не стесняйся.

Внезапно, ты прав.

Вот уж внезапно.

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

Мастер выборочного цитирования? Ты до конца дочитывай, не стесняйся.

С себя начни, писатель.

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

Хм. Вообще странно, у меня десктопный клиент Telegram столько жрал только в одном случае — когда я его пытался на арче собирать их исходников. Официальный билд больше 128 мегабайт ещё ни разу не съел.

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

не держу окно разговора всё время открытым

Оно и без этого течёт.

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