Slab 使用了 128Gb 可用容量中的 88Gb。这是什么原因造成的?

Slab 使用了 128Gb 可用容量中的 88Gb。这是什么原因造成的?

我们在一台 128 Gb 的服务器上运行 debian 2.6.26-2-amd64 x86_64 GNU/Linux。最近,我们的可用内存变得相当低。查看 /proc/meminfo 发现 Slab 使用了 88Gb,这当然算在已用内存中。

  1. 这是个问题吗?我怀疑内存会在必要时被释放,但我不知道这是否会产生不良的副作用。
  2. 为什么 Slab 需要那么多内存?有明确的原因吗?
  3. 我们能避免将来再发生这样的事情吗?
  4. 我们如何释放这个内存?

先感谢您

> 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

相关内容