Aplicação BeerStore para várias demonstrações.
A aplicação serve para várias demonstrações, uma delas é para mostrar como a aplicação se comporta em relação a memória em um container.
Para simularmos um servidor com qualquer quantidade de memória, usaremos o Vagrant. Acesse o diretório virtual-machine execute o comando abaixo:
vagrant up
Ele irá iniciar uma máquina virtual centos/7 e executará o ansible para instalar o Docker.
Para acessar a máquina virtual via ssh, execute o comando abaixo no mesmo diretório:
vagrant ssh
Se precisar fazer alguma alteração e queira fazer um novo build da imagem, use o comando abaixo:
docker build -t normandesjr/beerstore:memorydemo .
Assim é possível exportar a imagem para uso na VM, para isso utilize o comando abaixo:
docker image save -o virtual-machine/beerstore.tar.gz normandesjr/beerstore:memorydemo
Então dentro da VM, é possível carregá-la:
docker image load -i /vagrant/beerstore.tar.gz
docker run -p 8080:8080 -m 150M --memory-swap 300M --rm normandesjr/beerstore:memorydemo
Repare no Prometheus que a aplicação (http://localhost:8080/beers/load) aloca uns 250MB de memória, mas como?
Como temos 300M pro container (memória + swap), tudo bem, deu certo! Conseguimos executar e provisionar um tanto bom de cerveja!
Mas ficamos com medo, e tentaremos aumentar a memória da máquina e do container, será que resolve?
Para isso, provisionaremos uma máquina virtual com mais memória, 8GB e colocaremos o container com 600M.
Altere o Vagrantfile para suportar 8192MB (8GB), reprovisione a VM e suba o container com 600M de memória.
docker run -p 8080:8080 -m 600M --memory-swap 800M -d normandesjr/beerstore:memorydemo
Tente carregar cervejas agora (http://localhost:8080/beers/load)
Nem conseguiremos, a aplicação já recebe um kill do container
docker inspect <container id ou nome> | grep -i oom
"OOMKilled": true,
Agora a JVM tentará alocar por volta de 2GB de memória, mas só tem 800M disponível!
Para passar parâmetro pra JVM, use -e JAVA_OPTIONS='-Xmx300m'
Usamos o Prometheus para monitorar a JVM. Para iniciar, execute o comando abaixo:
docker run --rm -v ~/dev/beerstore/prometheus.yml:/etc/prometheus/prometheus.yml --network host --name prometheus prom/prometheus
E adicione as seguintes queries:
sum (jvm_memory_max_bytes{area="heap"} / 1000 / 1000)
sum (jvm_memory_committed_bytes{area="heap"} / 1000 / 1000)