Учебники (How-To & F.A.Q)
   16311

Ускоряем старые машинки - systemd-swap

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

Преамбула
zRam — это модуль ядра Linux который включён в стандартную поставку ядра начиная с версии 3.14. Целью данного модуля служит создание блочного устройства в оперативной памяти, но в отличии от tmpfs, данные записываются на него в сжатом виде. Поэтому одно из основных его полезных применений это возможность создание прессующего раздела подкачки в оперативной памяти. Всё это позволяет, хоть и неявно, увеличить размер ОЗУ среднем в 2-3 раза, за счёт незначительной нагрузки ЦП на компрессию и декомпрессию данных.
На данный момент zRam поддерживает два вида компрессии: lzo(по умолчании) и lz4(начиная с версии ядра 3.15).

Амбула
Итак, у нас есть модуль и знание для чего он нужен, осталось всё это дело применить на практике.
Есть несколько вариантов как всё это запилить:
  1. вручную — для этого есть интересная статья на хабре, а также описание на kernel.org.
  2. с помощью zramswap из Аура — интересующиеся могут посмотреть тему на форуме Арча где об этом говорится.
  3. systemd-swap — об этом ниже.

Рассмотрим третий способ.
systemd-swap — как написано на github-е это скрипт автоматического создания и подключения: zram swap, swap файлы (через loop) устройств, swap.

а) Устанавливаем:
% sudo pacman -S systemd-swap


б) Настраиваем:
Вся настройка осуществляется в файле /etc/systemd-swap.conf
Для наших нужд достаточно раскомментировать всего четыре строчки.

— первая: размер создаваемого раздела — по умолчанию 1/4 от размера ОЗУ, если маловато памяти то лучше поставить 1/3 или 1/2.
zram[size]=$[${sys[ram_size]}/4]K

— вторая: количество потоков сжатия — по умолчанию используется один поток, если раскомментировать то количество потоков будет равно количеству ядер процессора.
zram[streams]=${sys[cpu_count]}

— третья: алгоритм сжатия — по умолчанию используется lz4, раньше было lzo.
zram[alg]=lz4

— четвертая: включаем собственно zram, меняем 0 на 1
zram_enabled=1

в) Добавляем в автозагрузку и запускаем:
% sudo systemctl enable systemd-swap
% sudo systemctl start systemd-swap

г) Посмотреть статус устройства:
zramctl — простой инструмент для контроля устройств zram (создать, удалить, найти, статус). Входит в состав util-linux начиная с версии 2.26.
% zramctl
NAME       ALGORITHM DISKSIZE  DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lz4         926,1M 20,3M  6,6M  7,5M       1 [SWAP]


где
NAME — название(устройство)
ALGORITHM — алгоритм сжатия
DISKSIZE — размер раздела подкачки в оперативной памяти
DATA — размер данных до сжатия
COMPR — размер данных после сжатия
TOTAL — STREAMS — количество потоков сжатия
MOUNTPOINT — точка монтирования

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

Единственное что хотелось ещё добавить это то что существует такой параметр ядра vm.swappiness отвечающий за то при каком уровне свободной оперативной памяти нужно использовать своп, по умолчанию он равен 60(40% заполнено а 60% свободно).
Если учесть что средний параметр сжатия равен 1 к 3, а также оставить некий запас прочности то можно очень приблизительно определить граничные значения:
— итоговая память ~ RAM*3: vm.swappiness = 90; ZRAM/RAM = 1/1 (при большой нагрузке возможна нестабильность системы)
— итоговая память ~ RAM*2: vm.swappiness ~ 70; ZRAM/RAM = 1/2
— итоговая память ~ RAM*1.5: vm.swappiness = 60; ZRAM/RAM = 1/4 или 1/3

Поменять vm.swappiness можно следующим образом
Создать файл /etc/sysctl.d/99-sysctl.conf и добавим в него строчку:

vm.swappiness=70

Подгрузить созданный файл конфигурации:
% sudo sysctl -p /etc/sysctl.d/99-sysctl.conf

Посмотреть что параметр действительно поменялся можно выполнив команду:
% sudo sysctl -a |grep swappiness


На этом всё.
Спасибо за внимание.

update: 25.03.2015
Обновил статью так как на днях вышла новая версия набора системных linux утилит util-linux 2.26, в эту версию вошел инструмент zramctl. При установке/обновлении util-linux, пакет zramctl будет удалён. В остальном практически всё осталось как и прежде.

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

23 комментария

avatar
Спасибо, что перенесли ее сюда. Я сделал как в инструкции, но у меня вопрос у меня вывод вот такой
sudo sysctl -a |grep swappiness
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.enp3s0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.wlp2s0.stable_secret"
vm.swappiness = 60

Раньше у меня вывод был просто
vm.swappiness = 60

