我有 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 top
。htop
nmon
free
atop
是否有一个文件/工具可以查看此类使用的内存特别的模块,而无需了解/理解这些模块?或者,如果我想编写一个可以告诉我这一点的监控工具,我是否必须考虑每个现有模块?
从我的角度来看,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
这里的大部分信息由free
、top
和ps
命令使用。实际上,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来源: