我在管理的 proxmox 7 节点上遇到了内存不足的问题。在阅读有关类似问题的文章时,我被引导到 linuxatemyram.com,阅读此页面后,我开始监控“可用”内存而不是“已用”内存。但问题仍然存在(可用内存随着正常运行时间而减少)。
然后我发现我可以通过发出命令来强制释放Linux缓存echo 3 > /proc/sys/vm/drop_caches
。我期望看到“已用”内存变为可用,但我没想到“可用”内存会增加,因为据我所知,可用内存也被视为已使用,因为它被Linux用于缓存。
但是 drop_caches 之后“可用”内存增加了,如下所示:
root@proxmox13:~$ free -h
total used free shared buff/cache available
Mem: 31Gi 29Gi 1.1Gi 67Mi 258Mi 977Mi
Swap: 0B 0B 0B
root@proxmox13:~$ echo 2 > /proc/sys/vm/drop_caches
root@proxmox13:~$ free -h
total used free shared buff/cache available
Mem: 31Gi 26Gi 4.1Gi 67Mi 205Mi 3.9Gi
Swap: 0B 0B 0B
为什么会增加?如果释放的内存用于缓存,为什么以前不认为可用?
感谢您的帮助。
答案1
从高层次来看,可用即免费加缓存和其他易于回收的东西,以方便人类。https://www.linuxatemyram.com/尝试使用可用的计数器来解释发生了什么。对于排除空闲的各种缓存,还存在其他计数器。
事实上,Linux VMM 非常复杂且混乱。很少能通过简单的核算准确计算出内存使用量。我认为/proc/meminfo 中缓存的意思是页面缓存但你也放弃了dentry 和 inode。因此,free 中的 buff/cache 并没有发生很大变化。如果您需要详细研究内核对象,请尝试使用 slabtop。
从容量规划角度来看,32 GB 中可用的 1 GB 并不多。考虑减少每个 VM 主机的客户机数量,或增加物理内存。
不要使用/proc/sys/vm/drop_caches
可能会因删除缓存和从磁盘重新读取数据而损害性能的选项。这适用于冷存储性能测试,因为人们懒得重新启动主机。
说到重启,程序不必泄漏内存即可缓慢减少可用内存。VM 主机和内部客户机可能正在运行数千个任务,其中一些任务保持运行并保留各种内存分配。您应该每隔几个月重新启动一次以进行软件更新,因此只要“泄漏”缓慢,可能就不值得详细调查。
提高你的内存监控能力,也可以看看压力失速信息。我真正关心的指标是任务是否由于内存不足而停滞,PSI 会跟踪这一点。