最近我的一个网络服务器消耗了更多的内存,然后我检查了一下/proc/meminfo
,发现 AnonPages 几乎消耗了所有的内存。
我试图从一些文档中理解这一点,但尚不清楚,有人可以帮助我到底是什么,以及如何解决它?
答案1
从手册页proc(5)
:
AnonPages %lu (since Linux 2.6.18)
Non-file backed pages mapped into user-space page tables.
Linux 中进程映射内存的方式通常是使用mmap(2)
系统调用“将文件或设备映射到内存”。内存可以由磁盘中的实际文件支持,因此您可以像处理常规内存块一样处理文件。
但是,您也可以分配不受任何文件支持的空内存部分。这些内存页被称为“匿名”。从手册页mmap
:
MAP_ANONYMOUS
The mapping is not backed by any file; its contents are initialized to zero.
如果您曾经用 C 语言编程,您可能熟悉malloc(3)
并使用它来分配动态内存。在 Linux 中,大多数情况下,malloc
实际上会调用mmap
分配匿名内存页。
AnonPages
显示最常见的内存类型的使用情况 - 进程使用的动态内存区域。
mmap
请注意,使用或分配匿名页面malloc
不一定会立即由AnonPages
;反映出来。当您分配动态内存时,您只是获得了一个可以使用的虚拟地址空间,但内存页面实际上并没有“实例化”并映射到进程的用户空间内存中,直到它开始使用它们(写入或读取/来自记忆)。只有这样,这些内存页才会加载到 RAM 并由 进行计数AnonPages
。
简而言之,AnonPages
当您想到“内存”和“RAM”时,您可能首先想到的就是“内存”。只是“常规”内存页面根据进程的请求动态分配给进程,并由这些进程使用。没有什么真正需要“修复”的。AnonPages
成为“顶级击球手”是人们所期望的,也是很常见的。
您应该只查找占用最多内存的进程(例如,使用top
)并采取相应措施。也许有一个进程消耗大量内存(RSS),或者有许多进程填满了内存。