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
MemFreeeActive(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