为什么我的系统在使用一小时后会使用更多 RAM?

为什么我的系统在使用一小时后会使用更多 RAM?

我正在将 Arch Linux (5.1.8-arch1-1-ARCH) 与 XFCE DE 和 XFWM4 WM 一起使用。一切都非常优雅,并且 RAM 和 CPU 使用率很低。

启动后,当 DE 完全加载时,我看到 RAM 使用量为 665 MiB。

但在打开 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 的树莓派上,我也遇到了同样的问题。

这是截图 1 这是截图2

红宝石代码:

#!/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?这真的会影响系统的性能吗?

答案1

未使用的 RAM 是浪费的 RAM。 Linux 内核具有先进的内存管理功能,并试图避免给您的系统、硬盘/SSD 瓶颈带来负担。它尝试将文件缓存在内存中。

内存管理系统的工作方式很复杂,目标是更好的性能。

您可以通过检查来了解它正在做什么/proc/meminfo

cat /proc/meminfo

您可以使用“drop_caches”回收此缓存内存。但是,请注意文档中说“不建议在测试或调试环境之外使用”,因为“当再次需要它们时,重新创建删除的对象可能会花费大量的 I/O 和 CPU”:-)。

仅清除页面​​缓存:

# sync; echo 1 > /proc/sys/vm/drop_caches

清除 dentry 和 inode:

# sync; echo 2 > /proc/sys/vm/drop_caches

清除PageCache、dentries和inode:

# sync; echo 3 > /proc/sys/vm/drop_caches

请注意,这sync将刷新文件系统缓冲区以确保所有数据均已写入。

来自内核文档:

页面缓存

物理内存是易失性的,将数据存入内存的常见情况是从文件中读取数据。每当读取文件时,数据都会放入页面缓存中,以避免后续读取时昂贵的磁盘访问。类似地,当写入文件时,数据被放置在页面缓存中并最终进入后备存储设备。写入的页面被标记为脏页,当 Linux 决定将它们重新用于其他目的时,它会确保设备上的文件内容与更新的数据同步。

回收

在整个系统生命周期中,物理页可用于存储不同类型的数据。它可以是内核内部数据结构、供设备驱动程序使用的可 DMA 缓冲区、从文件系统读取的数据、用户空间进程分配的内存等。

Linux 内存管理根据页面使用情况进行不同的处理。可以随时释放的页面,或者因为它们缓存了其他地方可用的数据,例如在硬盘上,或者因为它们可以再次换出到硬盘,所以称为可回收的。可回收页面最值得注意的类别是页面缓存和匿名内存。

在大多数情况下,保存内部内核数据并用作 DMA 缓冲区的页面无法重新调整用途,并且它们将保持固定状态,直到被用户释放。此类页面称为不可回收页面。然而,在某些情况下,甚至可以回收内核数据结构占用的页面。例如,文件系统元数据的内存缓存可以从存储设备重新读取,因此当系统面临内存压力时可以从主内存中丢弃它们。

释放可回收的物理内存页并重新利用它们的过程称为(惊讶!)回收。 Linux 可以异步或同步回收页面,具体取决于系统的状态。当系统未加载时,大部分内存是空闲的,分配请求将立即从空闲页面供应中得到满足。随着负载的增加,可用页面的数量会下降,当达到某个阈值(高水位线)时,分配请求将唤醒 kswapd 守护进程。它将异步扫描内存页,如果它们包含的数据在其他地方可用,则释放它们,或者将其逐出到后备存储设备(还记得那些脏页吗?)。当内存使用量增加更多并达到另一个阈值(最小水位线)时,分配将触发直接回收。在这种情况下,分配会停止,直到回收足够的内存页来满足请求为止。

内存泄漏

现在,某些程序可能会出现“内存泄漏”,也就是说,它们“忘记”释放不再使用的内存。如果你让一个程序运行一段时间,它的内存使用量不断增加,你可以看到这一点,当你关闭它时,内存永远不会被释放。现在,程序员当然会尽力避免内存泄漏,但程序可能会出现一些泄漏。回收此内存的方法是重新启动。

答案2

您查看了进程列表及其内存使用情况。但是有一个问题。您没有查看完整列表。

gnome-system-monitor默认情况下仅显示“我的进程”。要查看所有系统用户(包括该用户)拥有的进程,root请单击右上角的菜单图标(垂直线上的三个点)。将选择从“我的进程”更改为“所有进程”。


  1. 已用与可用系统 RAM,作为​​单个数字
  2. 分析/proc/meminfo
  3. 您可以使用的其他工具 -atop今天安装 8-)

1. 已用系统 RAM 与可用系统 RAM,作为​​单个数字

我看到你的 ruby​​ 代码MemAvailable从 中减去MemTotal。这与 所使用的计算完全相同gnome-system-monitor,显示系统正在使用“3.7 GiB 中的 1.5 GiB (41.4%)”。

