Страница 1 из 4

swap

Добавлено: 16 апр 2017, 19:50
Olej
Последние времена:

- RAM Linux обязательно перевалили минимум за 1Gb (ещё не так давно 256Mb было "за глаза"), нормой стало 4Gb, очень часто на типовом десктопе 8Gb или 16Gb ... про сервера здесь не говорим...
- многие переходят на быстрые твёрдотельные SSD диски.

В связи с этим очень говорят и пишут, даже очень авторитетные люди и источники, утверждают (и именно в такой формулировке):
У меня много оперативной памяти и диск SSD и именно поэтому у меня вообще нет swap и нет в нём нужды.


Я думаю (IMHO :!: ), что это принципиально неверно. И поэтому в деталях хотелось бы уточнить (и собрать из разных мест) всё о swap в этой теме:
1. обязателен ли swap?
2. какие есть способы (варианты) организации swap?
3. связано ли как-то использование swap с SSD?
4. какой размер выбирать для swap?
5. как управлять (оптимизировать) работой swap.

Re: swap

Добавлено: 16 апр 2017, 20:17
Olej
Olej писал(а): 1. обязателен ли swap?
2. какие есть способы (варианты) организации swap?
3. связано ли как-то использование swap с SSD?
4. какой размер выбирать для swap?
1. swap обязателен.
Вообще без swap систем может замечательно работать. И даже весьма долго... Но это до поры, до времени...
И падать система без свап никогда не будет.
Со swap как с понятием произошла дурная история, которая тянется ещё из Windows 3.11 ... с самим термином. Но swap Linux - это не выгрузка областей памяти на диск, а отображение логических страниц RAM на сектора диска (хотя при этом может происходить и выгрузка) - виртуализации.
При активной эксплуатации (в реальных условиях, а не "на поиграться") вся доступная RAM может исчерпаться практически на 100%. И тогда система истерически ищет хоть ненадолго освободить 1-2-3 физических страниц памяти, но без swap это невозможно, система начинает искать страницы, которые нужно просто утилизировать (самые неиспользуемые). и скорость системы может снизиться на 1-2-3 и более порядков! И выгребаться из этого состояния система может 1 минуту, 10 минут и т.д. ... и в это время вы не сможете вмешаться в её работу, её реакция отбита (или почти отбита).
(такую картину можно смоделировать если в современных браузерах открывать, открывать и открывать новые закладки ... и ещё при этом не перезагружать систему 2-3-5 дней ... в ждущем режиме)
Хуже того, что даже ядро Linux в некоторых случаях (достаточно редких) может потребовать загрузки-выгрузки образа страниц RAM. И здесь будут те же проблемы.
А при доступности swap таких эффектов не возникает.

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

4. Когда-то, на заре Linux и Windows ... да и других систем, QNX, например, во всех них рекомендовали размер swap = 2 * RAM - в 2 раза больше оперативной памяти. Но это мотивировалось тем, что они хотели расширить размер небольшой памяти!
А на сегодня задача расширения большой памяти (4-8-16Gb) не стоит. А задача - подстраховаться на короткие периоды от клинча памяти, и освободить несколько страниц (по 4Kb для 32-бит, или 64Kb для 32-бит PAE) RAM. И вовсе не нужно, как советовали в древние времена, иметь swap размером в RAM*2 - более чем достаточно просто небольшого swap, скажем в 1Gb.

Re: swap

Добавлено: 16 апр 2017, 21:43
Olej
Тема очень актуальная!
Хотел этот же вопрос обсудить на форумах Mint, применительно к последним Mint (особенно в связи с тем, что в последних Ubuntu в качестве swap по умолчанию устанавливается файл, а не раздел)...

Но вот здесь, к примеру - Русский форум пользователей Linux Mint - законченные дегенераты, ... они считают такие обсуждения флудом, отвлекающим их от обсуждения раскрасок свистелок и перделок.
Так что мнений из этого источника мы не узнаем. :evil:
Страна должна знать своих героев.
© И.В.Сталин

Re: swap

