Linux机器上的内存使用量有很多不同的措施,但是如何确定一台服务器是否需要更多的内存,是一个很好的启发式/度量指标。
一些想法:
没有正确的答案。
彼得是正确的说,你需要看的价值是报告顶部和自由的(你可以得到procps软件包的源代码 ,它显示了如何从'C'获得这些值 – 但是对于脚本来说,它更简单运行免费')
如果系统没有使用内存(免费的第一行输出),那么通过增加更多的内存不太可能得到更快的速度,但是通过减lessVFScaching压力(使caching保持更长的时间)可能会更快。
虽然没有正确的答案,但还是有很多错误 – 你不能从用户空间告诉哪些页面被共享,而是通过不同的位置进行交stream – 查看内存使用情况以确定有多less内存空闲是行不通的。
作为一个出发点,你应该看看“免费”报告的可用内存的两个值,
您可以运行命令top查看Linux中所有主要组件的概述,包括内存使用情况。 首次查看top时,请注意所使用的内存包括缓冲区和caching(如果有的话)。
还有一个用于记忆的free命令。 您可以像free -m一样执行,以兆字节的forms查看内存。
还有更多的工具,但我认为这已经充分回答了问题的工具部分。
至于什么时候需要更多的内存取决于你正在运行的应用程序。 它需要爆裂能力吗? 它是否从很大的caching大小中受益匪浅? 但是一般来说,如果你经常碰到交换,你真的需要更多的内存。
如果我是你,我会收集有关负载,可用内存, free -m和服务器的主要性能特征(例如每个请求的延迟)的数据,并在Calc / Excel中绘制graphics,试图辨别出几个“swapout cliff”数据点(内存configuration – 8 G,16G,32G等)。 然后,我会尝试各种回归来find“悬崖”和可用内存之间的联系。
在CiteSeXX上search现有的文献也会有所帮助。
我之前已经说过,获得实时内存要求的最佳措施是观察/ proc / meminfo中的COmmitted_AS字段并随时间比较,以查看您需要多less内存。
理论上,如果你的Committed_AS总是超过(Memfree + swapfree),那么你没事。 但是,如果这个数字小于这个数字,那么随着时间的推移,你将在系统上累积工作量,你正在接近OOM的情况。 Committed_AS值决定了在这个瞬间所有内存请求被授予系统的时候系统需要多less内存。
随着时间的推移,监视是一个很好的措施,以查看是否需要增加RAM或者需要减less工作量。
真的这一切都取决于应用程序,但是你可以使用内核使用的方法来确定内存压力,这应该给你一个关于主机pipe理内存的能力的总体概述。
内存压力是理想的,因为它没有担心页面caching,swappiness,甚至你有多less内存。
内存压力实际上是根据/ proc / meminfo标记活动的页数。 内核通过跟踪页表中从“非活动”到“活动”的页数来测量内存压力。 这两种状态之间的很多转换表明,您可能没有足够的备用内存来激活更多页面。
低内存压力performance为从非活动状态到活动状态的促销活动非常less(因为内核显然有足够的空间使活动页面保持活动状态)。
这个脚本会每隔PERIODIC秒钟测量一次压力。 您收集的数据越多越好。 这里的想法是绘制数据图并将Y轴的中心固定为0。 在理想的情况下,graphics应该在水平线0之后。如果线条经常在0以外(特别是“主动”是积极的,或者定期地相当高),主机上的存储器压力高,更多的存储器将是有益的。
import os import sys import re import time PERIODIC = 1 pgs = re.compile('Active:\s+([0-9]+) kB\nInactive:\s+([0-9]+) kB') meminfo = open('/proc/meminfo') def read_meminfo(): content = meminfo.read(4096) m = pgs.search(content, re.M) active, inactive = int(m.group(1)), int(m.group(2)) active = active / 4 inactive = inactive / 4 meminfo.seek(0, 0) return active,inactive if __name__ == "__main__": oldin, oldac = read_meminfo() while True: time.sleep(PERIODIC) active, inactive = read_meminfo() print "Inactive Pressure:\t%d" % (inactive - oldin) print "Active Pressure:\t%d" % (active - oldac) oldac = active oldin = inactive