La principal desventaja de usar zram esinversión LRU:
las páginas más antiguas ingresan al zram de mayor prioridad y lo llenan rápidamente, mientras que las páginas más nuevas se intercambian dentro y fuera del intercambio más lento.
Eldocumentación de intercambio zsdice que zswap no sufre esto:
Zswap recibe páginas para comprimir a través de la API de Frontswap y puede desalojar páginas de su propio grupo comprimido según LRU y escribirlas nuevamente en el dispositivo de intercambio de respaldo en caso de que el grupo comprimido esté lleno.
¿Podría tener todos los beneficios de zram y una RAM completamente comprimida configurando max_pool_percent
en 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.
Aquí no max_pool_percent
se especifica ningún valor predeterminado, pero elPágina Wiki de Arcodice que lo es 20
.
Aparte de las implicaciones de rendimiento de la descompresión, ¿existe algún peligro/desventaja al max_pool_percent
configurarlo 100
?
¿Funcionaría como si se utilizara un zram mejorado con respaldo de intercambio?
Respuesta1
Para responder a su pregunta, primero realicé una serie de experimentos. Las respuestas finales están en negrita al 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
Configuración antes del experimento:
- VirtualBox 5.1.30
- Fedora 27, giro xfce
- 512 MB de RAM, 16 MB de RAM de vídeo, 2 CPU
- núcleo de Linux 4.13.13-300.fc27.x86_64
- valor predeterminado
swappiness
(60) - Creó un archivo de intercambio vacío de 512 MB (300 MB en el experimento 9) para su posible uso durante algunos de los experimentos (usando ), pero aún
dd
no lo hizo.swapon
- deshabilité todos los servicios dnf* systemd, ejecuté
watch "killall -9 dnf"
para estar más seguro de que dnf no intentará actualizarse automáticamente durante el experimento o algo así y arrojar los resultados demasiado lejos
Estado antes del 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
Las operaciones de intercambio posteriores, etc., que llevaron a las diferentes configuraciones durante los experimentos, dieron como resultado variaciones dentro de aproximadamente el 2% de estos valores.
La operación experimental consistió en:
- Ejecute Firefox por primera vez
- Espere unos 40 segundos o hasta que cese la actividad de la red y del disco (lo que sea más largo)
- Registre el siguiente estado después del experimento (Firefox dejó de funcionar, excepto en los experimentos 7 y 9, donde Firefox falló)
Estado después del experimento:
1) archivo de intercambio, zswap deshabilitado
[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) archivo de intercambio, 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) archivo de intercambio, 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) archivo de intercambio, 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) intercambio de zram, zswap deshabilitado
[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) intercambio de zram, 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) sin intercambio
Tenga en cuenta que Firefox no se está ejecutando en este experimento en el momento de registrar estas estadí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) archivo de intercambio, 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) archivo de intercambio (300 M), zswap habilitado, max_pool_percent = 100
Firefox estaba atascado y el sistema seguía leyendo furiosamente desde el disco. La línea de base para este experimento es diferente ya que se escribió un nuevo archivo de intercambio:
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
Específicamente, se han escrito 649384 sectores adicionales como resultado de este cambio.
Estado después del 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
Restar los 649384 sectores escritos adicionales de 2022272 da como resultado 1372888. Esto es menos de 1433000 (ver más adelante), lo que probablemente se debe a que Firefox no se carga completamente.
También realicé algunos experimentos con swappiness
valores bajos (10 y 1) y todos quedaron atrapados en un estado congelado con lecturas de disco excesivas, lo que me impidió registrar las estadísticas finales de la memoria.
Observaciones:
- Subjetivamente,
max_pool_percent
los valores altos resultaron en lentitud. - Subjetivamente, el sistema del experimento 9 era tan lento que resultaba inutilizable.
- Los valores altos
max_pool_percent
dan como resultado la menor cantidad de escrituras, mientras que los valores muy bajosmax_pool_percent
dan como resultado la mayor cantidad de escrituras. - Los experimentos 5 y 6 (intercambio de zram) sugieren que Firefox escribió datos que dieron como resultado aproximadamente 62000 sectores escritos en el disco. Todo lo que esté por encima de 1433000 son sectores escritos debido al intercambio. Consulte la siguiente tabla.
- Si asumimos que el número más bajo de sectores de lectura entre los experimentos es la línea de base, podemos comparar los experimentos en función de la cantidad de sectores de lectura adicionales debido al intercambio que causaron.
Sectores emitidos como consecuencia directa del permuta (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)
Sectores de lectura adicionales como consecuencia directa del intercambio (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
Interpretación de resultados:
- Esto es subjetivo y también específico del caso de uso en cuestión; El comportamiento variará en otros casos de uso.
- El grupo de páginas de Zswap quita espacio en la RAM que de otro modo podría ser utilizado por el caché de páginas del sistema (para páginas respaldadas por archivos), lo que significa que el sistema descarta repetidamente páginas respaldadas por archivos y las lee nuevamente cuando es necesario, lo que resulta en lecturas excesivas.
- El elevado número de lecturas en el experimento 7 se debe al mismo problema: las páginas anónimas del sistema ocuparon la mayor parte de la RAM y las páginas respaldadas por archivos tuvieron que leerse repetidamente desde el disco.
- En determinadas circunstancias, podría ser posible minimizar la cantidad de datos escritos en el disco de intercambio casi a cero,
zswap
pero evidentemente no es adecuado para esta tarea. - No es posible tener "RAM completamente comprimida" ya que el sistema necesita una cierta cantidad de páginas no intercambiables que residan en la RAM para su funcionamiento.
Opiniones personales y anécdotas:
- La principal mejora de zswap en términos de escritura en disco no es el hecho de que comprime las páginas, sino el hecho de que tiene su propio sistema de almacenamiento en búfer y caché que reduce el caché de la página y mantiene efectivamente más páginas anónimas (en forma comprimida) en la RAM. (Sin embargo, según mi experiencia subjetiva al usar Linux a diario, un sistema con intercambio y
zswap
con los valores predeterminados deswappiness
ymax_pool_percent
siempre se comporta mejor que cualquierswappiness
valor y ningunozswap
ozswap
con valores altos demax_pool_percent
). - Los valores bajos
swappiness
parecen hacer que el sistema se comporte mejor hasta que la cantidad de caché de página restante es tan pequeña que deja el sistema inutilizable debido a lecturas excesivas del disco. Similar con demasiado altomax_pool_percent
. - Utilice únicamente
zram
swap y limite la cantidad de páginas anónimas que necesita mantener en la memoria, o utilice swap respaldado en disco conzswap
valores aproximadamente predeterminados paraswappiness
ymax_pool_percent
.
EDITAR: Un posible trabajo futuro para responder a los puntos más finos de su pregunta sería descubrir, para su caso de uso particular, cómo se compara el zsmalloc
asignador utilizado en zram
términos de compresión con el zbud
asignador utilizado en zswap
. Sin embargo, no voy a hacer eso, solo señalaré cosas para buscar en documentos o en Internet.
EDITAR 2:
echo "zsmalloc" > /sys/module/zswap/parameters/zpool
cambia el asignador de zswap de zbud
a zsmalloc
. Continuando con mi dispositivo de prueba para los experimentos anteriores y comparándolo zram
con zswap
+ zsmalloc
, parece que mientras la memoria de intercambio necesaria sea la misma que la zram
de intercambio o la de zswap
as max_pool_percent
, la cantidad de lecturas y escrituras en el disco es muy similar entre los dos. . En mi opinión personal basada en los hechos, siempre que la cantidad de zram
swap que necesito sea menor que la cantidad de zram
swap que puedo permitirme mantener en la RAM, entonces es mejor usar únicamente zram
; y una vez que necesito más intercambio del que realmente puedo mantener en la memoria, es mejor cambiar mi carga de trabajo para evitarlo o deshabilitar zram
el intercambio y el uso zswap
y zsmalloc
configurarlo max_pool_percent
en el equivalente de lo que zram anteriormente tomó en la memoria (tamaño de zram
* relación de compresión ). Sin embargo, actualmente no tengo tiempo para hacer una reseña adecuada de estas pruebas adicionales.