Estou experimentando o LXC usando o Btrfs como loja de apoio. O Btrfs permite fácil captura/desduplicação e é ideal para ativar várias "pseudo-VMs".
O problema que estou tendo é que alguns dos aplicativos que testei despejam muitos dados no disco. Estou tentando limitar o uso do volume Btrfs, então atribuí uma cota ao subvolume criado pelo LXC para um contêiner específico.
O aplicativo possui um teste à prova de falhas - quando vê menos do que uma certa quantidade de espaço livre em disco no sistema de arquivos em que grava (por exemplo, 512 MB), ele começa a limpar logs antigos para abrir espaço para novos.
O problema é que, mesmo com a cota aplicada, o sistema de arquivos raiz LXC ainda informa o tamanho total do sistema de arquivos host Btrfs.
Exemplo: se meu sistema de arquivos Btrfs tiver 250 GB e eu criar um contêiner LXC usando as opções -B btrfs
e -s
, agora tenho um subvolume no sistema de arquivos Btrfs representando a raiz desse novo contêiner. Quero então limitar o espaço ocupado pelo contêiner, então aplico um limite de qgroup de 32 GB ao contêiner. No entanto, o df
comando, quando executado no contêiner LXC, ainda mostra um tamanho total do sistema de arquivos de 250 GB e um espaço livre baseado aproximadamente no espaço livre real do sistema de arquivos host; ou seja, os limites de cota não são exibidos para df
.
Isso significa que meu aplicativo de log pode preencher toda a cota e ainda acreditar que tem mais de 200 GB de espaço para gravação, portanto, não recicla seus dados antigos. Eventualmente, a cota é excedida e, graças às limitações dos sistemas de arquivos COW, tenho que desabilitar a cota e excluir manualmente os logs antigos - se a cota ainda for aplicada no mesmo tamanho, não será possível excluir os dados devido a isso não havendo espaço extra para a operação de exclusão.
Eu li e entendi o suficiente sobre o Btrfs para entender que a ideia de "espaço livre" é confusa no Btrfs e pode ser um desafio para resolver, mas existe alguma maneira de obter um valor "estimado" de dentro de um LXC de quanto espaço de cota resta? De preferência, isso deve ser feito pelas APIs padrão para obtenção de espaço livre em disco (aquelas que df
utiliza), pois isso significa que também se aplicaria a outros aplicativos que acessam o sistema de arquivos e precisam saber seu espaço livre aproximado.
Se eu pudesse chegar a, digamos, 1 GB ou mais do espaço livre real (conforme fornecido pela cota), isso seria suficiente para ajustar os parâmetros de expiração do log para que o sistema de arquivos não excedesse a cota.
Responder1
Aqui está a melhor ferramenta que encontrei para lidar com a alocação de espaço de subvolume btrfs: Obtenha o tamanho dos seus instantâneos BTRFS | Blog do Pacote Venenoso
Todos os créditos vão para Kyle Agronick (autor deste roteiro)