Многократно увеличиваем память

Преветствую всех!

Давно хотел выразить благодарность сообществу, но как у Джадда Вайнета у меня не получится, ибо в программной сфере я дуб-дубом. Ну хоть что-то полезное, хотя бы советом по оптимизации. И тут как раз подворачивается такой случай — глупо упускать :)

Преамбула

Начну с того, что я ярый противник подкачки. Мне винда несколько дисков поломала своей подкачкой, пока я не понял в чём дело, и не вырубил её ещё в винде. Переходя на Linux я само-собой намеренно не создавал раздел swap (и тем более, когда HDD заменил на SSD). В принципе, если в игры не играть и хромом не пользоваться, то моих 4GiB памяти (больше в материнку не вставить) вполне достаточно. Но иногда, например во время компиляции из AUR чего-то большого, возникают-таки проблемы из-за нехватки памяти.

Суть

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

Поиски

Мне нужна была дополнительная информация, за которой я полез на нашу arch-wiki. Но конкретно про модуль zram и его настройку ничего не нашёл. Зато в статье Maximizing Performance обнаружился пункт Compcache/Zram, который интересен не столько информацией про zram, сколько про утилиту zramswap. Статья на русский недопереведена, и этого пункта в русском варианте нет. Поэтому позволю себе вольный его перевод.

Zram (ранее называемый Compcache) — модуль ядра, который создаёт в оперативной памяти устройство и сжимает его. Если использовать его для подкачки, то часть оперативной памяти может хранить гораздо большее количество информации, но при этом используется несколько больше ресурсов процессора. Тем не менее, такая подкачка намного быстрее, чем обмен данными с жестким диском. Если система часто уходит в swap, это может улучшить отклик.
Zram находится в активной разработке, поэтому он ещё не стабилен, используйте его с осторожностью!

Пакет zramswap из AUR предоставляет автоматизированный скрипт для создания таких устройств подкачки с оптимальными настройками для вашей системы (такими, как объём оперативной памяти и количество ядер процессора). Скрипт создаёт одно zram-устройство на каждое ядро ​​процессора с общим объёмом, эквивалентным размеру оперативной памяти.

Чтобы это делалось автоматически при каждой загрузке нужно включить zramswap.service через systemctl.

У вас будет сжатый swap с более высоким приоритетом, чем обычный swap, и он будет использовать несколько ядер процессора для сжатия данных.

Совет: Использование zram также является хорошим способом уменьшения циклов чтения/записи диска при использовании swap на SSD.

Бинго!

Это же ровно то, что мне было нужно: устройства по количеству ядер, общий объём соответствующий оперативке, использование для подкачки.
И никакие маны дополнительно курить не нужно!

Всё, что я сделал, это:
  1. установил утилиту
    yaourt -S zramswap
  2. включил сервис в автозагрузку (или как это правильнее назвать)
    sudo systemctl enable zramswap.service
  3. ну и естественно перезагрузился.

Тесты

После рестарта я увидел следующее:

До этого третий столбец был тёмно-серый с надписью (ЕМНИП) „Подкачка недоступна‟. Теперь же она появилась, при том, что (как я говорил ранее) на диске раздела swap нет.
Но пустой виртуальный swap не сильно забавляет — нужно его потестировать. Для теста решил поставить игру Champions of Regnum из Steam. Я запустил всё, что только мог — браузеры, в том числе хромого, офис, графические редакторы, rss-читалку, и прочее, что хоть как-то ощутимо кушало память, хоть по 100 метров. Упёрся почти в потолок физической памяти. Вот тут-то и понадобилась игра (запущенная с максимальными настройками), которая по идее должна была выпихнуть из обычной памяти данные в swap. Что и случилось :) — после выключения игры (во время игры полноэкранный режим не давал посмотреть на состояние памяти) я увидел такую картину:

То есть игра выпихнула менее актуальные на тот момент данные в виртуальный swap, который их сжал попутно. Далее при закрытии игра ушла из памяти, освободив в ней место. После этого я долго пользовался системой в обычном режиме. Физическая память потихоньку заполнялась и при закрытии программ — освобождалась. А вот состояние swap почти не менялось. Из чего я сделал вывод, что данные в него утрамбовались, и далее считывались оттуда налету. А они должны были считываться, ведь программы я старался не закрывать, и использовал их. Затем я ещё раз запустил игру. После её выключения состояние памяти было примерно таким же, только объём занятого swap вырос с 18% до 23%, а физическая память чуть больше освободилась. То бишь ещё больше данных утрамбовалось.

Итоги

