当我
cat /proc/meminfo
时,报告如下:
MemTotal: 2034284 kB
MemFree: 1432728 kB
Buffers: 16568 kB
Cached: 324864 kB
SwapCached: 0 kB
Active: 307344 kB
Inactive: 256916 kB
Active(anon): 223020 kB
Inactive(anon): 74372 kB
Active(file): 84324 kB
Inactive(file): 182544 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 1152648 kB
HighFree: 600104 kB
LowTotal: 881636 kB
LowFree: 832624 kB
SwapTotal: 4200960 kB
SwapFree: 4200960 kB
Dirty: 60 kB
Writeback: 0 kB
AnonPages: 222868 kB
Mapped: 80596 kB
Shmem: 74564 kB
Slab: 24268 kB
SReclaimable: 14024 kB
SUnreclaim: 10244 kB
KernelStack: 1672 kB
PageTables: 2112 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 5218100 kB
Committed_AS: 833352 kB
VmallocTotal: 122880 kB
VmallocUsed: 13916 kB
VmallocChunk: 50540 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 4096 kB
DirectMap4k: 20472 kB
DirectMap4M: 888832 kB
我得到了一个计算 Memtotal 的公式:
Memtotal = MemFree + 缓存 + 活动 + 非活动 + 映射 + Shmem + Slab +页表+ VmallocUsed
但是我不知道这个公式是否正确,有谁可以帮忙澄清一下吗?
我认为很难从 meminfo 获得准确的值(基于加法的总内存验证)。 尽管如此,在我看来,以下内容应该会让您接近 TotalMemory 的数字。
总内存 = MemFree + 缓冲区 + 缓存 + 脏 + AnonPages + Slab + VmAllocUsed
在您的示例中 1432728 + 16568 + 324864 + 60 + 222868 + 24268 + 13916 = 2035272 一些参考: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=HEAD#l451 (来自上面建议的另一篇 stackoverflow 文章) 除此之外,我认为波动是由于 VmAlocUsed 造成的。
这个 Perl 脚本基于 @anugraha 的答案。它会尝试求和。
perl -ne '@a=split; $n=$a[1]; if (/MemTotal/) {$t=$n} elsif (/(MemFree|Buffers|Cached|Dirty|AnonPages|Slab|VmallocUsed|HugePages_Total):/) { @a=split;$n=$a[1];if (/HugePages/){$n*=1024*1024}; $s += $n;} END { $missing=$t-$s; print "MemTotal $t KiB\nSum $s KiB\nMissing $missing KiB\n";}' /proc/meminfo
它也会显示丢失的记忆。
样品:
MemTotal 65303264 KiB
Sum 63881072 KiB
Missing 1422192 KiB