Добавлено: 16 апр 2017, 22:54
Olej
Olej писал(а): 2. какие есть способы (варианты) организации swap?
1. Самый распространённый и популярный способ - выделение раздела диска. Это общеизвестно.

2. Наверное все знают другом способе - использовании для swap файла в файловой системе. Объявлено, что в Ubuntu последних версий этот способ используется по умолчанию. Я могу предположить, что это сделано именно из-за нарастающего распространения SSD, желания облегчить их от многократной перезаписи: swap-раздел всегда находится в ограниченном числе последовательных фиксированных секторов диска, а файл в файловой системе "разбросан", не располагается в последовательных секторах, и при перезаписи "размазывается" по диску. Это предположение (IMHO :!: ).

3. Не очень известно, что есть такой проект-модуль zRam. В случае использования zRam, swap будет находиться в специальном сжатом разделе оперативной памяти. Как утверждают, этот вариант прекрасно подойдет для нетбуков, имеющих 2Гб ОЗУ.
Подробнее см. здесь своп в оперативную память - модуль zRam.
Этот проект включен в стандартные репозитории некоторых дистрибутивов:
Это Mint 17.3:

Код: Выделить всё

olej@atom ~ $ apt search zram-*
p   zram-config                     - Upstart job to enable zram support   
Это Mint 18.1:

Код: Выделить всё

olej@nvidia ~ $ apt search zram-*
p   zram-config                     - Upstart job to enable zram support        
Но в RPM дистрибутивах (Fedora 23) я его не вижу.

Текущий используемый swap смотрим:

Код: Выделить всё

[olej@dell .ssh]$ swapon -s
Имя файла				Тип		Размер	Исп-но	Приоритет
/dev/dm-0                              	partition	6288892	480	-1
4. Менее известно, что для swap могут одновременно использоваться несколько источников, которые могут быть разбросаны по разным ... "остаткам" на дисковых устройствах. Подключаются все они swapon, а отключаются, соответственно, swapoff (об этом позже).

Re: swap

Добавлено: 16 апр 2017, 23:25
Olej
Olej писал(а):5. как управлять (оптимизировать) работой swap.
Активность текущего использования swap смотрим легко:

Код: Выделить всё

[olej@dell ~]$ free
              total        used        free      shared  buff/cache   available
Mem:        8160932     3855356      229272      198868     4076304     3708128
Swap:       6288892         484     6288408
В ядре Linux есть такой параметр swappiness, который устанавливает значение в % (значение от 0 до 100) сколько должно в % остаться свободной памяти, когда начинать активно использовать виртуализацию страниц в swap.
Этот параметр отображается, и по чтению и по записи:

Код: Выделить всё

 
[olej@dell ~]$ cat /proc/sys/vm/swappiness
60
Это умалчиваемое обычное значение.
Если его уменьшить, это означает, что ядро начнёт агрессивно использовать swap когда останется 15% доступной RAM:

Код: Выделить всё

[root@dell ~]# echo 15 > /proc/sys/vm/swappiness
[olej@dell ~]$ cat /proc/sys/vm/swappiness
15

Но это можно проделать только с терминала, зарегистрированного как root, простое перенаправление с sudo здесь не проканывает:

Код: Выделить всё

[olej@dell ~]$ sudo echo 10 > /proc/sys/vm/swappiness
bash: /proc/sys/vm/swappiness: Отказано в доступе
Но если вы этого (регистрироваться как root) не хотите ... или затрудняетесь (в Ubuntu это можно, но с хлопотами), то этого можно добиться так:

Код: Выделить всё

[olej@dell ~]$ echo 10 | sudo tee /proc/sys/vm/swappiness 
[sudo] пароль для olej: 
10
[olej@dell ~]$ cat /proc/sys/vm/swappiness
10
Olej писал(а): 3. связано ли как-то использование swap с SSD?
В принципе, для SSD, пожалуй, этот параметр можно установить, например, в swappiness = 5, чтобы swap включался как можно позже и только в экстренных случаях.

При достаточно большой RAM и малых значениях swappiness реакция системы субъективно будет быстрее.

Re: swap

Добавлено: 16 апр 2017, 23:40
Olej
Olej писал(а): Если его уменьшить, это означает, что ядро начнёт агрессивно использовать swap когда останется 15% доступной RAM:

