在诊断我的台式机内存不足问题时(详细信息在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将要填满所有可用内存,仅仅保留东西比主动擦除它更便宜,并且以后可能会再次使用。一台静止的机器(或刚启动后)将给出与活跃使用的机器截然不同的数字。