Итак, что мы имеем?
  • Без апгрейда железа, без подкачки на диск, и с минимумом настроек руками, мы имеем быстрый дополнительный „карман‟ для оперативных данных. Причём очень экономичный карман, утрамбовывающий данные в 2–3 раза, а если верить опыту автора статьи на хабре, то и до 10 раз!
  • Хоть в wiki и говорится о том, что при использовании модуля будет тратится несколько больше ресурсов процессора, на деле же я вообще не нашёл процесса, отъедающего ресурсы на эти нужды — в топе всегда были лишь мной запущенные программы, и пара-тройка системных, отъедающих по одному проценту.
  • Использование модуля будет полезным для машин любого уровня мощности: от нетбуков, до мощных десктопов. Где памяти мало, данное решение позволит ощутимо увеличить её. Где её много, позволит не используя swap на диске иметь подстраховку на случай, если всё же память забьётся, чтобы не доводить до ошибок, крахов и прочих неприятностей.

P.S. В след за wiki повторю, что модуль ещё не допилен до состояния стабильности, и его следует использовать с осторожностью. Хотя мне видится единственная возможная проблема с его нестабильностью — при падении или чего-то ещё могут потеряться не сохранённые изменения ваших файлов. Поэтому, как и без активации этого модуля, — просто чаще сохраняйтесь ;)

P.P.S. Буду благодарен за конструктивную критику и за поправки от знатоков и экспертов, в том числе по переводу.
Я не красноглазик, я фаерфоксик ^_^
я все же не совсем понял, откуда взялся своп. Вы говорите о помещении в оперативную память, по тексту же и картинкам я могу предположить только, что своп пишется на диск в рутовый раздел

А так спасибо за статью, хотя надобности (лично мне) в этом нет. В наше тяжелое время гораздо проще купить планку на 8гб на 100р дороже, чем планку на 2гб, которую еще найти надо
PGP 0x31361F01
arcanisrepo
Своп именно в оперативке размещается.
Примерно так: создаются дивайсы /dev/zram0 и /dev/zram1 (и так далее, у кого сколько ядер проца), размещаются они в RAM, затем монтируются — в данном случае zramswap их монтирует как swap.
Ну а системе по барабану, где этот своп размещается: видит своп — использует его. И показывает на графиках системных.
Я не красноглазик, я фаерфоксик ^_^
Прикольно, а темпик сжимаемый можно сделать?
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja
Прикольно, а темпик сжимаемый можно сделать?
Ну я думаю, что в этот своп, как и в обычный (только у этого ещё и приоритет перед обычным), спихиваются любые данные менее актуальные системе, чем те, которые ей надо разместить в памяти сию минуту. А если темпик смонтирован в tmpfs, и если я правильно понимаю, что такое tmpfs, то /tmp находится в памяти. Следовательно при надобности и темпик в сжатый виртуальный своп может (хотя бы даже частично) уйти.
По крайней мере я надеюсь на это, ибо сам tmpfs активно использую.

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

Хотя это ведь если использовать утилиту zramswap. Но если вы разберётесь с тем как самостоятельно настроить zram, то думаю будет не проблема запихнуть в устройства /dev/zram(№) хоть /tmp, хоть что угодно.
Всё в ваших руках ;)
Я не красноглазик, я фаерфоксик ^_^
Я так понимаю, при подключении этой штуки использование гибернации станет невозможно?
mehanoid, только что проверил, спящий режим работает... (естественно если не был отключен свап раздел)
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
этот zram на словах действительно хорош, а вот как до дела доходит, всё колом встаёт. ;)
такие дела.
Бьемся за скорость на шине, загрузке, инете и тут, нате- жать-разжать
Для cd- оно: в раму грузиться, привод освобождать
cucullus
этот zram на словах действительно хорош, а вот как до дела доходит, всё колом встаёт. ;)
Что конкретно у вас колом встало? Можно поподробнее?

ivand
Бьемся за скорость на шине, загрузке, инете и тут, нате- жать-разжать
Для cd- оно: в раму грузиться, привод освобождать
Всё что сжимается — сжимается единожды, далее разжимается только при считывании, налету. Я чего только не вытворял ради тестов. Тремя параллельно запущенными играми запихнул в сжатый своп практически всё, что играми не являлось. Затем пользовался системой активно. И хоть бы где, хоть бы в чём-то замечено было уменьшение скорости. Всё летает как и прежде.
Что-то для zram никто не додумался утилиту состряпать такую, чтобы исключительно cd в неё пихать (*задумался* — "а cd ещё кому-то надо?"). Зато именно своповский вариант оказался на столько нужным, что люди решили остальным жизнь облегчить.
Не наводите напраслину :) Ничего оно толком не жрёт, а пользы много.
Я не красноглазик, я фаерфоксик ^_^
 
Зарегистрируйтесь или войдите что-бы оставить сообщение.