我们在一台 128 Gb 的服务器上运行 debian 2.6.26-2-amd64 x86_64 GNU/Linux。最近,我们的可用内存变得相当低。查看 /proc/meminfo 发现 Slab 使用了 88Gb,这当然算在已用内存中。
- 这是个问题吗?我怀疑内存会在必要时被释放,但我不知道这是否会产生不良的副作用。
- 为什么 Slab 需要那么多内存?有明确的原因吗?
- 我们能避免将来再发生这样的事情吗?
- 我们如何释放这个内存?
先感谢您
> cat /proc/meminfo
MemTotal: 132304500 kB
MemFree: 26669388 kB
Buffers: 237504 kB
Cached: 11881136 kB
SwapCached: 48 kB
Active: 5244640 kB
Inactive: 11714308 kB
SwapTotal: 5751228 kB
SwapFree: 5750436 kB
Dirty: 24 kB
Writeback: 0 kB
AnonPages: 4840256 kB
Mapped: 163968 kB
Slab: 88314840 kB
SReclaimable: 88275644 kB
SUnreclaim: 39196 kB
PageTables: 80852 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 71903476 kB
Committed_AS: 6818332 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 505724 kB
VmallocChunk: 34359231963 kB
答案1
您是否绝对确定这是一个实际问题:使用的 RAM 是不是与不可用的 RAM 相同(请参阅此关于 free/buffers/cache 的 ServerFault 问题),想要将内存列为空闲的反射通常是错误的。
Slab 不是一个特定的东西,它是内核中的内存分配器之一,特别是 slab 允许内核管理非页面大小的对象(正如其他地方指出的那样,/proc/slabinfo 和 slabtop 应该会给你一些关于它当前持有什么的提示)。可以找到有关 slab 的更多背景信息这里
如果您看到 Slab 下方的 SReclaimable,则表明几乎所有由 slab 分配的内存都可以在需要时回收。因此,是的,内存将在必要时释放。回收的附带成本是支付一些延迟的 CPU 周期记账成本。
我不确定 slab 是否严格来说需要所有这些内存,在很多情况下它会保留初始化的对象以供以后使用(保存初始化),其中一些是各种缓存,其中大多数可能是有益的(即文件系统缓存的影响是巨大的)。
如果你想控制 vmm 的行为,请查看/proc/sys/vm,特别是 min_slab_ratio 可能值得关注。您还可以通过 /proc/slabinfo 限制单个 slab 缓存(请参阅IBM DeveloperWorks 文章了解详情)。不过,在开始打开 vmm 和 slab 之前:弄清楚您真正想要完成什么,并对 vmm 进行一些研究,以及如何对其进行调整以适合您的工作负载。通过摆弄 vmm 调整旋钮,很有可能巧妙而惊人地破坏您的系统。
答案2
使用slabtop显示内核slab缓存信息:
slabtop
另请参阅“vmstat -m”:
vmstat -m
并查看 /proc/slabinfo:
cat /proc/slabinfo
删除缓存以释放内存
sync; echo 3 > /proc/sys/vm/drop_caches