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_percent
como 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_percent
como 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
dd
nã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 swappiness
valores 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_percent
valores altos resultaram em lentidão. - Subjetivamente, o sistema do experimento 9 era tão lento que se tornou inutilizável.
- Valores altos
max_pool_percent
resultam na menor quantidade de gravações, enquanto valores muito baixosmax_pool_percent
resultam 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,
zswap
mas 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
zswap
com os valores padrão deswappiness
andmax_pool_percent
sempre se comporta melhor do que qualquerswappiness
valor e nozswap
ouzswap
com valores altos demax_pool_percent
.) - Valores baixos
swappiness
parecem 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 altomax_pool_percent
. - Use apenas
zram
swap e limite a quantidade de páginas anônimas que você precisa manter na memória ou use swap apoiado em disco comzswap
valores aproximadamente padrão paraswappiness
emax_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 zsmalloc
alocador usado em zram
se compara em termos de compactação com o zbud
alocador 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/zpool
muda o alocador do zswap de zbud
para zsmalloc
. Continuando com meu teste para os experimentos acima e comparando zram
com zswap
+ zsmalloc
, parece que desde que a memória swap necessária seja a mesma de um zram
swap ou de um zswap
as 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 zram
swap necessária seja menor do que a quantidade de zram
swap 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 zram
a troca e usar zswap
com zsmalloc
e definir max_pool_percent
o 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.