进程的实际内存使用情况

Cit*_*ght 25 memory virtual-memory

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

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

[root@server ~]# pmap 10515 | grep total
 total           277588K
Run Code Online (Sandbox Code Playgroud)

将其与 的输出进行比较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=....
Run Code Online (Sandbox Code Playgroud)

现在这些值绝对不是这两个进程的当前内存使用情况,因为如果是的话,它会超过ram我系统上的 512M ,我明白这些是分配给这两个进程的页面大小的事实,而不是真的他们积极使用的内存大小。现在,当我们使用 时pmap -x,我看到一个额外的列Dirty,它显示进程的内存使用量要少得多。如下面的示例所示,第一列Dirty显示的是 15M,而不是 379M。我的问题是:coloumn 下的值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 ~]#
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 20

没有给出“进程的实际内存使用情况”的命令,因为没有进程的实际内存使用情况这样的东西

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

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

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

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


gol*_*cks 9

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

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

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

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

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

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

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