Код: Выделить всё

[root@dell ~]# echo 15 > /proc/sys/vm/swappiness
[olej@dell ~]$ cat /proc/sys/vm/swappiness
15

...
При достаточно большой RAM и малых значениях swappiness реакция системы субъективно будет быстрее.
После этого действия, через некоторое время и запустив виртуальную машину под VirtualBox (для потребления памяти) увидим что-то такое:

Код: Выделить всё

[olej@dell ~]$ free
              total        used        free      shared  buff/cache   available
Mem:        8160932     4670500      131676      205148     3358756     2881484
Swap:       6288892         612     6288280

Код: Выделить всё

[olej@dell Linux.books.own]$ cat /proc/sys/vm/swappiness
10
131676 ÷ 8160932 ×100 = 16,13%

Re: swap

Добавлено: 16 апр 2017, 23:53
Olej
Olej писал(а): В ядре Linux есть такой параметр swappiness, который устанавливает значение в % (значение от 0 до 100) сколько должно в % остаться свободной памяти, когда начинать активно использовать виртуализацию страниц в swap.
Этот параметр отображается, и по чтению и по записи:
Но если изменить значение swappiness как показано выше, то изменения будут действовать только до следующей перезагрузки, после чего опять восстановится умалчиваемое значение.
Чтобы желаемое вами значение для swappiness устанавливалось сразу после загрузки, нужно в конфигурационный файл /etc/sysctl.conf строку вида:

Код: Выделить всё

vm.swappiness=15

P.S. Если не хотите портить /etc/sysctl.conf, можно то же записать в любой файл (а ещё лучше добавить свой файл) в:

Код: Выделить всё

[olej@dell Privat.bank]$ ls /usr/lib/sysctl.d
00-system.conf  10-default-yama-scope.conf  50-coredump.conf  50-default.conf  60-libvirtd.conf
Или даже в каталог /run/sysctl.d/, но его обычно нет, и нужно создать.
Для того, чтобы это переписанное значение (переменных ядра) вступило в силу немедленно без перезагрузки нужна команда:

Код: Выделить всё

root@R420:/etc# sysctl --system
...

Re: swap

Добавлено: 17 апр 2017, 21:00
Olej
Olej писал(а): 2. Наверное все знают другом способе - использовании для swap файла в файловой системе. Объявлено, что в Ubuntu последних версий этот способ используется по умолчанию.
Создание и использование swapfile хорошо известно и описано. Общая схема выглядит так:
1. Создать сам файл:

Код: Выделить всё

[olej@dell 17]$ sudo dd if=/dev/zero of=/swapfile bs=1M count=500
[sudo] пароль для olej:
500+0 записей получено
500+0 записей отправлено
 скопировано 524288000 байт (524 MB), 0,239128 c, 2,2 GB/c

[olej@dell 17]$ ls -l /swapfile
-rw-r--r-- 1 root root 524288000 апр 17 20:38 /swapfile
2. Создать структуру свап-файла (разметка, форматирование?):

Код: Выделить всё

[olej@dell 17]$ sudo mkswap /swapfile
mkswap: /swapfile: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 500 MiB (524283904 bytes)
без метки, UUID=ab4a48f4-1fdd-4486-850c-c8f4817cc747
3. Подключить его как swap:

Код: Выделить всё

[olej@dell 17]$ sudo swapon /swapfile
swapon: /swapfile: insecure permissions 0644, 0600 suggested.
swapon: /swapfile: swapon failed: Недопустимый аргумент
4. Первую ошибку легко устранить:

Код: Выделить всё

[olej@dell 17]$ sudo chmod 0600 /swapfile
[olej@dell 17]$ ls -ln /swapfile
-rw------- 1 0 0 524288000 апр 17 20:40 /swapfile
... повторяем подключение swap:

Код: Выделить всё

[olej@dell 17]$ sudo swapon /swapfile
swapon: /swapfile: swapon failed: Недопустимый аргумент
Вот так! Облом... :cry:
Ответ находим:

Код: Выделить всё

