OpenVZ & Memória
O failcnt
está aumentando em privvmpages
, portanto, seu contêiner não pode alocar mais espaço de memória virtual do host:
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
privvmpages 6005601 6291447 6291456 6291456 >233<
physpages 4635460 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529376 2144671 6291456 9223372036854775807 0
Observe que memória virtual ! = memória física. Processos podem alocar até algo em torno da quantidade endereçável de memória virtual (32bit ~ 2G - 4G, 64bit 8 TB - 256 TB), mas isso não significa que páginas de memória física estão sendo usadas (uma página sendo um pedaço de memória de 4KB).
physpages
é o número de páginas de memória física que seu contêiner pode usar.
oomguarpages
são as páginas de memória garantida que o contêiner receberá quando o host estiver com memória restrita.
privvmpages
é o número de páginas de memória virtual que seu contêiner pode usar. vmguarpages
é a quantidade garantida de memória virtual da mesma maneira
Java
O Oracle Java alocará sempre um pedaço contíguo de memória virtual. Executar java
sem argumentos em uma caixa resulta em 5M de memória real usada ( RSS
), mas 660M de espaço VM alocado ( VSZ
):
PID COMMAND VSZ RSS
20816 java 667496 4912
Observando os segmentos de memória do processo java
em smaps
arquivo mostra um pedaço de cerca de 500MB alocados, o resto é arquivos mapeados na memória e coisas normais do java.
Em um sistema que está ativo há algum tempo, o espaço da VM disponível se torna fragmentado à medida que os processos usam / partes livres dele. Um grep Vmalloc /proc/meminfo
lhe dará VmallocChunk
, que é o maior pedaço livre disponível atualmente. Se isso for baixo, o sistema tentará alocar mais quando java
solicitar, afinal é praticamente ilimitado em uma caixa de 64 bits.
Corrigir
Informe seu host para configurar privvmpages
e vmguarpages
muito mais alto. Não é necessário que eles sejam iguais à memória física, pois isso afeta a forma como a memória do linux funciona
Você pode resolver o problema temporariamente descartando o cache de arquivos echo 1 > /proc/sys/vm/drop_caches
, mas isso é apenas temporário.
Você pode limitar o bloco de memória java
tenta alocar em tempo de execução com um mínimo Xms
ou durante a execução com o máximo Xmx
. Executando java
com essas opções na minha máquina:
java -Xms10M -Xmx10M
reduz o tamanho virtual total para 140 MB ou mais com apenas um pedaço contíguo de 10 MB para o heap java alocado.