Linux 机器上有许多(数百种?)不同的内存使用量衡量标准,但什么是好的启发式方法/指标,可以帮助确定服务器是否需要更多内存?
一些想法:
- 从 /proc/meminfo 查看 MemTotal - Active - Inactive,作为“有线”内存的衡量标准
- 查看 ps 中所有进程的 RSS 值总和
- 查看 /proc/meminfo 中的 Committed_AS
答案1
Linux 内核 4.20添加 PSI,代表“压力失速信息”。它可以让您更深入地了解机器过载的原因。以及哪种资源是瓶颈。
有三个新文件 /proc/pressure
:
/proc/pressure/cpu
/proc/pressure/memory
/proc/pressure/io
引自跟踪压力失速信息关于/proc/pressure/memory
:
其输出如下:
some avg10=70.24 avg60=68.52 avg300=69.91 total=3559632828 full avg10=57.59 avg60=58.06 avg300=60.38 total=3300487258
该
some
行类似于 CPU 信息:它跟踪至少一个进程在不等待内存资源的情况下可以运行的时间百分比。特别是,以这种方式跟踪换入、从页面缓存重新加载页面以及执行直接回收所花费的时间。因此,它可以很好地指示系统何时因内存不足而出现故障。这
full
行有点不同:它跟踪由于内存压力而没有人能够使用 CPU 进行实际工作的时间。如果所有进程都在等待分页 I/O,则 CPU 可能看起来处于空闲状态,但这并不是因为没有工作要做。如果这些进程正在执行内存回收,则最终结果几乎相同;CPU 很忙,但它没有执行计算机应该执行的工作。如果full
数字远高于零,则显然系统缺少支持当前工作负载所需的内存。
我还没有访问过 Linux 4.20 的生产服务器,但这是我在桌面上进行的一个小实验(未配置交换)。最初,我根本没有内存压力(所有计数器均为 0):
$ cat /proc/pressure/memory
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
然后我增加了内存使用量,直到内存耗尽,导致机器冻结,直到 OOM 杀死一些进程。在冻结之前,内存压力增加:
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
some avg10=0.00 avg60=0.00 avg300=0.00 total=47047
full avg10=0.00 avg60=0.00 avg300=0.00 total=32839
some avg10=0.00 avg60=0.00 avg300=0.00 total=116425
full avg10=0.00 avg60=0.00 avg300=0.00 total=81497
some avg10=1.26 avg60=0.22 avg300=0.04 total=183863
full avg10=0.72 avg60=0.13 avg300=0.02 total=127684
现在,系统恢复后,内存压力再次为 0,并且total
计数器不再增加:
$ cat /proc/pressure/memory
some avg10=0.00 avg60=0.00 avg300=0.07 total=53910568
full avg10=0.00 avg60=0.00 avg300=0.02 total=27766222
...
$ cat /proc/pressure/memory
some avg10=0.00 avg60=0.00 avg300=0.05 total=53910568
full avg10=0.00 avg60=0.00 avg300=0.00 total=27766222
答案2
这个问题没有正确答案。
Peter 说得对,你需要查看的值是在 top 和 free 中报告的(你可以获得源代码对于 procps 包,它展示了如何从“C”获取这些值 - 但对于脚本来说,运行“free”更简单)
如果系统有未使用的内存(free 输出的第一行),那么通过添加更多内存不太可能使其变得更快 - 但通过减少 VFS 缓存压力(将内容在缓存中保存更长时间)可能会使其变得更快。
虽然没有正确答案,但却有很多错误答案——你无法从用户空间判断哪些页面是共享的,但通过不同的位置访问——查看内存使用情况来确定有多少内存是空闲的,这是行不通的。
作为起点,您应该查看“free”报告的两个可用内存值
答案3
我之前说过,获取实时内存需求的最佳方法是观察 /proc/meminfo 中的 COmmitted_AS 字段并随时间进行比较,以了解需要多少内存。
理论上,如果您的 Committed_AS 始终大于 (Memfree+swapfree),那么您就没问题。但是,如果它小于这个值,并且随着时间的推移,您的工作量在系统上不断积累,那么您就接近 OOM 情况了。如果所有内存请求都在这一瞬间被授予系统,则 Committed_AS 值决定了系统需要多少内存。
随着时间的推移,监控它是一个很好的措施,可以判断您是否需要增加 RAM 或减少工作量。
答案4
您可以运行该命令top
来查看 Linux 中所有主要组件的概览,包括内存使用情况。首次查看 top 时,请注意使用的内存包括缓冲区和缓存(如果有)。
还有free
用于内存的命令。您可以执行类似命令free -m
来查看可用内存(以兆字节为单位)。
还有更多工具,但我认为这已经充分回答了问题的工具部分。
至于何时需要更多内存,则取决于您正在运行的应用程序。它是否需要突发容量?大缓存大小是否对它有很大帮助?但一般来说,如果您经常使用交换,那么您确实需要更多内存。