我应该使用哪个指标来确定服务器何时内存不足?

loo*_*opj 10 linux memory

Linux 机器上有许多(数百?)不同的内存使用量度,但是用于帮助确定服务器是否需要更多内存的良好启发式/指标是什么?

一些想法:

  • 从 /proc/meminfo 查看 MemTotal - Active - Inactive 作为“有线”内存的度量
  • 查看ps中所有进程的RSS值总和
  • 查看 /proc/meminfo 中的 Committed_AS

Phi*_*ßen 7

Linux Kernel 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

然后我增加了内存使用量,直到我最终耗尽内存,这导致机器冻结,直到 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
Run Code Online (Sandbox Code Playgroud)

现在,系统恢复后,内存压力再次为 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
Run Code Online (Sandbox Code Playgroud)


Gru*_*mpy 1

您可以运行该命令top来查看 Linux 中所有主要组件的概述,包括内存使用情况。第一次查看 top 时,请注意使用的内存包括缓冲区和缓存(如果有)。

还有一个free用于记忆的命令。您可以执行 likefree -m查看可用内存(以兆字节为单位)。

还有更多工具,但我认为这已经充分回答了问题的工具部分。

至于何时需要更多内存取决于您正在运行的应用程序。是否需要突发容量?它是否从大缓存中受益匪浅?但一般来说,如果你经常使用交换,你确实需要更多的内存。