Чтобы ответить на ваш вопрос, я сначала провел серию экспериментов. Окончательные ответы выделены жирным шрифтом в конце.

Чтобы ответить на ваш вопрос, я сначала провел серию экспериментов. Окончательные ответы выделены жирным шрифтом в конце.

Основным недостатком использования 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подкачку и использовать zswapwith zsmallocи установить max_pool_percentэквивалент того, что zram ранее занимал в памяти (размер zram* коэффициент сжатия). Однако в настоящее время у меня нет времени сделать надлежащее описание этих дополнительных тестов.

Связанный контент