Estoy experimentando con LXC usando Btrfs como tienda de respaldo. Btrfs permite realizar instantáneas/deduplicación fácilmente y es ideal para activar varias "pseudo-VM".
El problema que tengo es que algunas de las aplicaciones que pruebo descargan una gran cantidad de datos en el disco. Estoy intentando limitar el uso del volumen Btrfs, así que asigné una cuota al subvolumen creado por LXC para un contenedor específico.
La aplicación tiene una prueba a prueba de fallos: cuando ve menos de una cierta cantidad de espacio libre en el disco en el sistema de archivos en el que escribe (por ejemplo, 512 MB), comienza a borrar los registros antiguos para dejar espacio para los nuevos.
El problema es que, incluso con la cuota aplicada, el sistema de archivos raíz LXC todavía informa el tamaño completo del sistema de archivos host Btrfs.
Ejemplo: si mi sistema de archivos Btrfs tiene 250 GB y creo un contenedor LXC usando las opciones -B btrfs
y -s
, ahora tengo un subvolumen en el sistema de archivos Btrfs que representa la raíz de este nuevo contenedor. Luego quiero limitar el espacio que ocupa el contenedor, por lo que aplico un límite de qgroup de 32 GB al contenedor. Sin embargo, el df
comando, cuando se ejecuta en el contenedor LXC, todavía muestra un tamaño total del sistema de archivos de 250 GB y un espacio libre basado aproximadamente en el espacio libre real del sistema de archivos host; es decir, los límites de cuota no se muestran en df
.
Esto significa que mi aplicación de registro puede llenar toda la cuota y aún creer que tiene más de 200 GB de espacio para escribir, por lo que no recicla sus datos antiguos. Finalmente, se excede la cuota y, gracias a las limitaciones de los sistemas de archivos COW, tengo que deshabilitar la cuota y eliminar manualmente los registros antiguos; si la cuota aún se aplica en el mismo tamaño, no es posible eliminar los datos debido a eso. no habiendo espacio extra para la operación de eliminación.
He leído y comprendido lo suficiente sobre Btrfs para comprender que la idea de "espacio libre" es confusa en Btrfs y puede ser un desafío resolverla, pero ¿hay alguna manera de obtener una cifra "aproximada" desde un LXC? ¿Cuánto espacio de cuota queda? Preferiblemente, esto debería hacerse mediante las API estándar para obtener espacio libre en disco (las que df
usan), ya que esto significa que también se aplicaría a otras aplicaciones que acceden al sistema de archivos y necesitan conocer su espacio libre aproximado.
Si pudiera llegar a, digamos, aproximadamente 1 GB del espacio libre real (según lo dispuesto por la cuota), esto sería suficiente para modificar los parámetros de caducidad del registro para que el sistema de archivos no exceda la cuota.
Respuesta1
Aquí está la mejor herramienta que encontré para manejar la asignación de espacio de subvolumen btrfs: Obtenga el tamaño de sus instantáneas BTRFS | Blog de paquete de veneno
Todos los créditos van a Kyle Agronick (autor de este guión)