【问题标题】:How to reliably measure available memory in Linux?如何可靠地测量 Linux 中的可用内存?
【发布时间】:2010-06-11 02:01:32
【问题描述】:

Linux /proc/meminfo 显示了许多内存使用统计信息。

MemTotal:      4040732 kB
MemFree:         23160 kB
Buffers:        163340 kB
Cached:        3707080 kB
SwapCached:          0 kB
Active:        1129324 kB
Inactive:      2762912 kB

它们之间有相当多的重叠。例如,据我了解,可以有活动页面缓存(属于“缓存”和“活动”)和不活动页面缓存(“不活动”+“缓存”)。

我想做的是测量“空闲”内存,但它包括可能被丢弃的已用页面,而不会对整个系统的性能产生重大影响。

起初,我倾向于使用“free”+“inactive”,但 Linux 的“free”实用程序在其“buffer-adjusted”显示中使用了“free”+“cached”,所以我很好奇有什么更好的方法是。

当内核内存不足时,要丢弃的页面的优先级是什么?衡量可用内存的更合适的指标是什么?

【问题讨论】:

  • 还要检查Committed_AS,这是内核实际承诺 进程的实际大小。考虑到当前的内存使用情况,您似乎正在尝试更多地预测如果分配/锁定/使用 xx 字节会发生什么?
  • @Tim Post,是的,我什至没有开始在图片中添加过度使用。我正在尝试获取一个数字,如果使用更多内存,该数字将预测坏事何时开始发生。

标签: linux virtual-memory


【解决方案1】:

由于“可用内存”的确切含义取决于您的目的,而您的目的是避免 OOM 情况:

查看how Qt Extended (previously Qtopia) anticipates OOM situations.

有两个事件:

  • (MemFree + Buffers + Cached) / MemTotal /proc/meminfo)
  • 主要页面错误>阈值(我认为/proc/vmstat中的pgmajfault)

第一个是内存不足的早期警告,并触发更频繁的页面错误监控。第二个信号是垃圾,它会破坏系统性能,并且是 OOM 杀手将运行的一个很好的暗示。

【讨论】:

    【解决方案2】:

    起初我发现你的问题很简单,因为在实践中,“+缓冲区/缓存”列中free 的输出是我使用的,它通常可以工作。

    但它不起作用的一种情况是当您对相同的块进行大量阅读时。例如。一遍又一遍地读取同一个 1 gb_file:

    while true; do cat 1gb_file >/dev/null; done
    

    如果您的系统有 > 1 GB 的缓存,那么这将运行得很快。但是,如果您开始将某些缓存用于其他用途,则会破坏系统的性能。

    因此,当您评估您的解决方案时,请尝试上述方法,看看解决方案是否考虑到了这一点。

    【讨论】:

      【解决方案3】:

      从 linux-3.14 开始,/proc/meminfo 中有新的指标 MemAvailable。

      并检查实用程序免费输出中的“-/+缓冲区/缓存:”行。

      【讨论】:

        【解决方案4】:

        我想说很难衡量哪些页面在被丢弃时会导致系统“对整体系统性能产生重大影响”。用户进程使用的页面将是(总计)-(免费 + 缓存 + 分页)。第二项是内核在需要时可以释放的所有内存。但是,释放用于缓存和页面的内存页面将对整体系统性能产生重大影响。

        如果我要使用启发式算法,我会说您应该取“非活动”的值,即“空闲且可用的缓冲区或页面缓存内存的总量,以千字节为单位。这是最近没有使用过的内存,可以回收用于其他目的。”如果你发现你接受了这个并且系统继续正常工作,你可以估计一些“活动”百分比作为猜测,因为系统可能最近使用了一些页面,但不会再次使用它们。你比我更了解这个系统。如果系统专用于您将要执行的任何操作,那么 Active 中可能很快使用的页面和缓存文件将取决于该系统最近是否用于其他用途。

        【讨论】:

          【解决方案5】:

          我使用以下内容:

          FREE_KB = MemFree + Buffers + Cached
          
          FREE_KB=$(($(echo `sed -n '2p;3p;4p' <  /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /+/g")))
          
          
          USED_KB = MemTotal - MemFree - Buffers - Cached
          
          USED_KB=$(($(echo `head -n4 /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /-/g")))
          

          【讨论】:

          • 在我看来 /proc/meminfo 是否返回字节或 kb 可能取决于系统。对我来说,上面的代码似乎返回字节,YMMV。
          • 你使用哪个内核?在当前的 Linux 函数中 meminfo_proc_show 仅返回 kB。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-01
          • 2015-01-15
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 2011-04-30
          • 1970-01-01
          相关资源
          最近更新 更多