监视所有内存使用情况的一般方法

Tor*_*rge 6 memory-usage zfs free

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

正如你在superuser 上看到的那样,我只是花了很长的路来追踪我的记忆消失的地方。

原来是 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 
Run Code Online (Sandbox Code Playgroud)

所以使用了 19GB。但是 TOP 只向我展示了大约 8GB 的​​已用内存。所以我去寻找其他的 11GB。6GB原来是板坯,其中可以看到/proc/memstat,用nmon。但是仍然缺少 5GB。

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

无论是/proc/memstat也不是tophtopnmonfree,或者atop可以告诉我使用这些5GB是谁。

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

从我的角度来看,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
  ...
Run Code Online (Sandbox Code Playgroud)

你知道,每个小节实际上加起来是它的父节,每个字节的内存都被计算在内;)

那么在Linux下可以使用这样的工具吗?它已经存在了吗?

更新 1

下面建议的工具 smem 确实显示了一个列“动态内核内存”,它总计为 100% 的内存并占 ARC。 但是根据这个答案

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

因此,这只能通过简单地从 /proc/memstat 中减去所有已知数字并将缺少的内容标记为“非缓存动态内核内存”来实现,我发现这令人不安,并且真的希望 linux 内核能够提供更多功能。

Eld*_*eek 8

您可以尝试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.
Run Code Online (Sandbox Code Playgroud)

系统范围

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 
Run Code Online (Sandbox Code Playgroud)

按用户

me@zippy-64bit:~$ smem -tu
User     Count     Swap      USS      PSS      RSS 
me          67        0   861452   898915  1245592 
---------------------------------------------------
            67        0   861452   898915  1245592
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是smemcap为未来的分析数据的采集smemsmemstat该报告的物理内存使用情况考虑到共享内存中。该工具可以报告内存使用情况的当前快照或定期转储内存中的任何更改。

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

资料来源:

备选方案 1:您也可以考虑cat /proc/meminfo按页面解析或如果您想要它的输出less /proc/meminfo

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

$ cat /proc/meminfo | grep "Slab"
Slab:             267680 kB
Run Code Online (Sandbox Code Playgroud)

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

备选方案 2:如果您真的致力于更好地解析内核 RAM,您可能会推出自己的 kstat。虽然kstat似乎是 Solaris 唯一的命令。上面的链接将带您到kstat2013 年最后一次修改的开源尝试的源代码(截至本次编辑)。聪明的 C 程序员可能能够为他们的特定目的修改代码。

替代 2来源: