如何准确衡量 Elastic Beanstalk/EC2 服务器中的内存使用情况?

如何准确衡量 Elastic Beanstalk/EC2 服务器中的内存使用情况?

我有一个运行 nodejs 服务器的 elastic beanstalk 环境。我试图测量内存使用情况,以确定哪种实例类型最合适,以及我们实际需要多少内存。为此,我在服务器使用率达到峰值时通过 ssh 连接到服务器并运行和free命令top,得到以下结果:

顶部:

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND  
27607 nodejs    20   0  944m 146m  27m S  15.2  3.9  25:04.26 node               
 2384 root      24   4  626m 118m 8932 S   0.7  3.2  67:34.94 aws                
 3235 root      20   0  524m  29m 8628 S   0.3  0.8   6:19.01 cfn-hup            
17626 nginx     20   0 68964  14m 3728 S   0.3  0.4   8:07.17 nginx              
31893 ec2-user  20   0 15364 2116 1828 R   0.3  0.1   0:00.02 top                
    1 root      20   0 19692 2672 2252 S   0.0  0.1   0:02.18 init

(其他所有内容的 %mem 均为 0.0)

自由的:

             total       used       free     shared    buffers     cached
Mem:       3824772    3654360     170412         60     108792    2956936
-/+ buffers/cache:     588632    3236140
Swap:            0          0          0

因此,free似乎表明内存使用率为 95.5%,但 nodejs 进程使用的内存不到 4%,所有进程加起来top只有 8.5%。这到底是怎么回事?其他 87% 去哪儿了?基于 nodejs 进程仅使用 4% 的内存和 15% 的 CPU 这一事实,我是否应该使用较小的实例?或者基于内存使用率已达到 95.5% 这一事实,我是否需要更大的实例?如果流量增加到足以使 nodejs 进程的内存使用率增加三倍,服务器是否会耗尽内存并崩溃,或者它会将那神秘的 87% 中的一部分重新分配给 nodejs 进程?

答案1

对于不熟悉 Linux 内存管理的人来说,它可能有点令人困惑。基本上,这里可能出现以下几种情况:要么是虚拟内存膨胀,要么是内核已将内存用于各种任务和进程,但尚未释放。如果您的 node.js 进程需要更多内存,那么内核可以释放它以供您的应用程序使用。

您可以在输出的第二行“free”中看到 -/+ buffers/cache 中您有 3236140 KB 的可用内存(3.2GB)。如果需要,您的应用程序可以使用其中的大部分内存。

-/+ 缓冲区/缓存:588632 3236140

相关内容