As versões do Amazon Linux usam o mapeador de dispositivos como o driver de armazenamento do Docker. O mapeador de dispositivos usa dispositivos de bloco de cópia em gravação em camadas nos contêineres. Quando não há dados gravados, dificilmente usa espaços em disco. À medida que as páginas do sistema de arquivos são gravadas, elas alocam dados do mapeador de dispositivos e começam a usar o espaço em disco.
O tamanho padrão do disco para o mapeador de dispositivos é de 10 GB, portanto, ao executar 6 imagens, talvez seja necessário 60 GB se todas as páginas estiverem sendo gravadas. É improvável que todas as páginas estejam sendo gravadas, mas a instância padrão do EC2 tem apenas 8 GB, o que não é suficiente.
Quando um arquivo é escrito, ele é gravado em vários blocos. Se os blocos ainda não tiverem sido escritos, eles serão alocados no pool de dispositivos. Quando o arquivo é removido, o bloco é marcado como não utilizado no sistema de arquivos, mas o pool não o conhece. Somente quando o fstrim é executado, o sistema de arquivos libera as páginas do gerenciador de dispositivos.
O NGINX mantém um cache em / tmp / cache e é constantemente gravado em. Se o sistema de arquivos continuar usando blocos diferentes, ele continuará alocando blocos até que todos os 10GB sejam mapeados para o gerenciador de dispositivos. Existem várias soluções para este problema:
- Use um dispositivo de mapeamento de dispositivo que seja grande o suficiente para caber em todos os blocos.
- Use um tamanho base menor (pesquise por dm.basesize) para garantir que as imagens não alcancem 10 GB.
- Mude para uma distribuição que usa o armazenamento AUFS.
Você também pode executar fstrim regularmente para garantir que os blocos liberados sejam retornados ao pool. Isso pode ser complicado, porque durante o pico de carga ele pode não ser executado com freqüência suficiente e o pool ainda pode ficar sem espaço em disco.