Por que os buffers são iguais à memória usada?

5

Estou usando o Ubuntu 11.10, virtualizado pelo OpenVZ. Essa saída de free -m mostra que os buffers são sempre iguais aos usados.

             total       used       free     shared    buffers     cached
Mem:          2048       1079        968          0          0          0
-/+ buffers/cache:       1079        968
Swap:            0          0          0

Essa é a razão pela qual não posso executar uma máquina virtual java, embora haja 968 mb de memória livre?

    
por Moshe Revah 29.12.2012 / 17:54

2 respostas

4

É devido ao OpenVZ. Você pode ver os limites aplicados em /proc/user_beancounters , e há alguma explicação aqui: link

Embora eu não tenha tido problemas de memória em um contêiner, acho que a sugestão é a seguinte:

link

para começar, definir o tamanho da pilha com ulimit é bom. Apenas observe que a implicação de que o OpenVZ usa a mesma métrica encontrada na coluna VIRT do topo está errada; o "privvmpages" é que acredito que as páginas virtuais marcadas como graváveis e privadas , são significativamente menores do que todo o espaço de endereçamento de um processo. Há alguma outra desinformação lá também ("Infelizmente ficar sem memória é uma condição de erro que a maioria dos programas não consegue manipular corretamente". - no linux, ficar sem memória é por padrão não um erro condição, portanto, os programas não têm a chance de manipulá-lo corretamente). Mas, provavelmente, vale a pena tentar definir o tamanho da pilha.

A sugestão de Slm parece ser uma boa solução para encontrar os gatos gordos, mas se a sua fatia é como a minha, não há /proc/bc para trabalhar. Você pode, no entanto, obter a estatística gravável e privada de um processo por meio de pmap -d , ou examinar números na parte superior.

1 gig pode parecer o suficiente para executar uma JVM, mas há uma complicação: já que a quantidade de memória usada e disponível não é uma figura simples (veja algumas discussões sobre por que aqui ), o total pode ser maior do que a máquina pode realmente fornecer em um determinado momento.

    
por 29.12.2012 / 19:07
1

Eu faço assim com uma função bash.

vzr_mb () 
{ 
    ( printf "vm feature held(MB) maxheld(MB) barrier(MB) limit(MB) failcnt\n";
    grep privvm /proc/bc/1*/resources | awk '{sub($3,$3*4096/2^20) sub($4,$4*4096/2^20) sub($5,$5*4096/2^20) sub($6,$6*4096/2^20)}1' ) | column -t
}

A execução é assim:

% vzr_mb
vm                       feature      held(MB)  maxheld(MB)  barrier(MB)  limit(MB)  failcnt
/proc/bc/101/resources:  privvmpages  184.422   300.129      300          310        2
/proc/bc/102/resources:  privvmpages  473.703   861.078      900          950        13
/proc/bc/103/resources:  privvmpages  184.457   579.941      300          350        238
/proc/bc/104/resources:  privvmpages  307.961   700.473      400          450        70
/proc/bc/105/resources:  privvmpages  477.828   773.586      700          750        1730347
/proc/bc/106/resources:  privvmpages  637.801   981.281      1000         1050       511
/proc/bc/108/resources:  privvmpages  167.777   580.102      285          295        1
/proc/bc/109/resources:  privvmpages  202.055   308.969      395          425        0
/proc/bc/110/resources:  privvmpages  212.492   625.324      295          325        326
/proc/bc/111/resources:  privvmpages  189.539   535.492      295          325        5
/proc/bc/112/resources:  privvmpages  239.617   407.766      468.75       488.281    0
/proc/bc/180/resources:  privvmpages  195.605   601.602      200          225        3049321
/proc/bc/181/resources:  privvmpages  967.027   1304.82      1500         2000       3
/proc/bc/183/resources:  privvmpages  0         1087.72      1115         1150       0
    
por 29.12.2012 / 18:28