19

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”,所以我很好奇有什么更好的方法。

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

4

5 回答 5

8

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

查看Qt Extended(以前的 Qtopia)如何预测 OOM 情况。

有两个事件:

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

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

于 2010-06-13T10:49:03.647 回答
3

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

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

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

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

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

于 2010-06-13T14:50:11.907 回答
3

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

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

于 2016-10-11T20:42:38.883 回答
2

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

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

于 2010-06-11T17:53:30.347 回答
2

我使用以下内容:

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")))
于 2013-06-18T13:32:14.550 回答