Основным недостатком использования zram являетсяинверсия LRU:
старые страницы попадают в zram с более высоким приоритетом и быстро заполняют его, в то время как новые страницы загружаются и выгружаются из более медленной [...] swap
Theдокументация zswapговорит, что zswap не страдает от этого:
Zswap получает страницы для сжатия через API Frontswap и может извлекать страницы из собственного сжатого пула на основе LRU и записывать их обратно на резервное устройство подкачки в случае, если сжатый пул заполнен.
Могу ли я получить все преимущества zram и полностью сжатую оперативную память, установив max_pool_percent
значение 100
?
Zswap seeks to be simple in its policies. Sysfs attributes allow for one user controlled policy: * max_pool_percent - The maximum percentage of memory that the compressed pool can occupy.
Здесь не max_pool_percent
указано значение по умолчанию, ноСтраница Arch Wikiговорит, что это так 20
.
Помимо влияния распаковки на производительность, есть ли какие-либо опасности/недостатки в установке max_pool_percent
значения 100
?
Будет ли это работать так же, как при использовании улучшенной подкачиваемой памяти zram?
решение1
Чтобы ответить на ваш вопрос, я сначала провел серию экспериментов. Окончательные ответы выделены жирным шрифтом в конце.
Проведенные эксперименты:
1) swap file, zswap disabled
2) swap file, zswap enabled, max_pool_percent = 20
3) swap file, zswap enabled, max_pool_percent = 70
4) swap file, zswap enabled, max_pool_percent = 100
5) zram swap, zswap disabled
6) zram swap, zswap enabled, max_pool_percent = 20
7) no swap
8) swap file, zswap enabled, max_pool_percent = 1
9) swap file (300 M), zswap enabled, max_pool_percent = 100
Подготовка к эксперименту:
- VirtualBox 5.1.30
- Fedora 27, xfce спин
- 512 МБ ОЗУ, 16 МБ видеопамяти, 2 ЦП
- ядро linux 4.13.13-300.fc27.x86_64
- значение по умолчанию
swappiness
(60) - создал пустой файл подкачки размером 512 МБ (300 МБ в эксперименте 9) для возможного использования во время некоторых экспериментов (с использованием ), но пока
dd
не сделал этогоswapon
- отключил все службы dnf* systemd, запустил,
watch "killall -9 dnf"
чтобы быть более уверенным, что dnf не попытается автоматически обновиться во время эксперимента или что-то в этом роде и не испортит результаты слишком сильно
Состояние перед экспериментом:
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 280 72 8 132 153
Swap: 511 0 511
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 74624 8648 127180 0 0 1377 526 275 428 3 2 94 1 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 102430 688 3593850 67603 3351 8000 1373336 17275 0 26
sr0 0 0 0 0 0 0 0 0 0 0
Последующие операции замены и т. д., приводящие к различным настройкам во время экспериментов, привели к отклонениям в пределах около 2% от этих значений.
Экспериментальная операция состояла из:
- Запустите Firefox в первый раз
- Подождите около 40 секунд или пока не прекратится активность сети и диска (в зависимости от того, что наступит дольше)
- Запишите следующее состояние после эксперимента (Firefox остался работать, за исключением экспериментов 7 и 9, где Firefox аварийно завершил работу)
Состояние после эксперимента:
1) файл подкачки, zswap отключен
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 287 5 63 192 97
Swap: 511 249 262
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 255488 5904 1892 195428 63 237 1729 743 335 492 3 2 93 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 134680 10706 4848594 95687 5127 91447 2084176 26205 0 38
sr0 0 0 0 0 0 0 0 0 0 0
2) файл подкачки, zswap включен, max_pool_percent = 20
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 330 6 33 148 73
Swap: 511 317 194
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 325376 7436 756 151144 3 110 1793 609 344 477 3 2 93 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 136046 1320 5150874 117469 10024 41988 1749440 53395 0 40
sr0 0 0 0 0 0 0 0 0 0 0
3) файл подкачки, zswap включен, max_pool_percent = 70
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 342 8 32 134 58
Swap: 511 393 118
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 403208 8116 1088 137180 4 8 3538 474 467 538 3 3 91 3 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 224321 1414 10910442 220138 7535 9571 1461088 42931 0 60
sr0 0 0 0 0 0 0 0 0 0 0
4) файл подкачки, zswap включен, max_pool_percent = 100
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 345 10 32 129 56
Swap: 511 410 101
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 420712 10916 2316 130520 1 11 3660 492 478 549 3 4 91 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 221920 1214 10922082 169369 8445 9570 1468552 28488 0 56
sr0 0 0 0 0 0 0 0 0 0 0
5) zram swap, zswap отключен
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 333 4 34 147 72
Swap: 499 314 185
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
5 0 324128 7256 1192 149444 153 365 1658 471 326 457 3 2 93 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 130703 884 5047298 112889 4197 9517 1433832 21037 0 37
sr0 0 0 0 0 0 0 0 0 0 0
zram0 58673 0 469384 271 138745 0 1109960 927 0 1
6) zram swap, zswap включен, max_pool_percent = 20
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 338 5 32 141 65
Swap: 499 355 144
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 364984 7584 904 143572 33 166 2052 437 354 457 3 3 93 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 166168 998 6751610 120911 4383 9543 1436080 18916 0 42
sr0 0 0 0 0 0 0 0 0 0 0
zram0 13819 0 110552 78 68164 0 545312 398 0 0
7) обмена нет
Обратите внимание, что на момент записи статистики Firefox в этом эксперименте не работал.
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 289 68 8 127 143
Swap: 0 0 0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 70108 10660 119976 0 0 13503 286 607 618 2 5 88 5 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 748978 3511 66775042 595064 4263 9334 1413728 23421 0 164
sr0 0 0 0 0 0 0 0 0 0 0
8) файл подкачки, zswap включен, max_pool_percent = 1
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 292 7 63 186 90
Swap: 511 249 262
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 255488 7088 2156 188688 43 182 1417 606 298 432 3 2 94 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 132222 9573 4796802 114450 10171 77607 2050032 137961 0 41
sr0 0 0 0 0 0 0 0 0 0 0
9) файл подкачки (300 МБ), zswap включен, max_pool_percent = 100
Firefox застрял, а система продолжала яростно читать с диска. База для этого эксперимента другая, так как был записан новый файл подкачки:
total used free shared buff/cache available
Mem: 485 280 8 8 196 153
Swap: 299 0 299
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 8948 3400 198064 0 0 1186 653 249 388 2 2 95 1 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 103099 688 3610794 68253 3837 8084 1988936 20306 0 27
sr0 0 0 0 0 0 0 0 0 0 0
В частности, в результате этого изменения было записано дополнительно 649384 сектора.
Состояние после эксперимента:
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 335 32 47 118 53
Swap: 299 277 22
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
7 1 283540 22912 2712 129132 0 0 83166 414 2387 1951 2 23 62 13 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 3416602 26605 406297938 4710584 4670 9025 2022272 33805 0 521
sr0 0 0 0 0 0 0 0 0 0 0
Вычитание дополнительных 649384 записанных секторов из 2022272 дает 1372888. Это меньше 1433000 (см. ниже), что, вероятно, связано с тем, что Firefox не загружается полностью.
Я также провел несколько экспериментов с низкими swappiness
значениями (10 и 1), и все они застряли в замороженном состоянии из-за чрезмерного чтения с диска, что не позволило мне записать окончательную статистику памяти.
Наблюдения:
- Субъективно высокие
max_pool_percent
значения приводили к замедлению. - Субъективно, система в эксперименте 9 была настолько медленной, что ее невозможно было использовать.
- Высокие
max_pool_percent
значения приводят к наименьшему количеству записей, тогда как очень низкие значенияmax_pool_percent
приводят к наибольшему количеству записей. - Эксперименты 5 и 6 (zram swap) предполагают, что firefox записал данные, в результате чего на диск было записано около 62000 секторов. Все, что выше 1433000, — это секторы, записанные из-за подкачки. Смотрите следующую таблицу.
- Если принять наименьшее количество считанных секторов среди экспериментов за базовый уровень, то можно сравнить эксперименты на основе того, сколько дополнительных считанных секторов из-за подкачки они вызвали.
Записанные сектора как прямое следствие обмена (приблизительно):
650000 1) swap file, zswap disabled
320000 2) swap file, zswap enabled, max_pool_percent = 20
30000 3) swap file, zswap enabled, max_pool_percent = 70
40000 4) swap file, zswap enabled, max_pool_percent = 100
0 5) zram swap, zswap disabled
0 6) zram swap, zswap enabled, max_pool_percent = 20
-20000 7) no swap (firefox crashed)
620000 8) swap file, zswap enabled, max_pool_percent = 1
-60000 9) swap file (300 M), zswap enabled, max_pool_percent = 100 (firefox crashed)
Дополнительные сектора чтения как прямое следствие замены (приблизительно):
51792 1) swap file, zswap disabled
354072 2) swap file, zswap enabled, max_pool_percent = 20
6113640 3) swap file, zswap enabled, max_pool_percent = 70
6125280 4) swap file, zswap enabled, max_pool_percent = 100
250496 5) zram swap, zswap disabled
1954808 6) zram swap, zswap enabled, max_pool_percent = 20
61978240 7) no swap
0 (baseline) 8) swap file, zswap enabled, max_pool_percent = 1
401501136 9) swap file (300 M), zswap enabled, max_pool_percent = 100
Интерпретация результатов:
- Это субъективно и специфично для конкретного варианта использования; в других вариантах использования поведение будет отличаться.
- Пул страниц Zswap занимает место в оперативной памяти, которое в противном случае могло бы использоваться кэшем страниц системы (для страниц, сохраненных в файлах), а это означает, что система неоднократно отбрасывает страницы, сохраненные в файлах, и считывает их снова при необходимости, что приводит к избыточному чтению.
- Большое количество чтений в эксперименте 7 вызвано той же проблемой — анонимные страницы системы занимали большую часть оперативной памяти, а страницы, сохраненные в файлах, приходилось многократно считывать с диска.
- При определенных обстоятельствах можно было бы минимизировать объем данных, записываемых на диск подкачки, практически до нуля,
zswap
но для этой задачи он, очевидно, не подходит. - Невозможно иметь "полностью сжатая оперативная память" поскольку для работы системы необходимо наличие определенного количества не подкачиваемых страниц в оперативной памяти.
Личные мнения и анекдоты:
- Главное улучшение zswap с точки зрения записи на диск заключается не в том, что он сжимает страницы, а в том, что у него есть собственная система буферизации и кэширования, которая уменьшает кэш страниц и эффективно сохраняет больше анонимных страниц (в сжатом виде) в оперативной памяти. (Однако, основываясь на моем субъективном опыте ежедневного использования Linux, система со swap и
zswap
со значениями по умолчаниюswappiness
иmax_pool_percent
всегда ведет себя лучше, чем с любымswappiness
значением и без негоzswap
илиzswap
с высокими значениямиmax_pool_percent
.) - Низкие
swappiness
значения, по-видимому, заставляют систему вести себя лучше, пока объем оставшегося кэша страниц не станет настолько мал, что сделает систему непригодной для использования из-за чрезмерного чтения с диска. Аналогично с слишком высокимmax_pool_percent
. - Либо используйте только
zram
подкачку и ограничьте количество анонимных страниц, которые необходимо хранить в памяти, либо используйте подкачку на диске сzswap
приблизительно стандартными значениями дляswappiness
иmax_pool_percent
.
EDIT: Возможная будущая работа по ответу на более тонкие моменты вашего вопроса будет заключаться в выяснении для вашего конкретного варианта использования, как распределитель, zsmalloc
используемый в , zram
сравнивается с точки зрения сжатия с zbud
распределителем, используемым в zswap
. Я не собираюсь этого делать, хотя, просто укажу на то, что следует искать в документации/в Интернете.
EDIT 2:
echo "zsmalloc" > /sys/module/zswap/parameters/zpool
переключает аллокатор zswap с zbud
на zsmalloc
. Продолжая с моим тестовым приспособлением для приведенных выше экспериментов и сравнивая zram
с zswap
+ zsmalloc
, кажется, что пока необходимая память подкачки такая же, как у zram
подкачки или как zswap
, max_pool_percent
объем чтения и записи на диск очень похож между ними. По моему личному мнению, основанному на фактах, пока zram
необходимый мне объем подкачки меньше, чем объем zram
подкачки, который я могу себе позволить фактически хранить в оперативной памяти, то лучше всего использовать только zram
; и как только мне понадобится больше подкачки, чем я могу фактически хранить в памяти, лучше всего либо изменить мою рабочую нагрузку, чтобы избежать этого, либо отключить zram
подкачку и использовать zswap
with zsmalloc
и установить max_pool_percent
эквивалент того, что zram ранее занимал в памяти (размер zram
* коэффициент сжатия). Однако в настоящее время у меня нет времени сделать надлежащее описание этих дополнительных тестов.