您使用其中之一gnome-system-monitor或您的手动计算是正确的,至少作为第一个近似值。该MemAvailable数字基本上包括所有可回收的“缓存”。即,MemAvailable包含一种“缓存”类型,一旦程序请求的内存多于可用内存,该“缓存”就可以被回收。

旁注:“缓存”还有另一种类型或含义,即不是可回收的。当您查看Cache/“缓存”编号时,通常会报告为包含Shmem/“共享”。该Shmem部分是不是可回收的缓存。之所以会发生这种混乱,是因为Shmem它巧妙地使用了内核“页面缓存”来实现。

另一种快速检查“可用”的方法是free -h

free命令还显示“共享”、交换使用情况等。您的系统文档应列出输出字段和可用选项,即在man free.其他一些字段可能会产生误导:

  • 命令中的“used”字段free(当前)不包括“shared”。这可能会非常令人困惑。 忽略“已使用”字段
  • 显示的“缓存”值free存在上述问题。
  • 如果free没有显示“可用”,则您的系统是古老的。请参阅您的古代文献。

2. 分析/proc/meminfo

感谢您的完整输出cat /proc/meminfo。这通常有助于找到具体的答案(或任何答案)。如果您想自己了解如何MemAvailable计算,您可以在这里阅读我的答案的第一部分:“缓存”内存实际上是免费的吗?

匿名页面

在您的示例中meminfo,您有AnonPages: 924844 kB(0.9 GB)。 AnonPages是减少 的项之一MemAvailable

AnonPages增加时,应该表明某些正在运行的程序的“RES”或“RSS”(RAM“设置大小”中的“驻留”)增加。但 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- 查看按映射名称分组的内存 - 缓存文件的名称,或者“<匿名>”或“[堆]”

    进程“常驻”内存包括两个都“匿名”内存和一些缓存文件。 smem -m无法显示所有缓存的文件,仅显示当前正在使用的某些类型的文件。具体来说,是程序映射到虚拟内存中的文件。这包括程序代码、库代码和使用 mmap() 映射的文件。

施梅姆

您还有Shmem: 374848 kB(0.4 GB)。我Shmem上面提到/“共享”。这是减少“可用”内存的另一个术语。 (它不是可回收的缓存)。这是相当正常的,但你可以尝试看看这是什么。

某些共享内存作为各个进程的内存可见。如果共享内存是由进程映射的,那么它应该计入RSS/PSS。往上看。 “映射名称”有时在这里很有用(例如smem -t -m)。

Shmem包括已安装的文件tmpfs。您可以tmpfs使用检查所有安装的df -t tmpfs

根据您的系统,Shmem可能包含一些图形缓冲区。我找到了一种方法来检查它们在我的系统(英特尔显卡)上的当前大小:我可以看到分配为 GEM 缓冲区的内存量吗? 我很想知道您是否找到其他方法来检查您的系统!

我读到Shmem一些其他图形驱动程序中的内存泄漏可能与 Xorg 的非常大的 VIRT(又名 VSIZE)相关。Linux 使用整个交换区,在有足够的可用 RAM 时变得无响应

其他内存使用情况?

  • MemTotal - MemAvailable = 1796088 kB(1.8GB)
  • AnonPages: 924844 kB(0.9GB)
  • Shmem: 374848 kB(0.4GB)

在剩余的 0.5 GB 中,我可以看到总体上 0.1 GB 以下的一些小用途。内核还为自己保留了几个百分点的余量(请参阅“低水位线”),但我猜在您的系统上它会是 0.2 GB 或更少。所以还有一些我不确定的用法。

内核板内存

“不可回收的平板”内存是减少MemAvailable.您没有太多:SUnreclaim: 55044 kB(0.05 GB)。

您还可以运行slabtop来查看slab列表。 AFAICT,slabtop 不会提供有关可回收或不可回收的平板的统计信息。但我通常可以猜测,如果有一些可疑的板块,我想你可以通过名字来查找。

3. 您可以使用的其他工具 -atop今天安装 8-)

smem可能有点矫枉过正。有时,您所需要的只是top,或您最喜欢的替代方案,并了解如何按驻留内存进行排序。 (尽管gnome-system-monitor这可能不是一个好的选择。我认为它并没有真正表现得足够)。

有时,当您遇到性能问题时,您需要查看磁盘读取和写入。你可以使用sudo iotop.

有时,您希望有每个进程内存使用情况的日志,这样您就可以查看为什么内存不足并导致系统速度缓慢......

atop是一个漂亮的小工具,可以完成上述所有操作。如果这听起来很有用,我建议您立即安装它。然后您可以在需要时了解它:-)。

sudo atop -R显示“PSIZE”(与“PSS”含义相同)。该atop软件包包括一个以十分钟间隔运行的后台服务。您可以使用atop -r ...打开日志文件,这些文件存储在/var/log/atop/下。

相关内容