От куда появилось все остальное? ipv6 никогда не пользовался
Последний раз редактировалось
0
avatar
не помог, без изменений
Последний раз редактировалось
0
avatar
Что не помог?
0
avatar
Да, действительно без изменений ((
Последний раз редактировалось
0
avatar
Вы издеваетесь? что без изменений?
0
avatar
У меня старая машина, ваш метод ускорение старой машины не работает.
0
avatar
что значит не сработало? вы ожидали, что она будет летать как суперкомпьютер Ломоносов?
что говорит zramctl в терминале?
0
avatar
zramctl нечего не говорит, молчит
0
avatar
значит вы его просто не включили
0
avatar
manjarqo
Такая же проблема. А как его включить то.
Сервис висит со статусом exited и zramctl ничего не выдает.
Последний раз редактировалось
0
avatar
комментарий был удален
avatar
zramctl
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lz4 473M 4K 65B 4K 1 [SWAP]
sudo sysctl -p /etc/sysctl.d/99-sysctl.conf
kernel.sysrq = 1
vm.swappiness = 70
sudo sysctl -a |grep swappiness
sysctl: reading key «net.ipv6.conf.all.stable_secret»
sysctl: reading key «net.ipv6.conf.default.stable_secret»
sysctl: reading key «net.ipv6.conf.enp0s4.stable_secret»
sysctl: reading key «net.ipv6.conf.lo.stable_secret»
sysctl: reading key «net.ipv6.conf.wlp0s3f3u5.stable_secret»
vm.swappiness = 70
Так и должно быть?
Последний раз редактировалось
0
avatar
а что смущает?
+1
avatar
Нет ничего, спасибо всё работает.
+1
avatar
В статье сказано, что по умолчанию параметр vm.swappiness = 60. У меня он по умолчанию равен 1. Стоит Manjaro Cinnamon. Ничего не менял:

sudo sysctl -a |grep swappiness
sysctl: reading key «net.ipv6.conf.all.stable_secret»
sysctl: reading key «net.ipv6.conf.default.stable_secret»
sysctl: reading key «net.ipv6.conf.enp2s0.stable_secret»
sysctl: reading key «net.ipv6.conf.lo.stable_secret»
vm.swappiness = 1
0
avatar
Все правильно. В manjaro, как и в некоторых других (z.b.s RedHat) стоит по умолчанию 1. Это минимальное число, если хотите — кол-во свободной памяти для использования свопа без его отключения. Для любой системы, с учетом работы установленного ПО и железа, индивидуально (если юзер озаботился) подбирается значение vm.swappiness. Если все оставить по умолчанию, то так и будет 1, но при памяти 1-2Gb диск юзаться будет со свистом и тормоза будут не детские. Скажем параметр 20, вот это значение для vm.swappiness будет более-менее. А свыше 4-х Gb ОЗУ вообще не стоит вспоминать, что есть такой параметр.
Последний раз редактировалось
0
avatar
Единственное что хотелось ещё добавить это то что существует такой параметр ядра vm.swappiness отвечающий за то при каком уровне свободной оперативной памяти нужно использовать своп, по умолчанию он равен 60(40% заполнено а 60% свободно).
И увеличение vm.swappines до 70 должно повысить производительность? Это каким же способом? Путем использования медленного диска вместо быстрой памяти?
0
avatar
В данном методе раздел подкачки находится на виртуальном диске, который находится в оперативной памяти. При записи данных в этот раздел подкачки данные сжимаются. Таким образом повысив интенсивность использования подкачки мы как бы «увеличим» объём ОЗУ за счет компрессии данных. Условно говоря так бы записалось 20 МБ в ОЗУ, а так запишется эта же информация, только сжатая до 6 МБ, в раздел подкачки, который находится в ОЗУ. В итоге мы сэкономим ОЗУ без задействования медленного жесткого диска.
0
avatar
У меня после обновления systemd-swap до версии 3.1.2-1 он просто перестал работать. zramctl вообще ничего не выдаёт. Сервис systemd-swap стартует.
+1
avatar
Аналогично. Сервис висит со статусом exited и zramctl ничего не выдает.
0
avatar
Автору следует указать, что это рекомендации не для старых компьютеров, а для систем с малым количеством ОЗУ (менее 2 ГБ) и оооочень медленным винчестером. Для ПК с 2007-2008 годов это уже не актуально (с винчестерами, которые хотя бы 60-80 МБ в секунду пишут). А у кого свыше 4Гб RAM — рекомендую вообще не пользоваться swap.
0
avatar
Например у меня 4 гб ОЗУ и играя в некоторые игры, если не использовать swap, когда ОЗУ заполняется до максимума, то система просто намертво виснет и помогает только ребут. Если использовать swap, когда ОЗУ заполняется до максимума, то система подвисает, в течении 3-5 сек. перекидывает данные в swap и отвисает. Так что лично я решил использовать swap при 4 гб ОЗУ.
0
avatar
Как мин, странная рекомендация.
— итоговая память ~ RAM*3: vm.swappiness = 90; ZRAM/RAM = 1/1 (при большой нагрузке возможна нестабильность системы)
— итоговая память ~ RAM*2: vm.swappiness ~ 70; ZRAM/RAM = 1/2
— итоговая память ~ RAM*1.5: vm.swappiness = 60; ZRAM/RAM = 1/4 или 1/3


Заставлять принудительно использовать свап, при каждом чихе. Пусть даже это ram.Тут актуальнее подобрать размер zram.
Последний раз редактировалось
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.