[英]How to reliably measure available memory in Linux?
Linux /proc/meminfo
显示了许多内存使用情况统计信息。
MemTotal: 4040732 kB
MemFree: 23160 kB
Buffers: 163340 kB
Cached: 3707080 kB
SwapCached: 0 kB
Active: 1129324 kB
Inactive: 2762912 kB
他们之间有很多重叠。 例如,据我所知,可以有活动页面缓存(属于“缓存”和“活动”)和非活动页面缓存(“非活动”+“缓存”)。
我想要做的是测量“免费”内存,但其中包括可能被丢弃的已使用页面,而不会对整个系统的性能产生重大影响。
起初,我倾向于使用“免费”+“非活动”,但Linux的“免费”实用程序在其“缓冲区调整”显示中使用“自由”+“缓存”,所以我很好奇什么是更好的方法。
当内核内存不足时,要删除的页面的优先级是什么,以及衡量可用内存的更合适的度量标准是什么?
因为“可用内存”的精确含义取决于您的目的,您的目的是避免OOM情况:
看看Qt Extended(以前的Qtopia)如何预测OOM情况。
有两个事件:
/proc/meminfo
) /proc/vmstat
pgmajfault) 第一个是内存不足的早期警告,并触发更频繁的页面故障监控。 第二个信号摧毁,这会杀死系统性能并且是OOM杀手将会运行的良好暗示。
起初我发现你的问题很简单,因为在实践中,'+ buffers / cache'列中的free
是我使用的,它通常可以正常工作。
但是其中一个不起作用的情况是当你对相同的块有大量读取时。 例如,一遍又一遍地读取相同的1 gb_file:
while true; do cat 1gb_file >/dev/null; done
如果您的系统具有> 1 GB的缓存,那么这将快速运行。 但是,如果你开始使用其他一些缓存,它将破坏系统的性能。
因此,当您评估解决方案时,请尝试以上操作,并查看解决方案是否考虑到了这一点。
我使用以下内容:
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")))
我说很难测量哪些页面在被删除时会导致系统“对整体系统性能产生重大影响”。 用户进程使用的页面将是(Total) - (Free + Cached + Paged)。 第二个术语是内核可以释放的所有内存(如果需要)。 但是,释放用于缓存和页面的内存页面将对整体系统性能产生重大影响。
如果我打算使用启发式,我会说你应该取“非活动”的值,这是“缓冲区或页面缓存内存的总量,以千字节为单位,是免费的和可用的。这是内存有的最近没有使用,可以用于其他目的。“ 如果你发现你采取了这个并且系统继续正常工作,你可以估计一些百分比的“活动”作为猜测,因为系统最近可能已经使用了一些页面,但不会再次使用它们。 你比我更了解这个系统。 如果系统专用于您将要执行的任何操作,那么Active中可能很快就会使用的页面和缓存文件将取决于系统最近是否用于其他内容。
从linux-3.14开始,/ proc / meminfo中有新的度量标准MemAvailable。
并在免费实用程序的输出中检查行' - / + buffers / cache:'。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.