linux 进程内存开销,pmap : 理解linux的进程内存占用

本文探讨了`ps`中VSZ和RSS内存概念的误解,指出RSS包括共享内存可能导致总和大于实际内存。通过pmap展示了进程映射和实际占用内存的区别,并揭示了查看特定程序物理内存的方法。特别关注了虚拟内存和共享库的计算问题。
摘要由CSDN通过智能技术生成

首先 ps 看一下我的系统跑着哪些process

$ ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

...

czbug 1980 0.0 1.7 180472 34416 ? Sl Feb25 0:01 /usr/bin/yakuake

...

我拿 yakuake 这个小程序作例子。

其中,关于内存的是 VSZ 和 RSS 这两个

man ps 看看它们的含义:

rss RSS resident

set size, the non-swapped physical memory that a task has used (in

kiloBytes). (alias rssize, rsz).

vsz VSZ virtual

memory size of the process in KiB (1024-byte units). Device

mappings are currently excluded; this is subject to change. (alias

vsize).

简单一点说,RSS 就是这个process 实际占用的物理内存,VSZ 就是process 的虚拟内存,就是process

现在没有使用但未来可能会分配的内存大小。

其实这里的ps 出来的结果,是有点不正确的,如果把所有程序的 RSS 加起来,恐怕比你的实际内存还要大呢。为什么呢??因为 ps

的结果,RSS 那部分,是包括共享内存的。这里我用 pmap 来看看。

$ pmap -d 1980

1980: /usr/bin/yakuake

Address Kbytes Mode Offset Device Mapping

00110000 2524 r-x-- 0000000000000000 008:00002 libkio.so.5.3.0

00387000 4 ----- 0000000000277000 008:00002 libkio.so.5.3.0

00388000 32 r---- 0000000000277000 008:00002 libkio.so.5.3.0

00390000 16 rw--- 000000000027f000 008:00002 libkio.so.5.3.0

00394000 444 r-x-- 0000000000000000 008:00002 libQtDBus.so.4.5.2

00403000 4 ----- 000000000006f000 008:00002 libQtDBus.so.4.5.2

00404000 4 r---- 000000000006f000 008:00002 libQtDBus.so.4.5.2

00405000 4 rw--- 0000000000070000 008:00002 libQtDBus.so.4.5.2

00407000 228 r-x-- 0000000000000000 008:00002 libkparts.so.4.3.0

00440000 8 r---- 0000000000039000 008:00002 libkparts.so.4.3.0

00442000 4 rw--- 000000000003b000 008:00002 libkparts.so.4.3.0

00443000 3552 r-x-- 0000000000000000 008:00002 libkdeui.so.5.3.0

007bb000 76 r---- 0000000000377000 008:00002 libkdeui.so.5.3.0

007ce000 24 rw--- 000000000038a000 008:00002 libkdeui.so.5.3.0

007d4000 4 rw--- 0000000000000000 000:00000 [ anon ]

....

mapped: 180472K writeable/private: 19208K shared: 20544K

我略去了一部分输出,都是差不多的,重点在最后那行输出。

linux 会把一些shared libraries 载入到内存中,在pmap 的输出中,这些shared libraries

的名字通常是 lib*.so 。如 libX11.so.6.2.0 。这个 libX11.so.6.2.0 会被很多process

load 到自己的运行环境中,同时,ps 输出的RSS 结果中,每个process 都包含了这个libX11.so.6.2.0

,而事实上它只被load 了一次,如果单纯把ps 的结果相加,这样就重复计算了。

而 pmap 的输出中,writeable/private: 19208K ,这个就是yakuake

这个程序真正占用的物理内存,不包含shared libraries 。在这里,它只有19208K,而ps 的RSS

是34416K。

————————————————————–

我在看这方面的资料时,还看到一些关于virtual memory 的,再记录下。

以下两个命令均可查看 vmsize 。

$ cat /proc//stat | awk '{print $23 / 1024}'

$ cat /proc//status | grep -i vmsize

一般来说,得出来的值,是和 ps 的 VSZ 是一样的,但有一种情况例外,就是查看X server 的时候。

举个例:

$ ps aux|grep /usr/bin/X|grep -v grep | awk '{print $2}' # 得出X server 的 pid ...

1076

$ cat /proc/1076/stat | awk '{print $23 / 1024}'

139012

$ cat /proc/1076/status | grep -i vmsize

VmSize: 106516 kB

而 ps 的 VSZ 为 106516 ,与后者是一致的。

据说是因为

VmSize = memory + memory-mapped hardware (e.g. video card

memory).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值