¿Cómo desactivar el caché de bloques para procesos individuales?

¿Cómo desactivar el caché de bloques para procesos individuales?

Tengo un sistema grande con muchos servicios vinculados a disco. Funcionan mucho mejor con el uso del caché de bloques.

Además de eso, también se está ejecutando algún proceso de copia de seguridad.

Sé cómo deberían usar el caché de bloques: no deberían hacerlo en absoluto.

La copia de seguridad ocurre copiando un dispositivo de bloque a otro con unbufferdominio. La probabilidad de que requiera algún almacenamiento en caché es prácticamente nula.

Sin embargo, si se ejecuta la copia de seguridad, empeora los servicios habituales. dando un bajoioniceesto no ayuda demasiado: el problema no es su prioridad de IO, sino que sobrescribe el caché de bloques con datos innecesarios.

¿Puedo configurar de alguna manera este buffercomando para que no use el caché de bloques en absoluto?

Copia volúmenes lvm a otro, si es importante.

Respuesta1

he encontrado elnocacheherramienta para la tarea.

En general, en Linux no es posible: no existe tal opción, ni flag, ni nada, que se pueda configurar para unproceso.

sin embargo, elposix_fadvise(...)La llamada se puede utilizar para avisar al subsistema de caché de bloque/búfer cuando se espera una operación de lectura/escritura consecutiva. A POSIX_FADV_DONTNEEDproporciona la "información adicional" al kernel, que no debe almacenarlos en caché, porque no se volverá a leer en un futuro próximo.

nocacheintercepta todas las operaciones de archivos importantes a posix_fadvise(...)través de una biblioteca compartida inyectada por la LD_PRELOADvariable de entorno.

Como su nombre indica, es sólo un consejo; sin embargo mis experimentos muestran unaenormemejora del rendimiento (efectivamente, se pueden ejecutar otras tareas importantes, en paralelo con las copias de seguridad en segundo plano, sin una disminución visible del rendimiento para los usuarios finales).

Respuesta2

Herramientas como nocacheson en realidadnola solución adecuada. CitarnocacheLa fuente:

¿Qué es esta herramienta?nobueno para:

  • Controlar cómo se utiliza la caché de su página
    • ¿Por qué crees que alguna herramienta aleatoria que encontraste en GitHub puede funcionar mejor que el kernel de Linux?
  • Defensa contra la destrucción de caché
    • Utilice cgroups para limitar la cantidad de memoria que tiene un proceso. Consulte a continuación o busque en Internet. Esto es ampliamente conocido, funciona de manera confiable y no introduce penalizaciones de rendimiento ni comportamientos potencialmente peligrosos como lo hace esta herramienta.

Por lo tanto, use cgroups (para ser más precisos, en 2023 definitivamente cgroupsv2 siempre que sea posible) para limitar la cantidad de caché que su proceso puede usar (y así limitar la cantidad de caché que puede desalojar):

Cómo ejecutar un proceso y sus hijos en un cgroup limitado a memoria

Haga esto si, por ejemplo, desea ejecutar una copia de seguridad pero no quiere que su sistema se ralentice debido a la destrucción de la caché de la página.

Si usas systemd

Si tu distro usa systemd, esto es muy fácil. Systemd permite ejecutar un proceso (y sus subprocesos) en un "alcance", que es un cgroup, y puede especificar parámetros que se traducen a los límites de cgroup.

Cuando ejecuto mis copias de seguridad, hago:

$ systemd-run --scope --property=MemoryLimit=500M -- backup command 

( MemoryMaxpara v2)

El efecto es que el espacio de caché permanece limitado por un máximo adicional de 500 MiB:

Antes:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.4G        1.3G        1.0G        3.7G        3.7G
Swap:          9.7G         23M        9.7G

Durante (observe cómo la mejora/caché solo aumenta ~300MiB):

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.5G        1.0G        1.1G        4.0G        3.6G
Swap:          9.7G         23M        9.7G

¿Cómo funciona esto?

Úselo systemd-cglspara enumerar los cgroups que crea systemd. En mi sistema, el comando anterior crea un grupo llamado run-u467.scopeen el system.slicegrupo principal; Puedes inspeccionar su configuración de memoria de esta manera:

$ mount | grep cgroup | grep memory cgroup on
/sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec
latime,memory)

$ cat /sys/fs/cgroup/memory/system.slice/run-u467.scope/memory.limit_in_bytes
524288000

información relacionada