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
    • 最新
    • 标签
主页 / server / 问题 / 449296
Accepted
user135199
user135199
Asked: 2012-11-16 20:29:11 +0800 CST2012-11-16 20:29:11 +0800 CST 2012-11-16 20:29:11 +0800 CST

为什么 Linux 奇怪地报告“空闲”内存?

  • 772

这是一个关于 Unix 操作系统如何报告内存使用情况的典型问题。
类似问题:

  • 服务器拒绝使用交换分区
  • LINUX 中的内存使用

我有运行Debian 6.0.6 Squeeze的生产服务器

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

每天cron以 root 身份执行备份脚本:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

一切正常,但我注意到 Munin 的内存图显示备份后缓存和缓冲区增加。

然后我只下载备份文件并删除它们。删除后,Munin 的内存图将缓存和缓冲区返回到备份前的状态。

这是 Munin 图:

外部托管图像是无效链接。

linux unix memory-usage
  • 3 3 个回答
  • 8834 Views

3 个回答

  • Voted
  1. voretaq7
    2012-11-16T21:10:06+08:002012-11-16T21:10:06+08:00

    您遇到了Linux Ate My Ram问题。

    不要恐慌。

    这不是问题。

    您的系统正在按设计工作。

    问题不在于您的操作系统——问题在于您对什么是“空闲”内存的理解。


    Unix 系统不仅仅将内存用于运行程序。内存可能用于:

    • 正在运行的程序(活动/使用)
    • 传输中的缓冲数据(缓冲区)
    • 缓存最近从磁盘读取/写入磁盘的数据(缓存)
    • 绝对没有(免费)

    以下是对现代 Unix 系统如何报告 RAM 使用情况的简要(但大部分不完整)的介绍。

    什么是可用内存(操作系统定义)?

    当 Unix 系统将 RAM 报告为可用时,这意味着“我没有将此 RAM 用于任何用途”。
    免费RAM 实际上毫无价值 - 它不会让您的系统更快,它只是坐在那里“免费”以备不时之需。那东西可能是我上面提到的其他三个项目中的任何一个。

    什么是缓存和缓冲内存?

    高速缓存和缓冲内存是操作系统用来提高系​​统速度的 RAM。现在运行程序不需要
    这个内存,所以你的操作系统用它来保存它经常需要的数据——例如 C 库(你运行的几乎每个程序都需要)几乎总是保存在内存中,所以系统不必去磁盘上寻找在屏幕上打印“Hello World”所需的指令。它实际上比这复杂得多——有共享内存、有线内存等——但对于我们的目的来说,这个简单的解释就足够了。cache

    什么是主动记忆?

    活动内存是我们理解为“已用”内存的一部分——应用程序正在使用的 RAM,无论它们做什么——排序电子表格、提供网页、编辑图形等。
    “活动”内存最近一直处于“活动”状态—— - 程序声称它已经使用了它的内容(读或写),并且它不被认为是换出的好候选者。

    什么是非活动内存?

    与活动内存一样,非活动内存是应用程序用于执行任何操作的 RAM。不同之处在于这段内存有一段时间没有被访问过,所以如果迫不得已,操作系统认为它可以换出到磁盘,并且(运气好的话)程序声称它不会再次请求它,所以它永远不会注意到。

    什么是“已用”内存(人类定义)

    您和我所认为的“已用”内存本质上是活动内存和非活动内存的总和。应用程序当前要求使用的所有 RAM。
    只要您安装的 RAM 多于活动内存和非活动内存的总和(加上顶部 512-1024MB 的良好安全余量),您就处于一个好的位置:您的操作系统可能不会遇到交换和降低性能.

    什么是“免费”内存(人类定义)?

    您和我认为的“空闲”内存是可用于运行程序的内存。
    这比您的操作系统报告的“免费”数字稍微复杂一些。当程序请求 RAM 时,操作系统将尝试以破坏性最小的方式获取该 RAM:

    • 如果有空闲内存可用(无所事事),将分配 RAM。
    • 如果没有可用的可用内存,操作系统将蚕食缓存和缓冲区空间:缓冲池中最近最少/最少访问的内容将被丢弃,并将该 RAM 分配给程序。
    • 如果没有 Buffer/Cache RAM 可以蚕食,swapper 将查看非活动内存并选择它认为最不可能访问的区域。该数据将被调出以交换(磁盘),并将新释放的 RAM 提供给程序。
    • 如果所有非活动 RAM 都已换出,交换器将开始将活动 RAM 放到磁盘上。
      (这就是性能通常受制于狗的地方:每次程序启动 CPU 时,它换出的位都需要返回到 RAM 中,这意味着必须换出其他一些程序的活动内存——交换中的高周转率称为颠簸)
    • 如果系统已经换出了它能换出的所有东西(并填满了交换分区),或者如果您正在运行一个没有交换分区的系统,那么坏事就会发生。此时会发生以下两种情况之一:
      • malloc()将失败。这是符合 POSIX 规范的行为——操作系统会告诉请求 RAM 的程序它不能满足请求。
        该程序可以要求更少的 RAM,或者如果它不能使用更小的内存块,它可以清理并退出。(如果程序写得不好,它只会崩溃。)
      • 如果您使用的是 Linux 机器,OOM-Killer可能会继续进行帮派式的杀戮狂欢,终止其他进程以尝试释放足够的 RAM 来满足请求。
        如果您无法通过我在这里的描述和我对链接问题的回答来判断,我认为这是处理问题的糟糕方法。

    为什么删除文件时 Free RAM 会增加?

    在此处问题的示例中,您注意到可以通过删除备份文件来“释放”RAM——对此的解释非常简单:因为没有任何东西正在使用该文件(没有打开的文件句柄)并且它不再可以从文件系统(未链接)操作系统知道没有人会再次访问该数据,因此它会从文件系统缓存中清除数据。
    这使得操作系统报告更多的可用内存,但对系统性能没有影响。

    • 61
  2. Best Answer
    Jeff Ferland
    2012-11-16T20:47:37+08:002012-11-16T20:47:37+08:00

    这与服务器拒绝使用交换分区和该站点上的其他一些类似问题的“问题”相同。(Linux 服务器上的高内存使用率、LINUX中的内存使用率、内存不足的Web 服务器等)

    注意内存消耗来自cache。这意味着它在内存中保存了一个文件。缓存内存是“空闲”内存。您的操作系统不会将内存块留空,而是将最近读取的文件保存在该空间中。如果应用程序确实需要该内存,则该应用程序将使用它。到那时,如果文件被频繁引用,您就有机会避免再次从磁盘读取文件。

    根据这张图,您的有效内存消耗在整个图表持续时间内根本没有变化。

    • 27
  3. Chris S
    2014-02-22T07:57:09+08:002014-02-22T07:57:09+08:00

    其他检查上述是否失败的东西:

    检查 Slab 缓存的使用情况(Slab:,SReclaimable:和 SUnreclaim:in /proc/meminfo)。这是内核数据结构的缓存,与报告的页面缓存是分开的free。

    如果 slab 缓存对大部分“丢失的内存”负责,请检查/proc/slabinfo它去了哪里。如果它是 dentry 或 inode,您可以使用sync ; echo 2 > /proc/sys/vm/drop_caches来摆脱它们。

    您还可以使用该slabtop工具以友好的格式显示 Slab 缓存的当前使用情况。 c将按当前缓存大小对列表进行排序。

    来自:https ://stackoverflow.com/a/5467207

    • 2

相关问题

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve