进程实际内存使用情况

进程实际内存使用情况

以下是我的服务器上分别的mysql内存使用情况。apache根据输出pmapmysql正在使用大约 379M 和apache正在使用 277M。

[root@server ~]# pmap 10436 | grep total
 total           379564K

[root@server ~]# pmap 10515 | grep total
 total           277588K

将其与 的输出进行比较top,我发现这些值几乎匹配。

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10515 apache    20   0  271m  32m 3132 S  0.0  6.6   0:00.73 /usr/sbin/httpd
10436 mysql     20   0  370m  21m 6188 S  0.0  4.3   0:06.07 /usr/libexec/mysqld --basedir=....

现在这些值肯定不是这两个进程的当前内存使用情况,因为如果是的话,它就会超过我系统上的 512M ram,而且我知道这些是分配给这两个进程的页面大小,而不是真正的大小。他们主动使用的内存大小。现在,当我们使用 时pmap -x,我看到一个额外的列Dirty,它显示该进程的内存使用量要少得多。如下面的示例所示,该Dirty列显示 15M,而不是第一列中的 379M。我的问题是:列下的值Dirty是该进程主动使用的“真实”内存量吗?如果不是,那么我们如何找出进程的真实内存使用情况呢?不是ps,并且top出于与上述相同的原因。我们下面有什么/proc可以提供此信息的内容吗?

[root@server ~]# pmap -x 10436 | grep total
total kB          379564   21528   15340
[root@server ~]#


[root@server ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           489        447         41          0         52        214
-/+ buffers/cache:        180        308
Swap:         1023          0       1023
[root@server ~]#

答案1

没有命令可以给出“进程的实际内存使用情况”,因为不存在进程的实际内存使用情况

进程的每个内存页可以是(除了其他区别之外):

  • 仅由该进程使用的临时存储。
  • 使用多种机制与其他进程共享。
  • 由磁盘文件备份。
  • 在物理内存或交换区中。

我认为“脏”数字将 RAM(不是交换)中的所有内容加起来,并且没有文件支持。这包括共享内存和非共享内存(尽管在大多数情况下,除了分叉服务器之外,共享内存仅由内存映射文件组成)。

显示的信息pmap来自和。这是进程的真实内存使用情况——它不能用一个数字来概括。/proc/PID/maps/proc/PID/smaps

答案2

我将引用我在应用程序的手册页中编写的内容,该应用程序进行类似于 top 的分析并从相同的来源绘制信息pmap(例如/proc/[N]/maps):

虚拟地址空间与虚拟地址空间物理内存

了解之间的区别很重要虚拟地址空间物理内存在解释上述一些统计数据时。顾名思义,虚拟地址空间不是真实的;它基本上是当前分配给进程的所有内存的映射。该映射的大小限制对于每个进程都是相同的(一般为2-4 GB),并且不会累积(即,在实际只有 512 MB 物理内存的系统上,您可能有数十或数百个进程,每个进程都有自己的 2-4 GB 虚拟地址空间)。

实际上无法从虚拟地址空间存储或检索数据;真实数据需要真实的物理内存。管理一个与另一个的关系是内核的工作。虚拟空间统计信息(VirtualSz、Data+Stack 和 Priv&Write)对于考虑进程的结构以及与物理内存使用的关系非常有用,但对于实际使用的 RAM 量,物理内存统计信息(ResidentSz、Share 和比例)才是最重要的。

pmap主要向您报告有关的信息虚拟地址空间。您在输出中观察到的“值几乎匹配”top可能是指 VIRT 图,它与 RES 图有很大不同。这些与上面我标记的“VirtualSz”和“ResidentSz”完全对应(VIRT 代表虚拟,RES 代表常驻)。

现在,当我们使用 pmap -x 时,我看到一个额外的 Dirty 列,它显示该进程的内存使用量要少得多。如下面的示例所示,“脏”列显示 15M,而不是第一列中的 379M。我的问题是: Dirty 列下的值是该进程主动使用的“真实”内存量吗?

不,但有点像。 “脏”内存是指已从磁盘加载并随后被修改的数据;由于它已被修改,因此它必须是常驻记忆因为这些更改当前存储在 RAM 中。然而,它并不是它的同义词。

答案3

虚拟内存就像快速拨号号码,只不过大约有 30 亿个(对于 32 位系统,64 位内核上的 32 位应用程序有 40 亿个,64 位应用程序更多),并且您不能直接拨打号码,它们有映射到快速拨号。

多个进程可以对同一地址(电话号码)有不同的映射(快速拨号号码)。例如,它们可能共享多个库,因此具有整个库的虚拟地址(您可以在 pmap 中看到)。他们甚至可能共享相同的可执行文件,例如 bash 的 2 个实例。

到目前为止,这解释了所有虚拟地址的子部分如何适合,但还有更多。一个进程可以拥有如此多的虚拟内存,以至于它不适合,怎么办?库或可执行文件的某些部分可能不会被使用,它们不会从磁盘复制到内存,或者内存已满并且从磁盘加载的位被删除,因为如果需要它们可以从磁盘重新获取,或者没有支持的内存我的磁盘被映射到交换区,复制到交换区,然后被删除。然后可以在需要时从交换中读取它。如果后面的任何策略使用太多,那么系统就会变得很慢。

相关内容