繁体   English   中英

Linux总可用内存

[英]Linux total available memory

我正试图找出一个很好的公式来找出可用的内存量。 我目前使用以下公式: freeMem = MemFree + Buffers + Cached - Shmem 但是,根据这个公式,我的嵌入式系统正在失去记忆。 现在我想知道我是否有内存泄漏所以我在内核中启用了kmemleak 根据mpatrolvalgrindcoverity我在用户空间没有任何泄漏。 内核空间是否有泄漏或我的配方是否关闭? 请注意,我没有任何交换此设备。

MYBOX> cat /proc/meminfo
MemTotal:        2073348 kB
MemFree:         1388180 kB
Buffers:          137016 kB
Cached:            88772 kB
SwapCached:            0 kB
Active:           589124 kB
Inactive:          44380 kB
Active(anon):     410236 kB
Inactive(anon):     1992 kB
Active(file):     178888 kB
Inactive(file):    42388 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:       1310716 kB
HighFree:         811828 kB
LowTotal:         762632 kB
LowFree:          576352 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                64 kB
Writeback:             0 kB
AnonPages:        407712 kB
Mapped:            26140 kB
Shmem:              4516 kB
Slab:              40408 kB
SReclaimable:       8320 kB
SUnreclaim:        32088 kB
KernelStack:        1480 kB
PageTables:         1464 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1036672 kB
Committed_AS:     660508 kB
VmallocTotal:     237344 kB
VmallocUsed:      104556 kB
VmallocChunk:     126296 kB

来自userland的内存泄漏无论如何都不会显示在/proc/meminfo因为就内核而言,它是内存分配的(无论你是否在userland app中使用free(),它都是用mmap()系统调用分配的或brk()/ sbrk()和内核跟踪在userland中分配的页面,否则我们将遇到严重的麻烦;)。

我不清楚你是怎么想出你的记忆泄露的? 这里有一个很好的链接redhat / meminfo如果你还没有读过它,它解释了每个统计数据的真正含义。

你的“空闲内存”计算缺少一件事 - 应该将SReclaimable (用于可回收的slab缓存)添加到有效释放的内存中。

如果这不会随着时间的推移而改变有效释放内存的缓慢减少,则应定期拍摄/proc/meminfo快照,并确定哪一行显示增加。

如果正在增加的SUnreclaim行,你可以查看/proc/slabinfo来查看你的内核slab用法并找出罪魁祸首。 它可能只是您正在观察的内存碎片,它最终会在更长的时间内稳定下来。

对于我的系统,我使用以下命令检查消耗了多少内存:

ps aux | awk '{sum +=$4}'

这会为当前正在运行的所有进程添加已用内存的总百分比。

FreeMem = MemFree + Buffers + Cached - Mapped,缓存内存包含映射部分,此部分已映射到用户空间。

以前它是MemFree + catched(多年前这是正确的)。

现在它是MemFree + Active(文件)+ Inactive(文件)+ SRreclaimable。

如需进一步参考,请通过LINUX TORVALD下面的链接。

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

同意auxv - 使用/ proc / meminfo可能不是跟踪用户进程内存的最佳方式,因为它包括由所有用户进程分配的内存,因此很难缩小进程的消耗。

跟踪进程消耗的总内存的更好方法是使用top (1)并查看VIRT(包括内存换出)或RES(仅包括物理内存)。

但是如果你想使用/ proc / meminfo,那么我将使用的公式是:

MemTotal = MemFree + Cached + Buffers + SwapCached

...请注意,这只会考虑数据,而不是代码。 MemTotal的大部分 - (等式右边的数量)应该是你的核心图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM