Para responder a su pregunta, primero realicé una serie de experimentos. Las respuestas finales están en negrita al final.

Para responder a su pregunta, primero realicé una serie de experimentos. Las respuestas finales están en negrita al final.

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_percenten 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_percentse 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_percentconfigurarlo 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 ddno 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 swappinessvalores 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_percentlos valores altos resultaron en lentitud.
  • Subjetivamente, el sistema del experimento 9 era tan lento que resultaba inutilizable.
  • Los valores altos max_pool_percentdan como resultado la menor cantidad de escrituras, mientras que los valores muy bajos max_pool_percentdan 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, zswappero 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 zswapcon los valores predeterminados de swappinessy max_pool_percentsiempre se comporta mejor que cualquier swappinessvalor y ninguno zswapo zswapcon valores altos de max_pool_percent).
  • Los valores bajos swappinessparecen 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 alto max_pool_percent.
  • Utilice únicamente zramswap y limite la cantidad de páginas anónimas que necesita mantener en la memoria, o utilice swap respaldado en disco con zswapvalores aproximadamente predeterminados para swappinessy max_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 zsmallocasignador utilizado en zramtérminos de compresión con el zbudasignador 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/zpoolcambia el asignador de zswap de zbuda zsmalloc. Continuando con mi dispositivo de prueba para los experimentos anteriores y comparándolo zramcon zswap+ zsmalloc, parece que mientras la memoria de intercambio necesaria sea la misma que la zramde intercambio o la de zswapas 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 zramswap que necesito sea menor que la cantidad de zramswap 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 zramel intercambio y el uso zswapy zsmallocconfigurarlo max_pool_percenten 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.

información relacionada