我正在使用带有 XFCE DE 和 XFWM4 WM 的 Arch Linux (5.1.8-arch1-1-ARCH)。事情非常优雅,RAM 和 CPU 使用率很低。
启动后,当 DE 完全加载后,我看到 665 MiB 的 RAM 使用量。
但是在打开 Atom、Code、Firefox、Chromium 等应用程序后,或在 GIMP、Blender 等中工作后,RAM 使用量会增加,这是显而易见的。但是在关闭所有应用程序并且只剩下一个 gnome-system-monitor 之后,我可以看到 RAM 使用量为 1.2 - 1.4 GiB。/proc/meminfo 与 gnome-system-monitor 一致,但 htop 始终给出不同的结果。
更糟糕的是,当我稍后打开一个占用 RAM 的应用程序时,它再次消耗了 1.4 GiB 之上所需的内存。情况总是如此。/tmp/ 目录中没有存储可能加起来达到兆字节的文件。
此外,如果我寻找使用那么多 RAM 的进程(从开始时的 700 MiB 到关闭浏览器后的 1.4 GiB !!),我什么也看不到。事实上,即使在运行 Arch ARM 的树莓派上,我也遇到了同样的问题。
红宝石代码:
#!/usr/bin/ruby -w
STDOUT.sync = true
loop do
IO.readlines(File.join(%w(/ proc meminfo))).then { |x| [x[0], x[2]] }.map { |x| x.split[1].to_i }.reduce(:-)
.tap { |x| print "\e[2K\rRAM Usage:".ljust(20), "#{x / 1024.0} MiB".ljust(24), "#{(x / 1000.0)} MB" }
Kernel.sleep(0.1)
end
该cat /proc/meminfo
命令具有以下输出:
MemTotal: 3851796 kB
MemFree: 1135680 kB
MemAvailable: 2055708 kB
Buffers: 1048 kB
Cached: 1463960 kB
SwapCached: 284 kB
Active: 1622148 kB
Inactive: 660952 kB
Active(anon): 923580 kB
Inactive(anon): 269360 kB
Active(file): 698568 kB
Inactive(file): 391592 kB
Unevictable: 107012 kB
Mlocked: 32 kB
SwapTotal: 3978216 kB
SwapFree: 3966696 kB
Dirty: 280 kB
Writeback: 0 kB
AnonPages: 924844 kB
Mapped: 563732 kB
Shmem: 374848 kB
KReclaimable: 74972 kB
Slab: 130016 kB
SReclaimable: 74972 kB
SUnreclaim: 55044 kB
KernelStack: 8000 kB
PageTables: 14700 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 5904112 kB
Committed_AS: 3320548 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
Percpu: 1456 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 226736 kB
DirectMap2M: 3778560 kB
DirectMap1G: 0 kB
首先,您注意到 htop 从不同意。我对此知之甚少。
其次,您可以看到 xfdesktop 使用 44 MiB,而其他一些进程使用了一些内存,内核使用了 ~150 MiB,除此之外,为什么我看到正在使用 1.5 GiB RAM?这真的会影响系统的性能吗?
未使用的 RAM 是浪费的 RAM。Linux 内核具有高级内存管理功能,并试图避免给系统瓶颈、硬盘驱动器/SSD 带来负担。它尝试在内存中缓存文件。
内存管理系统以复杂的方式工作,更好的性能是目标。
您可以通过检查来查看它在做什么
/proc/meminfo
。cat /proc/meminfo
您可以使用“drop_caches”回收此缓存内存。但是,请注意文档说“不建议在测试或调试环境之外使用”,仅仅是因为“重新创建删除的对象可能会花费大量的 I/O 和 CPU” :-)。
仅清除 PageCache:
清除dentries和inode:
清除 PageCache、dentries 和 inode:
请注意,这
sync
将刷新文件系统缓冲区以确保已写入所有数据。从内核文档:
内存泄漏
现在,一些程序可能会出现“内存泄漏”,即它们“忘记”释放不再使用的内存。如果您让程序运行一段时间,您可以看到这一点,它的内存使用量不断增加,当您关闭它时,内存永远不会被释放。现在,程序员当然会尽量避免内存泄漏,但程序可以有一些。回收此内存的方法是重新启动。
您查看了进程列表及其内存使用情况。但有一个问题。您没有查看完整列表。
gnome-system-monitor
默认情况下仅显示“我的进程”。要查看所有系统用户(包括root
用户)拥有的进程,请单击右上角的菜单图标(垂直线上的三个点)。将选择从“我的进程”更改为“所有进程”。atop
8-)1. 已用与可用系统 RAM,作为单个数字
我看到你的 ruby 代码
MemAvailable
从MemTotal
. 这与 使用的计算完全相同gnome-system-monitor
,当它显示系统正在使用“1.5 GiB (41.4%) of 3.7 GiB”时。您可以使用其中一个
gnome-system-monitor
或您的手动计算,至少作为第一个近似值。该MemAvailable
数字基本上包括所有可回收的“缓存”。即MemAvailable
包括一种“可用”的“缓存”,只要程序要求的内存超过您的可用内存,就可以回收。旁注:“缓存”还有另一种类型或含义,不可回收。当你查看
Cache
/“缓存”号时,通常报告为包括Shmem
/“共享”。该Shmem
部分是不可回收的缓存。之所以会出现这种混乱,是因为Shmem
它是使用内核“页面缓存”巧妙地实现的。另一种快速检查“可用”的方法是
free -h
.该
free
命令还显示“共享”、交换使用等。您的系统文档应列出输出字段和可用选项,即man free
. 其他一些字段可能会产生误导:free
(当前)不包括“共享”。这可能非常令人困惑。 忽略“使用”字段。free
存在上述问题。free
不显示“可用”,则您的系统是古老的。查阅您的古代文献。2. 分析 /proc/meminfo
感谢您的完整输出
cat /proc/meminfo
。这通常有助于找到具体的答案(或任何答案)。如果您想了解MemAvailable
自己是如何计算的,可以在此处阅读我的答案的第一部分:“缓存”内存实际上是免费的吗?匿名页面
在您的示例
meminfo
中,您有AnonPages: 924844 kB
(0.9 GB)。AnonPages
是减少的项之一MemAvailable
。当
AnonPages
增加时,这应该表明一些正在运行的程序的“RES”或“RSS”(ram“Set Size”中的“Resident”)增加了。但 RSS 可能会产生误导,因为一些内存是共享的:您不能将 RSS 相加,因为那样会重复计算共享内存。你必须加起来PSS,占分享后的比例 RSS 。该
smem
命令可以显示 PSS,也可以计算总数。例如:sudo smem -t > p; head -n1 p; echo; tail -n17 p
- 查看每个进程的内存使用情况。该tail
部分将显示前 15 个进程,然后是总 PSS 等一行。smem -t -U ^sourcejedi$ > U; head -n1 U; echo; tail -n17 U
- 查看属于我的用户“sourcejedi”的进程的内存使用情况。sudo smem -t -u
- 查看按用户分组的内存。这可能有助于将您的登录会话与以它们自己的用户身份运行的某些系统守护进程区分开来。例如,packagekitd 以root
用户身份运行,并且可以使用数百兆字节。smem -t -P firefox
- 查看我的网络浏览器的内存使用情况 :-)。sudo smem -t -m > m; head -n5 m; echo; tail m
- 查看按映射名称分组的内存 - 缓存文件的名称,或“<anonymous>”或“[heap]”。进程“常驻”内存包括“匿名”内存和一些缓存文件。
smem -m
无法显示所有缓存文件,仅显示当前正在使用的某些类型的文件。具体来说,程序已映射到虚拟内存中的文件。这包括程序代码、库代码和使用 mmap() 映射的文件。什梅
您还有
Shmem: 374848 kB
(0.4 GB)。我在Shmem
上面提到/“共享”。这是另一个减少“可用”内存的术语。(它不是可回收的缓存)。这是相当正常的,但你可以尝试看看它是什么。一些共享内存作为单个进程的内存可见。如果共享内存是由进程映射的,那么它应该计入RSS/PSS。看上面。“映射名称”有时在这里很有用(例如
smem -t -m
)。Shmem
包括 mount 上的文件tmpfs
。您可以tmpfs
使用df -t tmpfs
.根据您的系统,
Shmem
可能包括一些图形缓冲区。我找到了一种在我的系统(英特尔显卡)上检查它们当前大小的方法:我可以看到分配为 GEM 缓冲区的内存量吗? 我很想知道您是否找到其他方法来检查您的系统!我读到
Shmem
其他一些图形驱动程序中的内存泄漏可能与 Xorg 的非常大的 VIRT(又名 VSIZE)相关联。Linux 使用整个交换,在有大量可用 RAM 时变得无响应其他内存使用?
MemTotal - MemAvailable = 1796088 kB
(1.8 GB)AnonPages: 924844 kB
(0.9 GB)Shmem: 374848 kB
(0.4 GB)在剩余的 0.5 GB 中,我可以看到总体低于 0.1 GB 的一些小用途。内核还为自己保留了几个百分点的余量(请参阅“低水位线”),但我猜它在您的系统上将是 0.2 GB 或更少。所以还有一些我不确定的用法。
内核平板内存
“不可回收的平板”内存是另一个减少
MemAvailable
. 你没有很多:SUnreclaim: 55044 kB
(0.05 GB)。3. Other tools you could use - install
atop
today 8-)smem
might be overkill. Sometimes, all you need istop
, or your favourite alternative, and to know how to sort by resident memory. (Althoughgnome-system-monitor
might not be a good choice for this. I think it does not really show enough).Sometimes when you have a performance problem, you need to look at disk reads & writes instead. You could use
sudo iotop
.Sometimes, you would like to have a log of per-process memory usage, so you can look at why you ran out of memory and slowed the system to a crawl...
atop
是一个漂亮的小工具,可以完成以上所有工作。如果这听起来很有用,我建议您立即安装它。然后,您可以在需要时了解它:-)。sudo atop -R
显示“PSIZE”(与“PSS”含义相同)。该atop
软件包包括一个以十分钟间隔运行的后台服务。您可以使用它atop -r ...
来打开存储在 /var/log/atop/ 下的日志文件。