Para responder à sua pergunta, primeiro fiz uma série de experimentos. As respostas finais estão em negrito no final.

Para responder à sua pergunta, primeiro fiz uma série de experimentos. As respostas finais estão em negrito no final.

A principal desvantagem de usar zram éInversão LRU:

as páginas mais antigas entram no zram de maior prioridade e o preenchem rapidamente, enquanto as páginas mais novas entram e saem da troca mais lenta

Odocumentação zswapdiz que o zswap não sofre com isso:

O Zswap recebe páginas para compactação por meio da API Frontswap e é capaz de despejar páginas de seu próprio pool compactado com base em LRU e gravá-las de volta no dispositivo de troca de apoio caso o pool compactado esteja cheio.

Eu poderia ter todos os benefícios do zram e uma RAM completamente compactada configurando max_pool_percentcomo 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.

Nenhum padrão max_pool_percenté especificado aqui, mas oPágina do Arch Wikidiz que é 20.

Além das implicações de desempenho da descompactação, existe algum perigo/desvantagem em definir max_pool_percentcomo 100?

Funcionaria como usar um zram aprimorado com suporte de swap?

Responder1

Para responder à sua pergunta, primeiro fiz uma série de experimentos. As respostas finais estão em negrito no final.

Experimentos realizados:

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

Configuração antes do experimento:

  • Caixa Virtual 5.1.30
  • Fedora 27, rotação xfce
  • 512 MB de RAM, 16 MB de RAM de vídeo, 2 CPUs
  • kernel Linux 4.13.13-300.fc27.x86_64
  • valor padrão swappiness(60)
  • criou um arquivo de troca vazio de 512 MB (300 MB no experimento 9) para possível uso durante alguns dos experimentos (usando ), mas ainda ddnão o fezswapon
  • desativou todos os serviços dnf* systemd, correu watch "killall -9 dnf"para ter mais certeza de que o dnf não tentará atualizar automaticamente durante o experimento ou algo assim e prejudicará muito os resultados

Estado antes do experimento:

[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

As operações de swapon subsequentes, etc., que levaram a diferentes configurações durante os experimentos, resultaram em variações de cerca de 2% desses valores.

A operação experimental consistiu em:

  • Execute o Firefox pela primeira vez
  • Aguarde cerca de 40 segundos ou até que a atividade da rede e do disco cesse (o que for mais longo)
  • Registre o seguinte estado após o experimento (o Firefox permaneceu em execução, exceto nos experimentos 7 e 9, onde o Firefox travou)

Estado após o experimento:

1) arquivo de troca, zswap desabilitado

[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) arquivo de troca, zswap habilitado, 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) arquivo de troca, zswap habilitado, 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) arquivo de troca, zswap habilitado, 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 desabilitado

[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 habilitado, 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) sem troca

Observe que o Firefox não está sendo executado neste experimento no momento da gravação dessas estatísticas.

[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) arquivo de troca, zswap habilitado, 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) arquivo de troca (300 M), zswap habilitado, max_pool_percent = 100

O Firefox travou e o sistema ainda lia furiosamente o disco. A linha de base para este experimento é diferente, pois um novo arquivo de troca foi escrito:

              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

Especificamente, 649.384 setores extras foram gravados como resultado dessa alteração.

Estado após o experimento:

[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

Subtrair os 649384 setores escritos extras de 2022272 resulta em 1372888. Isso é menos que 1433000 (veja mais tarde), o que provavelmente ocorre porque o Firefox não está carregando totalmente.

Também executei alguns experimentos com swappinessvalores baixos (10 e 1) e todos ficaram congelados com leituras excessivas de disco, impedindo-me de registrar as estatísticas finais da memória.

Observações:

  • Subjetivamente, max_pool_percentvalores altos resultaram em lentidão.
  • Subjetivamente, o sistema do experimento 9 era tão lento que se tornou inutilizável.
  • Valores altos max_pool_percentresultam na menor quantidade de gravações, enquanto valores muito baixos max_pool_percentresultam no maior número de gravações.
  • Os experimentos 5 e 6 (zram swap) sugerem que o Firefox gravou dados que resultaram em cerca de 62.000 setores gravados no disco. Qualquer valor acima de 1.433.000 são setores gravados devido à troca. Consulte a tabela a seguir.
  • Se assumirmos que o menor número de setores de leitura entre os experimentos é a linha de base, podemos comparar os experimentos com base na quantidade de setores de leitura extras devido à troca que eles causaram.

Setores escritos como consequência direta da troca (aprox.):

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)

