每当我重新启动笔记本电脑时,一切都运行得惊人,并且内存使用率最多为 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
我假设如果进程需要,缓冲/缓存内存可以自由地重新分配,但它似乎大多不可用。
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
我发现这些值特别有趣,因为它们与 的 buff/cache 使用情况有很大关联free
,但我不知道如何处理它们或下一步该去哪里查看:
SReclaimable: 167260 kB
SUnreclaim: 5950536 kB
Slab: 6117796 kB
接下来我可以去哪里看?什么是slab,有没有办法减少它的内存使用量?
答案1
您应该检查top
是否有某些东西实际上正在使用您的 RAM,按内存使用情况排序,或者检查系统监视器中的内存使用情况。
Linux 会借用未使用的内存用于磁盘缓存。这会让您看起来内存不足,但事实并非如此。检查此网页以获取更多说明:https://www.linuxatemyram.com/
在发布的示例中,您实际上有大约 6.5Gb 未使用的内存。您还可以看到交换量非常低(540Mb)。
您可以将缓存释放为在这里解释然后free
将在可用字段中显示可用内存:
释放页面缓存:
# echo 1 > /proc/sys/vm/drop_caches
释放 dentry 和 inode:
# echo 2 > /proc/sys/vm/drop_caches
释放页面缓存、目录项和索引节点:
# echo 3 > /proc/sys/vm/drop_caches
或者使用这个命令:
free && sync && echo 3 > /proc/sys/vm/drop_caches && free
关于Slab:
Slab、SReclaimable、SUnreclaim
内核在运行过程中会进行大量的重复操作。某些对象(例如询问文件的特定索引节点)可能每天执行数千次。在这种情况下,明智的做法是将其存储在快速引用列表或缓存中。 Slab 是内核对象的缓存,用于优化那些最常发生的活动。
Slab字段是SReclaimable和SUnreclaim的总和。
尝试对正在使用 Slab SUnreclaim 内存量的问题进行故障排除slabtop
。
以上内容旨在以 root 身份运行。
答案2
答案3
附带说明一下,我最近遇到一个top
以批处理模式(-b 选项)运行的系统,进程 SLAB 会增长。例如:
# cat /proc/slabinfo | grep proc
proc_inode_cache 5567 5868 440 9 1 : tunables 0 0 0 : slabdata 652 652 0
当我在不运行 top 的情况下启动系统时,proc SLAB 内存消耗会大大降低:
# cat /proc/slabinfo | grep proc
proc_inode_cache 564 846 440 9 1 : tunables 0 0 0 : slabdata 94 94 0
这是因为该top
工具遍历 /proc 来获取每个进程的统计信息。这会触发用上次访问的 proc 文件的 inode 填充 proc SLAB。