我正在试图找出一个很好的公式来找出可用的内存量。我目前使用以下公式:freeMem = MemFree + Buffers + Cached - Shmem
。但是,根据这个公式,我的嵌入式系统正在失去记忆。现在我想知道我是否有内存泄漏,所以我在内核中启用了kmemleak
。根据{{1}},mpatrol
和valgrind
,我的用户空间没有任何泄漏。内核空间是否有泄漏或我的配方是否关闭?请注意,我没有任何交换此设备。
coverity
答案 0 :(得分:2)
用户空间泄漏的内存无论如何都不会显示在/proc/meminfo
中,因为就内核而言,它是内存分配的(无论你是否在userland应用程序中使用free(),它都要么分配给mmap()syscall或brk()/ sbrk()和内核跟踪在userland中分配的页面,否则我们将遇到严重的麻烦;)。
我不清楚你是怎么想出你的记忆泄露的?如果你还没有阅读它,那么这是一个很好的链接redhat/meminfo,它解释了每个统计数据的真正含义。
答案 1 :(得分:2)
您的“可用内存”计算缺少一件事 - 它应该将SReclaimable
(对于可回收的slab缓存)添加到有效释放的内存中。
如果这不会随着时间的推移而改变有效释放内存的缓慢减少,则应定期拍摄/proc/meminfo
的快照,并确定哪一行显示增加。
如果SUnreclaim
行正在增加,您可以查看/proc/slabinfo
以查看内核slab的使用情况并找出罪魁祸首。它可能只是你正在观察的内存碎片,它最终会在更长的时间内稳定下来。
答案 2 :(得分:0)
同意使用auxv - 使用/ proc / meminfo可能不是跟踪用户进程内存的最佳方式,因为它包含所有用户进程分配的内存,因此很难缩小进程的消耗范围。
跟踪进程消耗的总内存的更好方法是使用top (1)
并查看VIRT(包括内存换出)或RES(仅包括物理内存)。
但是如果你想使用/ proc / meminfo,那么我将使用的公式是:
MemTotal = MemFree + Cached + Buffers + SwapCached
...请注意,这只会考虑数据,而不是代码。 MemTotal的大部分 - (等式右边的数量)应该是你的核心图像。
答案 3 :(得分:0)
对于我的系统,我使用以下命令检查消耗了多少内存:
ps aux | awk '{sum +=$4}'
这会为当前正在运行的所有进程添加已用内存的总百分比。
答案 4 :(得分:0)
FreeMem = MemFree + Buffers + Cached - Mapped,缓存内存包含映射部分,此部分已映射到用户空间。
答案 5 :(得分:0)
以前它是MemFree + catched(多年前这是正确的)。
现在是MemFree + Active(文件)+ Inactive(文件)+ SRreclaimable。
如需进一步参考,请通过LINUX TORVALD下面的链接。