¿Por qué no se respeta la configuración arc_max en ZFS en Linux?

20

Estoy ejecutando ZoL 0.6.2 desde su PPA en Ubuntu 12.04. Está en un host con 16 GB de memoria destinado a ejecutar algunas máquinas virtuales utilizando KVM / Libvirt. Después de un tiempo, ZoL está usando una cantidad de memoria increíble, alcanzando el 98% del uso de RAM con algunas máquinas virtuales en funcionamiento. Esto da como resultado nuevos procesos que se niegan a comenzar "no se puede asignar memoria". Ya ni siquiera puedo iniciar todas mis máquinas virtuales, que antes de usar ZFS usaban alrededor del 40-50% de RAM.

Por lo que entiendo, sin modificar, ZoL debería liberar memoria tan pronto como el sistema tenga poca memoria. Pues no. Así que decidí establecer la arc_maxconfiguración en 1 GB.

# echo 1073741824 >> /sys/module/zfs/parameters/zfs_arc_max

Aún así, no libera ningún recuerdo.

Como puede ver en las estadísticas ARC a continuación, está utilizando más memoria de la que está configurada para (compare c= 7572030912with c_max= 1073741824).

¿Qué estoy haciendo mal aquí?

# cat /proc/spl/kstat/zfs/arcstats
4 1 0x01 84 4032 43757119584 392054268420115
name                            type data
hits                            4    28057644
misses                          4    13975282
demand_data_hits                4    19632274
demand_data_misses              4    571809
demand_metadata_hits            4    6333604
demand_metadata_misses          4    289110
prefetch_data_hits              4    1903379
prefetch_data_misses            4    12884520
prefetch_metadata_hits          4    188387
prefetch_metadata_misses        4    229843
mru_hits                        4    15390332
mru_ghost_hits                  4    1088944
mfu_hits                        4    10586761
mfu_ghost_hits                  4    169152
deleted                         4    35432344
recycle_miss                    4    701686
mutex_miss                      4    35304
evict_skip                      4    60416647
evict_l2_cached                 4    0
evict_l2_eligible               4    3022396862976
evict_l2_ineligible             4    1602907651584
hash_elements                   4    212777
hash_elements_max               4    256438
hash_collisions                 4    17163377
hash_chains                     4    51485
hash_chain_max                  4    10
p                               4    1527347963
c                               4    7572030912
c_min                           4    1038188800
c_max                           4    1073741824
size                            4    7572198224
hdr_size                        4    66873056
data_size                       4    7496095744
other_size                      4    9229424
anon_size                       4    169150464
anon_evict_data                 4    0
anon_evict_metadata             4    0
mru_size                        4    1358216192
mru_evict_data                  4    1352400896
mru_evict_metadata              4    508928
mru_ghost_size                  4    6305992192
mru_ghost_evict_data            4    4919159808
mru_ghost_evict_metadata        4    1386832384
mfu_size                        4    5968729088
mfu_evict_data                  4    5627991552
mfu_evict_metadata              4    336846336
mfu_ghost_size                  4    1330455552
mfu_ghost_evict_data            4    1287782400
mfu_ghost_evict_metadata        4    42673152
l2_hits                         4    0
l2_misses                       4    0
l2_feeds                        4    0
l2_rw_clash                     4    0
l2_read_bytes                   4    0
l2_write_bytes                  4    0
l2_writes_sent                  4    0
l2_writes_done                  4    0
l2_writes_error                 4    0
l2_writes_hdr_miss              4    0
l2_evict_lock_retry             4    0
l2_evict_reading                4    0
l2_free_on_write                4    0
l2_abort_lowmem                 4    0
l2_cksum_bad                    4    0
l2_io_error                     4    0
l2_size                         4    0
l2_asize                        4    0
l2_hdr_size                     4    0
l2_compress_successes           4    0
l2_compress_zeros               4    0
l2_compress_failures            4    0
memory_throttle_count           4    0
duplicate_buffers               4    0
duplicate_buffers_size          4    0
duplicate_reads                 4    0
memory_direct_count             4    66583
memory_indirect_count           4    7657293
arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    0
arc_meta_used                   4    427048272
arc_meta_limit                  4    2076377600
arc_meta_max                    4    498721632

# free -m
             total       used       free     shared    buffers     cached
Mem:         15841      15385        456          0         75         74
-/+ buffers/cache:      15235        606
Swap:            0          0          0
gertvdijk
fuente

Respuestas:

22

En mi humilde opinión, los parámetros en / sys / module / zfs / parámetros solo se pueden establecer en 0/ 1- disabled/ enabled. " Corrección: depende del parámetro

Estoy en el mismo barco que quiere limitar el uso de memoria de zfs y parece que uno tiene que crear un archivo /etc/modprobe.d/zfs.conf e ingresar el parámetro y el valor deseado allí. Este cambio tendrá efecto al reiniciar.

echo "options zfs zfs_arc_max=34359738368" >> /etc/modprobe.d/zfs.conf

Para efectuar el módulo en ejecución, se puede cambiar el parámetro zfs_arc_max.

echo "34359738368" > /sys/module/zfs/parameters/zfs_arc_max

Tenga en cuenta el uso de >para reemplazar el contenido del archivo en contraste con la adición al archivo con >>.

fuente: /programming//a/18808311

Tobias F. Meier
fuente
1
El arco ZFS no se contrae de inmediato. Sin embargo (ZFSonLinux) se recupera mientras las aplicaciones asignan esa memoria, como de costumbre. Si necesita algo para acumular en la memoria, tal vez eche un vistazo a github.com/hilbix/killmem (solo 8K después make static; strip -s killmem)
Tino
En Ubuntu 16.04 necesitaba ejecutar update-initramfs -u -k allantes de reiniciar para /etc/modprobe.d/zfs.confpropagar esta configuración .
lechup
@lechup: en Ubuntu 16.04, agregué options zfs zfs_vdev_scheduler=cfqa mi /etc/modprobe.d/zfs.conf . Lo reinicié y funcionó; el planificador ahora era cfq en lugar de noop . ¿Puedes explicar por qué update-initramfs -u -k alles necesario?
Martin Velez
@ MartinVelez Sé que es extraño, pero sin él en mi máquina, los cambios no se propagaron después del reinicio ... Estaba tratando de ubicar una opción diferente, ¿ zfs_arc_maxtal vez esta clave está en caché de alguna manera en initramfs?
lechup
4

Una vez que modifique el tamaño de su arco, debe soltar sus cachés.

echo 3 > /proc/sys/vm/drop_caches

y espere (su solicitud no regresará de inmediato, pero otros procesos continuarán ejecutándose). Descargará lentamente los cachés (2,5 minutos para mi caché de 24 GB en 2 pares de negros RAD de 1 TB de 2 TB incrustados en una CPU de 4 Ghz de 4 años en una caja con 64 GB) - cuidado, de repente no tendrás cachés, y ninguno los procesos de lectura de datos se extraerán del disco sin procesar, por lo que probablemente verá que IO espera salta por un tiempo hasta que se repobla el caché.

matemáticas
fuente
¡Ah, guay! ¿Podría explicar por qué el '3' como valor para escribir en esa entrada procfs?
gertvdijk
Borrar PageCache solamente: # sync; echo 1 > /proc/sys/vm/drop_caches Borrar dentries e inodes: # sync; echo 2 > /proc/sys/vm/drop_caches Borrar PageCache, dentries e inodes:# sync; echo 3 > /proc/sys/vm/drop_caches
matemáticas
2

Un problema en el que podría estar cayendo es que ZFS almacena en caché los archivos de la máquina virtual (discos virtuales). Para evitar eso, siempre configuro la propiedad del caché primario en "metadatos" en los sistemas de archivos que contienen discos virtuales.

La lógica es que el sistema operativo invitado tiene una mejor pista sobre qué áreas de sus discos almacenar en caché.

Pavka1
fuente
0

AFAIK se debe cumplir una de las siguientes condiciones para adaptar el parámetro.

  1. En un sistema en ejecución: exporte todos los zpools, elimine los módulos zfs, vuelva a habilitar el módulo zfs (por definición, esto no se puede hacer si / está en zfs).
  2. Vuelva a generar la imagen initramfs cuando cambie el parámetro para que después de un reinicio funcione. Esto es necesario ya que la ubicación del archivo zfs.conf aún no está montada en ese momento en el proceso de arranque.
Sam
fuente
0

Tienes un " >" exceso adicional .

El comando debe ser

echo 1073741824 > /sys/module/zfs/parameters/zfs_arc_max

no " >>"

>>significa "agregar a" (lista existente).
>significa "sobrescribir" (valor).

Es por eso que el código de comando en su pregunta no funcionará.

Hipócrita
fuente
Eso ya era parte de la respuesta aceptada presente. serverfault.com/a/602457/135437
gertvdijk
Esa publicación es un desastre complicado, Sr. Downvotes. El autor dice un montón de cosas, solo tocando la respuesta correcta al pasar cerca del final del desastre, sin decir, "esta es la razón" o equivalente. Tan complicado, que no recibí mi respuesta de esa publicación. Vi la razón de la pregunta. Mi publicación fue votada por alguna razón.
Hipócrito