我如何找出哪个进程占用了这么多的 RAM?

我如何找出哪个进程占用了这么多的 RAM?

我在具有 16GB RAM 的服务器上运行 Cassandra 实例。出现 OutOfMemory 错误后,该进程崩溃了。

现在,当我检查内存使用情况时,发现使用了 16GB 中的 11GB。

             total       used       free     shared    buffers     cached
Mem:         16056      11032       5024          0          4         23
-/+ buffers/cache:      11004       5052
Swap:            0          0          0

通过 echo 1 > /proc/sys/vm/drop_caches 删除缓存没有帮助。

这是 top 命令的输出,其中 PID 按 RAM 使用情况排序:

我不知道哪些进程正在消耗内存。我是不是漏掉了什么?

我该如何恢复丢失的记忆?

以下是CPU详细信息:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             4
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 44
Stepping:              2
CPU MHz:               2933.437
BogoMIPS:              5866.87
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              15360K
NUMA node0 CPU(s):     0-3

uname -a: Linux ExpressoBDAPp33133 2.6.32-431.29.2.el6.x86_64 #1 SMP Sun Jul 27 15:55:46 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux

答案1

我看到您正在 VMware 中运行:

Hypervisor vendor:     VMware

您应该检查为每个客户机分配了多少内存。如果您分配的内存比主机的内存多(过量使用),并且主机内存不足,它将启动气球飞行- 基本上,它会开始占用客户机中的空间(迫使客户机开始交换),以便虚拟机管理程序有更多的内存可以使用。

事实上,默认的最大内存容量应该是客户机物理内存的 65%。这与您使用的 16 GB 中的 11 GB 非常吻合。

膨胀将作为已用内存出现在客户机中 - 并且由于它由内核模式驱动程序执行,因此它不会显示为进程。这可能会产生副作用:如果您已禁用交换,客户机操作系统将直接拒绝任何超过可用内存的请求。

请注意,气球飞行是一种症状更大的问题:主机缺乏资源。不要简单地禁用内存膨胀,因为这将迫使虚拟机管理程序开始交换客户机内存,从而完全破坏性能。您应该为该客户机设置内存预留(这将迫使虚拟机管理程序更积极地从其他客户机回收内存),并设置一些交换,以便客户机可以在发生内存膨胀时智能地交换最少使用的页面,而不是迫使虚拟机管理程序随机地这样做。

您还可以通过以下方式检查“使用”了多少内存:在客人内如果发生这种情况,您需要更多的物理资源 - 要么升级主机,要么将虚拟机分布到更多主机上。

另请参阅VMware 内存管理白皮书

答案2

内存未丢失,不需要恢复。它正在使用中。

释放内存是浪费。它没有任何好处。如果你在想“我现在想释放内存,以便以后使用”,那就太荒谬了。你现在就可以使用内存以后再使用它。事实上,现在有空闲的内存只会使以后使用它变得更加困难,因为如果内存是空闲的,那么使用它就需要付出努力。

这里不需要权衡。你今天不能使用更少的 RAM,以便明天可以使用更多的 RAM。RAM 无法节省。没有什么不对。没有什么需要修复。

现代操作系统只有在别无选择的情况下才会释放内存。拥有空闲内存的优势。只有正在使用的内存才有好处,而空闲内存则需要花费精力才能使用。

不要以为内存必须空闲才可用。在现代操作系统中,绝大多数已使用的内存通常都是可用的。内存可以直接从一种用途转换到另一种用途,而无需在此期间浪费精力使其空闲。

相关内容