考虑Linux 上pmap
一个简单进程的以下输出:tail
$ pmap -x 3974
3974: tail -F /var/log/syslog
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 60 36 0 r-x-- tail
000000000060e000 4 4 4 r---- tail
000000000060f000 4 4 4 rw--- tail
0000000000610000 132 12 12 rw--- [ anon ]
00007ffff7775000 2792 44 0 r---- locale-archive
00007ffff7a2f000 1672 432 0 r-x-- libc-2.17.so
00007ffff7bd1000 2048 0 0 ----- libc-2.17.so
00007ffff7dd1000 16 16 16 r---- libc-2.17.so
00007ffff7dd5000 8 8 8 rw--- libc-2.17.so
00007ffff7dd7000 16 12 12 rw--- [ anon ]
00007ffff7ddb000 132 104 0 r-x-- ld-2.17.so
00007ffff7fd7000 12 12 12 rw--- [ anon ]
00007ffff7ff7000 12 12 12 rw--- [ anon ]
00007ffff7ffa000 8 4 0 r-x-- [ anon ]
00007ffff7ffc000 4 4 4 r---- ld-2.17.so
00007ffff7ffd000 8 8 8 rw--- ld-2.17.so
00007ffffffde000 132 24 24 rw--- [ stack ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 7064 736 116
给定该进程及其状态,我可以ps
输出有关其内存使用情况的各种信息:
$ ps -lp 3974
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 3974 3972 0 80 0 - 1766 - pts/0 00:00:00 tail
$ ps vp 3974
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
3974 pts/0 Ss+ 0:00 3 57 7006 660 0.0 tail -F /var/log/syslog
$ ps lp 3974
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 1000 3974 3972 20 0 7064 660 - Ss+ pts/0 0:00 tail -F /var/log/syslog
但是,除了VSZ
输出字段之外l
,这些都或多或少地与pmap
有关各个映射的信息不同。最奇怪的显然是SZ
输出字段-l
,我似乎根本无法弄清楚它在计算什么。我还没有在任何文档中找到关于它做什么的解释(手册页提到了一些关于“核心映像”的神秘内容,但没有定义这个术语,我看不出任何字段组合加起来会达到pmap
1766 或甚至任何接近这个数字的东西)。有人知道吗?
但是,和输出RSS
的字段也与 略有不同,输出中的字段也略有不同。虽然差别不是很大,但还是让我有点困惑。v
l
pmap
DRS
v
答案1
该字段,在的文档SZ
中描述为(为了完整性):ps
进程核心映像的物理页面大小。这包括文本、数据和堆栈空间。设备映射目前不包括在内;这可能会发生变化。请参阅 vsz 和 rss。
似乎与procfs
中报告的第一个数字相同/proc/$PID/statm
:
$ tailf /var/log/vmware-installer &; PID=$! $ pmap -x $PID | tail -n 1 总 kB 6788 616 132 $ ps -lp $PID FS UID PID PPID C PRI NI 地址深圳WCHAN TTY 时间命令 0 南 516 13848 13657 0 85 5 - 1697- pts/7 00:00:00 tailf $ cat /proc/$PID/statm 169715312020810
的格式statm
在内核文档()中描述/usr/src/linux/Documentation/filesystems/proc.txt
:
表 1-3:statm 文件的内容(截至 2.6.8-rc3) ........................................................................... 字段内容 size 总程序大小(页面)(状态与 VmSize 相同) 内存部分(页面)的驻留大小(状态与 VmRSS 相同) 共享的页面数(即由文件支持) trs 页面为“代码”(不包括库;损坏, 包括数据段) lrs 库的页数(在 2.6 上始终为 0) drs 数据/堆栈的页数(包括库;损坏, 包括图书馆文本) dt 脏页数(在 2.6 上始终为 0) ...........................................................................
这并没有提供太多信息,但至少表明 Linux 内核本身报告了该数字。