引言
前一篇提到的扩展文章中有使用 pmap 的例子。 这个命令我之前没有使用过,所以现在来学习下。
pmap 是什么
man pmap,描述很简单:
The pmap command reports the memory map of a process or processes.
pmap 提供了进程的内存映射,pmap 命令用于显示一个或多个进程的内存状态。 其报告进程的地址空间和内存状态信息。pmap 实际上是一个 Sun OS 上的命令,Linux 仅支持其有限的功能。 但是它还是对查看完整的进程地址空间很有帮助。 我们需要 PID 或者运行的进程的唯一进程 ID 来查看进程内存状态,我们可以通过 /proc 或者常规命令比如 top 或 ps 得到它。
pmap 使用
扩展模式使用
[root@iZ25p102vo3Z ~]# pmap -x 9173
9173: /usr/bin/python /usr/bin/ssserver -c /etc/shadowsocks.json -d start
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 4 4 0 r-x-- python2.7
0000000000600000 4 4 4 r---- python2.7
0000000000601000 4 4 4 rw--- python2.7
0000000002152000 3460 3224 3224 rw--- [ anon ]
00007feae240a000 12 8 0 r-x-- fcntlmodule.so
00007feae240d000 2044 0 0 ----- fcntlmodule.so
00007feae260c000 4 4 4 r---- fcntlmodule.so
00007feae260d000 4 4 4 rw--- fcntlmodule.so
00007feae260e000 12 0 0 r-x-- _randommodule.so
00007feae2611000 2044 0 0 ----- _randommodule.so
00007feae2810000 4 4 4 r---- _randommodule.so
00007feae2811000 4 4 4 rw--- _randommodule.so
00007feae2812000 28 0 0 r-x-- math.so
00007feae2819000 2044 0 0 ----- math.so
00007feae2a18000 4 4 4 r---- math.so
00007feae2a19000 8 8 8 rw--- math.so
00007feae2a1b000 20 12 0 r-x-- selectmodule.so
00007feae2a20000 2044 0 0 ----- selectmodule.so
00007feae2c1f000 4 4 4 r---- selectmodule.so
00007feae2c20000 8 8 8 rw--- selectmodule.so
00007feae2c22000 28 0 0 r-x-- libffi.so.6.0.1
00007feae2c29000 2044 0 0 ----- libffi.so.6.0.1
00007feae2e28000 4 4 4 r---- libffi.so.6.0.1
00007feae2e29000 4 4 4 rw--- libffi.so.6.0.1
以上输出部分截取,这里的 Address,Kbyte,Dirty,RSS,mode 还有 mapping 的说明如下:
Address: 内存开始地址
Kbytes: 占用内存的字节数(KB)
RSS: 保留内存的字节数(KB)
Dirty: 脏页的字节数(包括共享和私有的)(KB)
Mode: 内存的权限:read、write、execute、shared、private (写时复制)
Mapping: 占用内存的文件、或[anon](分配的内存)、或[stack](堆栈)
Offset: 文件偏移
Device: 设备名 (major:minor)