O Proxmox utiliza volumes LVM do tipo thin-provisioning para os discos das VM’s e LXC’s, ou seja, os blocos são alocados à medida que são escritos. Pegando num exemplo prático, ao criar a VM do HA, a imagem já vem pré-definida com um disco de 32 GB.
Com o passar do tempo vão notar que os 32 GB foram ocupados mas não entendem o porquê pois se forem contabilizar o espaço real utilizado, esse mesmo espaço não chega a esse valor.
Nesta imagem podemos ver que temos apenas 10.9 GB de dados.
Mas o espaço utilizado em disco é de 31.1 GB (97.12% de 32 GB).
O que está a ocupar o espaço?
Tal como referi, os blocos são alocados à medida que há escritas em disco mas os mesmos não são libertados quando se apaga ficheiros. O Linux tem um serviço que vem activo por defeito que se encarrega de libertar esses blocos de semana a semana:
Mas para isto surtir efeito é necessário activar a opção “discard” no disco da VM:
Deste modo os blocos não utilizados serão libertados a cada semana. Este método aplica-se de igual forma para qualquer outra VM Linux ou LXC que tenham a correr.
Tendo um número mais substancial de VM’s e LXC’s a correr, executar o trim uma vez por semana pode ser pouco, especialmente se tiverem overbooking de disco onde há risco de haver paragem por falta de espaço. Desta forma e para prevenir que isso aconteça inesperadamente, escrevi um script que poderá ser colocado na crontab do servidor do proxmox de modo a ser executado todas as noites e forçar o trim.
Correndo em mondo interactivo terão o seguinte:
Neste caso fiz apenas à VM do HA.
E o resultado foi este:
O espaço utilizado foi drasticamente reduzido.
Para que o script funcione, além da flag de discard nos discos das VM’s em causa, é também necessário activar o qemu-agent nas VM’s, pois este agente será responsável por executar os comandos de trim dentro das VM’s e LXC’s através do hypervisor:
Na VM do HA já vem instalado por defeito, basta activar a opção mas noutras VM’s poderá ser necessário instalar o pacote manualmente.
E finalmente poderão colocar o script a ser executado automaticamente pelo crontab da seguinte forma:
Deste modo, o script será executado todos os dias à 1:00 para todas as VM’s e LXC’s que estejam a correr.
Usem mas não abusem do overbooking