随着时间的推移,内存已满,“缓冲区/缓存”使用率高,“可用”内存低

Max*_*ann 12 ubuntu memory out-of-memory

每当我重新启动我的笔记本电脑时,一切都运行得惊人,而且我的内存使用率最高为 40%(超过 8GB)。然而,随着时间的推移(使用约 1 天),内存使用率上升到 90% 以上,并且系统开始交换。

现在,free -mh返回这个:

              total        used        free      shared  buff/cache   available
Mem:           7,7G        1,3G        141M        223M        6,3G        246M
Swap:          7,5G        530M        6,9G
Run Code Online (Sandbox Code Playgroud)

我假设如果进程需要,可以自由地重新分配 buff/缓存内存,但它似乎大多不可用。

cat /proc/meminfo

MemTotal:        8055268 kB
MemFree:          145184 kB
MemAvailable:     247984 kB
Buffers:           49092 kB
Cached:           423724 kB
SwapCached:        38652 kB
Active:           881184 kB
Inactive:         791552 kB
Active(anon):     708420 kB
Inactive(anon):   725564 kB
Active(file):     172764 kB
Inactive(file):    65988 kB
Unevictable:         252 kB
Mlocked:             252 kB
SwapTotal:       7812092 kB
SwapFree:        7267624 kB
Dirty:               352 kB
Writeback:             0 kB
AnonPages:       1195320 kB
Mapped:           235860 kB
Shmem:            234068 kB
Slab:            6117796 kB
SReclaimable:     167260 kB
SUnreclaim:      5950536 kB
KernelStack:       10352 kB
PageTables:        30312 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    11839724 kB
Committed_AS:    6410728 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:    104448 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     1361472 kB
DirectMap2M:     5859328 kB
DirectMap1G:     1048576 kB
Run Code Online (Sandbox Code Playgroud)

我发现这些值特别有趣,因为它们与来自 的 buff/缓存使用有很大关系free,但我不知道如何处理它们或下一步该往哪里看:

SReclaimable:     167260 kB
SUnreclaim:      5950536 kB
Slab:            6117796 kB
Run Code Online (Sandbox Code Playgroud)

我接下来可以在哪里看?什么是平板,有没有办法减少它的内存使用量?

maz*_*azs 10

您应该检查top某些东西是否确实在使用您的 RAM,按内存使用情况排序,或检查系统监视器中的内存使用情况。

Linux 将借用未使用的内存用于磁盘缓存。这使得看起来您的内存不足,但实际上并非如此。查看此网页以获取更多解释:https : //www.linuxatemyram.com/

在发布的示例中,您实际上有大约 6.5Gb 未使用的内存。您还可以看到交换量非常低(540Mb)。

您可以按照此处的说明释放缓存,然后free将在可用字段中显示可用内存:

或使用此命令:

free && sync && echo 3 > /proc/sys/vm/drop_caches && free
Run Code Online (Sandbox Code Playgroud)

关于Slab:
Slab、SReclaimable、SUnreclaim
内核在运行的时候做了很多重复。某些对象,例如请求文件的特定 inode 可能每天执行数千次。在这种情况下,最好将其存储在快速参考列表或缓存中。Slab 是内核对象的缓存,用于优化那些最常发生的活动。

Slab 字段是 SReclaimable 和 SUnreclaim 的总和。

尝试对使用 Slab SUnreclaim 内存量的原因进行故障排除slabtop

以上旨在以root身份运行。

  • @mazs - 在您提供的链接中(+1 表示很棒的链接),它说“要查看您的应用程序可以使用多少内存而无需交换,请运行 free -m 并查看“可用”列。现在 OP 只有可用列中的 246M - 但是您在回答中提到实际上有 6.5GB。似乎有矛盾? (7认同)
  • 需要明确的是:释放各种缓存会适得其反。它会“改善”数字,并可能让 OP 在一段时间内感觉更好,但缓存会随着时间的推移重新填充,一切都会回到缓存被释放之前的状态:这是*正常*。除非有其他迹象表明出现问题,否则最好不要管它。 (5认同)
  • @mazs:好的 - 我现在看到 OP 正在抱怨交换和缓慢(尽管他似乎没有使用太多交换)。但是slab中不可回收的内存似乎有问题。 (2认同)