监控所有内存使用情况的通用方法

监控所有内存使用情况的通用方法

我有 Kubuntu 16.04 并且正在使用 ZFS。

正如你所看到的超级用户我刚刚经历了一段漫长的旅程,寻找我的记忆消失到了哪里。

原来是 ZFS 的 ARC 把它吃掉了,除了它自己的特殊文件之外,没有在工具/文件中的任何地方显示出来/proc/spl/kstat/zfs/arcstats

是否有一种通用的方法来查看内核使用了多少内存,以及如果可能的话,哪些内核模块使用了内存?

例子:

free -h 向我展示了以下内容:

              total        used        free      shared  buff/cache   available                                           
Mem:            31G         19G        1.8G        406M         10G        5.2G                                           
Swap:          8.0G          0B        8.0G 

因此使用了 19GB。但 TOP 只显示使用了大约 8GB 的​​内存。所以我开始寻找其他 11GB。6GB 原来是 slab,可以在/proc/memstat和 中看到nmon。但仍有 5GB 丢失。

最后我发现它已被 ZFS 的 ARC 所消耗。但它只在其自己的特殊信息文件中列出。/proc/spl/kstat/zfs/arcstats

/proc/memstat、、、、或都无法告诉我谁在使用这 5GB tophtopnmonfreeatop

是否有一个文件/工具可以查看此类使用的内存特别的模块,而无需了解/理解这些模块?或者,如果我想编写一个可以告诉我这一点的监控工具,我是否必须考虑每个现有模块?

从我的角度来看,Linux 下的内存信息一团糟。数十个数字加起来都不等于总内存。我敢打赌,free计算“使用中”参数是通过从总数中减去空闲/缓存/缓冲区来计算的。

我希望有/写一个工具/信息,让我可以看到

Total memory: 32GB
  in use: 19GB
    processes: 8GB
    slab: 5GB
    mapper: 1Gb
    kernel modules: 5Gb
       kernel: 0.3GB
       spl: 4.7GB
  cache: 6GB
  buffers: 2GB
  free: 5GB
Additional stats:
  Active memory: 8.3GB
    Active(anon): 7.1GB
    Active(file): 1.2GB
  Inactive memory: 2.4GB
  ...

您知道,每个子部分实际上都加到了其父部分,并且每个字节的内存都被考虑在内;)

那么,Linux 下是否可能存在这样的工具?它已经存在了吗?

更新 1

如下所示的工具 smem 确实显示了一个“动态内核内存”列,该列总计占内存的 100%,并占 ARC。 然而根据这个答案

顺便说一句:我已经检查了 smem 源,它基本上是(memtotal - 用户空间 - 可用 - 缓存)。

因此,这只能通过从 /proc/memstat 中减去所有已知数字并标记什么是来实现的丢失的作为“非缓存动态内核内存”,我发现这令人不安,并真的希望 Linux 内核能够提供更多功能。

答案1

smem至少可以尝试寻找大部分您想要的东西。

它在 Universe 存储库中可用,可以使用sudo apt-get install smem

手册页中介绍了许多有用的开关man smem

一些示例如下:注意,为了简洁起见,我在所有示例中都使用 -t 开关来表示总数。如果您想要更详细的输出,可以将其省略。

PSS is the interesting column in these examples as it takes shared memory into account.
Unlike RSS it's meaningful to add it up.

系统范围

me@zippy-64bit:~$ smem -tw
Area                           Used      Cache   Noncache 
firmware/hardware                 0          0          0 
kernel image                      0          0          0 
kernel dynamic memory        989656     860076     129580 
userspace memory             936032     180020     756012 
free memory                 5692716    5692716          0 
----------------------------------------------------------
                            7618404    6732812     885592 

按用户

me@zippy-64bit:~$ smem -tu
User     Count     Swap      USS      PSS      RSS 
me          67        0   861452   898915  1245592 
---------------------------------------------------
            67        0   861452   898915  1245592

另外值得注意的是微胶囊用于捕获数据以供将来smem分析斯美司他报告考虑共享内存的物理内存使用情况。该工具可以报告内存使用情况的当前快照,也可以定期转储内存中的任何更改。

页面底部还有一个列表类似的包。

资料来源:

方案一:您可能还考虑解析输出,cat /proc/meminfo或者如果您希望按页面less /proc/meminfo

这里的大部分信息由freetopps命令使用。实际上,free 命令的输出在外观上与 /proc/meminfo 的内容和结构相似。但通过直接查看 /proc/meminfo,可以发现更多细节,包括:

$ cat /proc/meminfo | grep "Slab"
Slab:             267680 kB

替代来源:https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-proc-topfiles.html

方案 2:如果你真的致力于更好地解析内核 RAM,你可能会滚动你自己的 kstat。虽然kstat这似乎是 Solaris 独有的命令,但上面的链接将带您进入一个开源尝试的来源,kstat该尝试最后一次修改是在 2013 年(截至本次编辑时)。聪明的 C 程序员可能能够根据他们的特定目的修改代码。

方案 2来源:

相关内容