[olej@dell ~]$ man swapon
...
       swapon may not work correctly when using a swap file with some versions of btrfs.  This is due to btrfs being a copy-
       on-write filesystem: the file location may not be static and corruption can result.  Btrfs actively disallows the use
       of swap files on its filesystems by refusing to map the file.
...
[olej@dell 17]$ mount | grep /dev/sd
/dev/sda5 on / type btrfs (rw,relatime,space_cache,subvolid=257,subvol=/root)
/dev/sda3 on /boot type ext4 (rw,relatime,data=ordered)
На btrfs создать swap нельзя! :-o

Re: swap

Добавлено: 17 апр 2017, 23:40
Olej
Olej писал(а):На btrfs создать swap нельзя! :-o
А теперь то же самое, но на другой системе с традиционной ext4:

Код: Выделить всё

olej@nvidia ~ $ mount | grep sd
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/sda2 on /home type ext4 (rw,relatime,data=ordered)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

olej@nvidia ~ $ swapon -s
Filename				Type		Size	Used	Priority
/dev/sda3                              	partition	4606972	0	-1

olej@nvidia ~ $ free
              total        used        free      shared  buff/cache   available
Память:     4045840      472432     2633704       25404      939704     3300720
Подкачка:     4606972           0     4606972
Повторяем ту же последовательность:

Код: Выделить всё

olej@nvidia ~ $ sudo dd if=/dev/zero of=/swapfile bs=1M count=500
[sudo] пароль для olej: 
500+0 записей получено
500+0 записей отправлено
524288000 байт (524 MB, 500 MiB) скопирован, 0,60167 s, 871 MB/s

olej@nvidia ~ $ sudo mkswap /swapfile
Setting up swapspace version 1, size = 500 MiB (524283904 bytes)
без метки, UUID=664baecc-ec29-42de-a0d1-1e89499c09da

olej@nvidia ~ $ sudo chmod 0600 /swapfile

olej@nvidia ~ $ ls -l /swapfile 
-rw------- 1 root root 524288000 Апр 17 21:45 /swapfile
Подключаем:

Код: Выделить всё

olej@nvidia ~ $ sudo swapon -va /swapfile
swapon /swapfile
swapon: /swapfile: found swap signature: version 1d, page-size 4, same byte order
swapon: /swapfile: pagesize=4096, swapsize=524288000, devsize=524288000

olej@nvidia ~ $ swapon -s
Filename				Type		Size	Used	Priority
/dev/sda3                              	partition	4606972	0	-1
/swapfile                              	file    	511996	0	-2

olej@nvidia ~ $ free
              total        used        free      shared  buff/cache   available
Память:     4045840      472668     2633388       25404      939784     3300448
Подкачка:     5118968           0     5118968
Теперь используются одновременно 2 swap ... пространства.
А теперь старый раздел убираем из swap:

Код: Выделить всё

olej@nvidia ~ $ sudo swapoff /dev/sda3

olej@nvidia ~ $ swapon -s
Filename				Type		Size	Used	Priority
/swapfile                              	file    	511996	0	-1

olej@nvidia ~ $ free
              total        used        free      shared  buff/cache   available
Память:     4045840      474000     2631852       25404      939988     3299188
Подкачка:      511996           0      511996

Re: swap

Добавлено: 12 июл 2018, 18:21
Olej
Olej писал(а): 4. какой размер выбирать для swap?
Посмотрел как там обстоят дела в Mint 18.3 ... чуть и не при дефаултной установке системы:

Код: Выделить всё

olej@nvidia ~ $ swapon --show
NAME      TYPE      SIZE USED PRIO
/dev/sda3 partition 4,4G 6,8M   -2
Это при 4Gb RAM ... из которых в свап используются 6.8Mb :-P

Код: Выделить всё

olej@nvidia ~ $ free
              total        used        free      shared  buff/cache   available
Память:     4039192     2225904      241536      125812     1571752     1360948
Подкачка:     4606972        6924     4600048
При стандартной для десктопа стратегии использования swap:

Код: Выделить всё

olej@nvidia ~ $ cat /proc/sys/vm/swappiness
60