AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 524846
Accepted
S.Goswami
S.Goswami
Asked: 2019-06-14 23:25:45 +0800 CST2019-06-14 23:25:45 +0800 CST 2019-06-14 23:25:45 +0800 CST

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

  • 772

我正在使用带有 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 的树莓派上,我也遇到了同样的问题。

这是截图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?这真的会影响系统的性能吗?

performance ram
  • 2 2 个回答
  • 9657 Views

2 个回答

  • Voted
  1. Best Answer
    thecarpy
    2019-06-15T00:35:44+08:002019-06-15T00:35:44+08:00

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

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

    您可以通过检查来查看它在做什么/proc/meminfo。

    cat /proc/meminfo

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

    仅清除 PageCache:

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

    清除dentries和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 守护进程。它将异步扫描内存页面,如果它们包含的数据在其他地方可用,则释放它们,或者驱逐到后备存储设备(还记得那些脏页面吗?)。随着内存使用量进一步增加并达到另一个阈值 - min watermark - 分配将触发直接回收。在这种情况下,分配会停止,直到回收足够的内存页面来满足请求。

    内存泄漏

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

    • 20
  2. sourcejedi
    2019-06-15T04:56:57+08:002019-06-15T04:56:57+08:00

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

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


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

    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)。

    You can also run slabtop to see the list of slabs. AFAICT, slabtop doesn't give stats on slabs as reclaimable or unreclaimable. But I can usually guess, and if there is some suspicious slab I guess you can look it up by name.

    3. Other tools you could use - install atop today 8-)

    smem might be overkill. Sometimes, all you need is top, or your favourite alternative, and to know how to sort by resident memory. (Although gnome-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/ 下的日志文件。

    • 2

相关问题

  • 如何将每个 GB 的“制造商”RAM 转换为 gparted 使用的 EXACT MB 等价物?

  • 为什么 `sync + drop_caches` 不删除缓存?

  • 为什么`strace`不显示这个过程正在等待什么?

  • 进程创建时间、shell脚本和系统调用开销

  • 如果禁用校验和,ZFS 使用非 ECC RAM 是否更安全?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve