smem 报告的“内核动态内存”是什么?

smem 报告的“内核动态内存”是什么?

在诊断我的台式机内存不足问题时(详细信息在U&L)我注意到我的非缓存“内核动态内存”是大的:

# smem -twk
Area                           Used      Cache   Noncache 
firmware/hardware                 0          0          0 
kernel image                      0          0          0 
kernel dynamic memory          1.1G     369.3M     801.7M 
userspace memory               2.0G     133.3M       1.9G 
free memory                  734.1M     734.1M          0 
----------------------------------------------------------
                               3.9G       1.2G       2.7G

在另外两个系统上,我检查了它是 150MiB(也是台式机,但具有 8GiB 或 RAM)和 29MiB。远低于我的台式机的 20%。

我怎样才能找出是什么让它这么大?

顺便说一句:我已经检查过smem来源,它基本上是这样的(memtotal - 用户空间 - 空闲 - 缓存)。

/proc/meminfo:

# 猫 /proc/meminfo
内存总量:4051956 kB
内存空闲:508276 kB
缓冲区:35232 kB
缓存:651052 kB
交换缓存:121380 kB
活跃:1358008 kB
不活动:1351596 kB
活跃(匿名):1184616 kB
不活动(匿名):886904 kB
活动(文件):173392 kB
非活动(文件):464692 kB
不可驱逐:8616 kB
锁定:8616 kB
交换总计:4051952 kB
无隔夜利息:3815780 kB
脏:348 kB
写回:0 kB
匿名页面:1971164 kB
映射:140108 kB
内存:44656 kB
平板:176564 kB
可回收:62080 kB
SUnreclaim:114484 kB
内核堆栈:3352 kB
页表:43012 kB
NFS_不稳定:0 kB
跳动:0 kB
写回Tmp:0 kB
提交限制:6077928 kB
Commited_AS:3681164 kB
Vmalloc总计:34359738367 kB
Vmalloc 使用:139780 kB
VmallocChunk:34359570976 kB
硬件损坏:0 kB
AnonHugePages:448512 kB
HugePages_Total: 0
HugePages_Free:0
HugePages_Rsvd:0
HugePages_Surp:0
大页大小:2048 kB
DirectMap4k:2536128 kB
DirectMap2M:1656832 kB

答案1

看到你的另一篇文章,我猜你正在使用 zram。这就是我的假设。

我有安装 zram 并消耗大量内存的经验,并且我得到了与smem你相同的输出。smem不考虑zram其计数,它仅用于/proc/meminfo计算其值,如果您查看并尝试理解代码,您将看到 zram RAM 占用最终计算在非缓存的栏目内核动态内存线。

进一步调查

根据我的直觉,zram 是造成这种行为的幕后黑手,我设置了一个与您的机器具有相似规格的虚拟机:4 GB RAM 和 2 GB zram 交换,没有交换文件。

我已经向虚拟机加载了重量级应用程序,并得到以下状态:

huygens@ubuntu:~$ smem -wt -K ~/vmlinuz-3.2.0-38-generic.unpacked -R 4096M
Area                           Used      Cache   Noncache 
firmware/hardware            130717          0     130717 
kernel image                  13951          0      13951 
kernel dynamic memory       1063520     922172     141348 
userspace memory            2534684     257136    2277548 
free memory                  451432     451432          0 
----------------------------------------------------------
                            4194304    1630740    2563564 
huygens@ubuntu:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          3954       3528        426          0         79        858
-/+ buffers/cache:       2589       1365
Swap:         1977          0       1977

正如您所看到的,free报告了 858 MB 缓存内存,这似乎也是smem缓存内核动态内存中报告的内容。

然后我进一步强调了使用Chromium浏览器的系统。一开始,仅使用了 83 MB 的交换空间。但在打开了几个选项卡后,交换很快切换到几乎最大,我经历了 OOM!zram它确实有一个危险的一面,如果配置错误(尺寸太大),它会像投石机一样迅速反击你。

当时我有以下输出:

huygens@ubuntu:~$ smem -wt -K ~/vmlinuz-3.2.0-38-generic.unpacked -R 4096M
Area                           Used      Cache   Noncache 
firmware/hardware            130717          0     130717 
kernel image                  13951          0      13951 
kernel dynamic memory       1355344     124072    1231272 
userspace memory             961004      36456     924548 
free memory                 1733288    1733288          0 
----------------------------------------------------------
                            4194304    1893816    2300488 
huygens@ubuntu:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          3954       2256       1698          0          4        132
-/+ buffers/cache:       2118       1835
Swap:         1977       1750        227

看看内核动态内存(列缓存和非缓存)看起来像倒置的吗?这是因为在第一种情况下,内核有“缓存”内存,例如所报告的,free但随后它拥有交换内存,zram该内存smem不知道如何计算(检查 smem 源代码,/proc/meminfo 中未报告 zram 占用) ,这不是通过smem简单的“总内核内存”-“我知道是缓存的 meminfo 报告的内存类型”来计算的,它不知道的是,在计算出的总内核内存中,它添加了交换位于 RAM 中!)

当我处于这种状态时,我激活了硬盘交换并关闭了 zram 交换,并重置了 zram 设备:echo 1 > /sys/block/zram0/reset

之后,非缓存内核内存像夏天的雪一样融化并恢复到“正常”值。

结论

smem不知道zram也许因为它仍然分期因此,其中不/proc/meminfo报告全局参数(例如活动页面大小、总内存),然后仅报告一些特定参数。smem将其中一些特定参数识别为“缓存”,将它们总结起来并将其与总内存进行比较。正因为如此zram已使用的内存被计入非缓存柱子。

注意:顺便说一句,在现代内核中,meminfo还报告消耗的共享内存。smem尚未考虑到这一点,因此即使没有 的zram输出smem也要仔细考虑,特别是。如果您使用大量使用共享内存的应用程序。

使用的参考资料:

答案2

对我来说看起来不错,周围有很多容易回收的内存。到底是什么不起作用(不仅仅是“哦,恐怖,看看<随机程序>给出的数字!”)?程序崩溃(OOM、内存不足、处理程序启动)?程序无法启动?感觉系统反应迟缓?持续的磁盘活动?日志中有什么线索吗?

Linux将要填满所有可用内存,仅仅保留东西比主动擦除它更便宜,并且以后可能会再次使用。一台静止的机器(或刚启动后)将给出与活跃使用的机器截然不同的数字。

相关内容