在我们的一台 Debian 服务器上对 LVM 进行压力测试时,我遇到了这个问题:内存会填满很多,以至于服务器内存不足,但没有进程会认领内存。请参阅https://i.stack.imgur.com/ismcH.png,然后看到https://serverfault.com/a/449102/125894了解 htop 中使用的颜色。
为什么会出现这种情况?
有没有办法查看进程是使用内存?
Htop 配置为不隐藏任何进程,那么 htop 缺少什么?
在这个特定情况下,我可以肯定地说,它直接或间接地由 lvmcreate、lvmremove 或 dmsetup 引起,因为我正在对其进行压力测试。请注意,这个问题不是要解决 LVM 问题,而是要解决为什么没有任何进程声明内存。停止所有 LVM 命令确实会使内存回到 <600MB。
输出free -m
:
total used free shared buffers cached
Mem: 32153 31958 194 0 52 3830
-/+ buffers/cache: 28075 4077
Swap: 975 0 975
由于其较长,其顶部输出位于 pastebin 上:http://pastebin.com/WchrpF7W
答案1
由于您似乎正在运行 I/O 相关的测试(您没有详细解释您对 LVM 卷做了什么),您注意到的行为是否可能与自然 OS 页面缓存有关?
我正在考虑 Linux 的标准行为,即使用(有时几乎全部)可用内存(即未被应用程序保留的内存)来缓存最近访问的磁盘区域,以加快 IO 速度。
当然,活动应用程序优先于此缓存,因此如果某个进程需要更多 RAM,则缓存会动态缩小。
网络上有很多关于 Linux 页面缓存的文档,这里就是其中之一。
答案2
我有同样的问题,但我检查了位于 /proc/sys/vm/ 下的内核参数:overcommit_memory = 默认 0 overcommit_ratio = 默认 50 max_map_count = 默认 65530
就我的情况而言,这个参数就是我的问题的根源nr_hugepages,我有自定义值,但将其更改为默认值
nr_hugepages = 0
对不起我的英语不好 :(
答案3
对我来说,这似乎是页面缓存没有自行清除。
sync; echo 1 | sudo tee /proc/sys/vm/drop_caches
几秒钟后就还给我了30gB。