MemAvailable
está incluído em /proc/meminfo
desde a versão 3.14 do kernel; foi adicionado por commit 34e431b0a . Esse é o fator determinante nas variações de saída que você mostra. A mensagem de confirmação indica como estimar a memória disponível sem MemAvailable
:
Currently, the amount of memory that is available for a new workload, without pushing the system into swap, can be estimated from
MemFree
,Active(file)
,Inactive(file)
, andSReclaimable
, as well as the "low" watermarks from/proc/zoneinfo
.
As marcas d'água baixas são o nível abaixo do qual o sistema irá trocar. Portanto, na ausência de MemAvailable
, você pode pelo menos adicionar os valores fornecidos para MemFree
, Active(file)
, Inactive(file)
e SReclaimable
(o que estiver presente em /proc/meminfo
) e subtrair as marcas d'água baixas de% código%. Este último também lista o número de páginas livres por zona, que podem ser úteis como comparação ...
O algoritmo completo é fornecido no patch para /proc/zoneinfo
e parece razoavelmente fácil de adaptar:
- soma as marcas d'água baixas em todas as zonas;
- pegue a memória livre identificada (
meminfo.c
); - subtraia a marca d'água baixa (precisamos evitar tocar nisso para evitar a troca);
- adicione a quantidade de memória que podemos usar do cache de páginas (soma de
MemFree
eActive(file)
): essa é a quantidade de memória usada pelo cache de páginas, menos metade do cache de páginas ou a marca d'água baixa, o que for menor; - adicione a quantidade de memória que podemos recuperar (
Inactive(file)
), seguindo o mesmo algoritmo.
Então, colocando tudo isso junto, você pode obter a memória disponível para um novo processo com:
awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') \
'{a[$1]=$2}
END{
print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low);
}' /proc/meminfo