进程的实际内存使用量


20

以下是服务器上mysqlapache上的内存使用情况。根据输出的pmap说,mysql正在使用大约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=....

现在,这些值绝对不是这两个进程的当前内存使用情况,因为如果超过了ram我的系统上的512M ,我就知道这些是分配给这两个进程的页面大小,而不是真正的它们主动使用的内存大小。现在,当我们使用时pmap -x,我看到一个额外的提示Dirty,显示该进程的内存使用量要少得多。如以下示例所示,该列Dirty显示15M,而第一个列显示379M。我的问题是:列值下的值Dirty是该进程正在积极使用的“实际”内存量吗?如果不是,那么我们如何找出进程的实际内存使用情况?不pstop上面同样的原因。我们有什么下/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 ~]#

Answers:


18

因为没有诸如进程的实际内存使用率之类的信息,所以没有给出“进程的实际内存使用率”的命令

一个进程的每个内存页可以是(除其他外):

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

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

显示的信息pmap来自和。那是进程的实际内存使用量-不能用一个数字来总结。/proc/PID/maps/proc/PID/smaps


6

我会引用我在手册页中为某个应用程序编写的内容,该应用程序执行与top相似的分析,并从pmap(例如/proc/[N]/maps)的相同来源获取信息:

虚拟地址空间VS。物理内存

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

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

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

现在,当我们使用pmap -x时,我看到了一个额外的脏话Dirty,它显示了该进程更少的内存使用。从下面的示例中可以看到,“脏”对话框显示15M,而第一个对话框中显示为379M。我的问题是:脏话下的值是该进程主动使用的“实际”内存量吗?

不,但是有点。“脏”内存是指已从磁盘加载并随后修改的数据;由于已对其进行了修改,因此它必须是驻留内存的一部分,因为这些更改当前存储在RAM中。但是,它不是同义词。


我同意。但是2至4GB适用于32位系统。如今,大多数系统可能都是64位。
ctrl-alt-delor

3

虚拟内存就像快速拨号一样,除了大约有30亿个(对于32位系统,对于40位内核上的32位应用程序为40亿,对于64位应用程序为40亿),并且您不能直接拨号,它们具有映射到快速拨号。

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

到目前为止,这说明了所有虚拟地址的子项如何适合,但还有更多。一个进程可能有太多虚拟内存,因此不适合使用,怎么办?库的某些部分或可执行文件可能无法使用,它们不会从磁盘复制到ram中,或者ram变满并且从磁盘加载的位会丢失,因为可以根据需要从磁盘中重新获取它们,或未备份的内存被映射到我的磁盘以进行交换,复制出去以进行交换,然后删除。然后可以在需要时从swap中读取它。如果后一种策略使用过多,则系统速度会变慢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.