Aqui está um script Perl que estima MemAvailable para versões do kernel anteriores a 3.14:
Ele replica os mesmos cálculos feitos no kernel, mas usando apenas informações disponíveis para o espaço do usuário em kernels pré-3.14.
Vários recursos ao redor da rede (desculpas por não ter links à mão) recomendam determinar a quantidade total de memória física disponível em um sistema Linux pelo segundo valor na linha "- / + buffers / cache" na saída de free
, com a explicação de que os buffers e o cache podem ser descartados imediatamente se um processo tentar alocar mais memória do que o não utilizado no momento (linha "Mem:" de free
). Descobri que esta afirmação é consistentemente empiricamente errada, significando que a alocação de mais memória do que "não utilizada" falha com freqüência.
Pesquisando sobre isso, encontrei a linha "MemAvailable:" em /proc/meminfo
e esta explicação :
Subject: provide estimated available memory in /proc/meminfo
Many load balancing and workload placing programs check /proc/meminfo
to estimate how much free memory is available. They generally do this
by adding up "free" and "cached", which was fine ten years ago, but
is pretty much guaranteed to be wrong today.
It is wrong because Cached includes memory that is not freeable as
page cache, for example shared memory segments, tmpfs, and ramfs,
and it does not include reclaimable slab memory, which can take up
a large fraction of system memory on mostly idle systems with lots
of files.
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), and SReclaimable, as well as the "low"
watermarks from /proc/zoneinfo.
Meu problema é que o sistema disponível para rodar meus programas tem um kernel 3.2.0 que aparentemente não fornece "MemAvailable".
Minha pergunta: Como eu posso (aproximadamente) calcular a quantidade de memória física disponível, usando as informações de memória que estão disponíveis para mim?
MemTotal: 16536344 kB
MemFree: 8615224 kB
Buffers: 241896 kB
Cached: 1341944 kB
SwapCached: 100232 kB
Active: 5320768 kB
Inactive: 2021312 kB
Active(anon): 4298508 kB
Inactive(anon): 1483164 kB
Active(file): 1022260 kB
Inactive(file): 538148 kB
Unevictable: 32 kB
Mlocked: 32 kB
SwapTotal: 9918460 kB
SwapFree: 7730432 kB
Dirty: 56 kB
Writeback: 0 kB
AnonPages: 5720696 kB
Mapped: 103628 kB
Shmem: 23432 kB
Slab: 432516 kB
SReclaimable: 356780 kB
SUnreclaim: 75736 kB
KernelStack: 7320 kB
PageTables: 69764 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 18186632 kB
Committed_AS: 12325296 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 120924 kB
VmallocChunk: 34351227352 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 103240 kB
DirectMap2M: 16738304 kB
PS: Eu percebo que a computação real é detalhada no patch do kernel ao qual me vinculei, mas estou tendo dificuldades em relacionar isso com a saída que está disponível para mim.
Aqui está um script Perl que estima MemAvailable para versões do kernel anteriores a 3.14:
Ele replica os mesmos cálculos feitos no kernel, mas usando apenas informações disponíveis para o espaço do usuário em kernels pré-3.14.