我有一个运行 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