Setores extras de leitura como consequência direta da troca (aprox.):

    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

Interpretação de resultados:

  • Isto é subjetivo e também específico para o caso de uso em questão; o comportamento irá variar em outros casos de uso.
  • O pool de páginas do Zswap ocupa espaço na RAM que poderia ser usado pelo cache de páginas do sistema (para páginas com suporte de arquivo), o que significa que o sistema joga fora repetidamente as páginas com suporte de arquivo e as lê novamente quando necessário, resultando em leituras excessivas.
  • O alto número de leituras no experimento 7 é causado pelo mesmo problema - as páginas anônimas do sistema ocupavam a maior parte da RAM e as páginas com suporte de arquivo tinham que ser lidas repetidamente do disco.
  • Pode ser possível, sob certas circunstâncias, minimizar a quantidade de dados gravados no disco de troca próximo de zero, zswapmas evidentemente não é adequado para esta tarefa.
  • Não é possível ter "RAM completamente compactada"já que o sistema precisa de uma certa quantidade de páginas não-swap para residir na RAM para operação.

Opiniões e anedotas pessoais:

  • A principal melhoria do zswap em termos de gravação em disco não é o fato de ele compactar as páginas, mas o fato de ter seu próprio sistema de buffer e cache que reduz o cache da página e mantém efetivamente mais páginas anônimas (em formato compactado) na RAM. (No entanto, com base na minha experiência subjetiva ao usar o Linux diariamente, um sistema com swap e zswapcom os valores padrão de swappinessand max_pool_percentsempre se comporta melhor do que qualquer swappinessvalor e no zswapou zswapcom valores altos de max_pool_percent.)
  • Valores baixos swappinessparecem fazer com que o sistema se comporte melhor até que a quantidade de cache de página restante seja tão pequena que inutilize o sistema devido a leituras excessivas de disco. Semelhante com muito alto max_pool_percent.
  • Use apenas zramswap e limite a quantidade de páginas anônimas que você precisa manter na memória ou use swap apoiado em disco com zswapvalores aproximadamente padrão para swappinesse max_pool_percent.

EDIT: Um possível trabalho futuro para responder aos pontos mais delicados da sua pergunta seria descobrir, para o seu caso de uso específico, como o zsmallocalocador usado em zramse compara em termos de compactação com o zbudalocador usado em zswap. Não vou fazer isso, apenas apontando coisas para pesquisar em documentos/na internet.

EDIT 2: echo "zsmalloc" > /sys/module/zswap/parameters/zpoolmuda o alocador do zswap de zbudpara zsmalloc. Continuando com meu teste para os experimentos acima e comparando zramcom zswap+ zsmalloc, parece que desde que a memória swap necessária seja a mesma de um zramswap ou de um zswapas max_pool_percent, a quantidade de leituras e gravações no disco é muito semelhante entre os dois . Na minha opinião pessoal, com base nos fatos, desde que a quantidade de zramswap necessária seja menor do que a quantidade de zramswap que posso realmente manter na RAM, então é melhor usar apenas zram; e quando eu precisar de mais troca do que posso realmente manter na memória, é melhor alterar minha carga de trabalho para evitá-la ou desabilitar zrama troca e usar zswapcom zsmalloce definir max_pool_percento equivalente ao que o zram ocupava anteriormente na memória (tamanho de zram* taxa de compactação ). Atualmente, não tenho tempo para escrever adequadamente esses testes adicionais.

informação relacionada