Skip to contentSkip to conversation

process memory footprint info in proc/<pid>/[s|p]maps v2

PATCH In review Fengguang Wu 2 participants 3 messages Aug 19, 2007 – Aug 20, 2007

lore
Share & tools
lore
#0 lore raw

cover process memory footprint info in proc/<pid>/[s|p]maps v2

Andrew,

Inspired by Matt Mackall's pagemap patches and ideas, I worked up these textual interfaces that achieve the same goals. The patches run OK under different sized reads.

1) Add PSS into the existing /proc/<pid>/smaps:
[PATCH 1/4] maps: PSS(proportional set size) accounting in smaps

2) Create /proc/<pid>/pmaps for page granularity mmap footprints:
[PATCH 2/4] maps: address based vma walking
[PATCH 3/4] maps: introduce generic_maps_open()
[PATCH 4/4] maps: /proc/<pid>/pmaps interface - memory maps in granularity of pages

 fs/proc/base.c          |    7 
 fs/proc/internal.h      |    1 
 fs/proc/task_mmu.c      |  359 +++++++++++++++++++++++++++++---------
 fs/seq_file.c           |    1 
 include/linux/proc_fs.h |    7 
 mm/mempolicy.c          |    2 
 6 files changed, 288 insertions(+), 89 deletions(-)

In this new version, offset and len are changed to use hexical numbers.

Thank you,
Fengguang

Signature · 173 lines
An example output:

# cat /proc/`pidof init`/pmaps
00400000-00409000 r-xp 00000000 08:01 1058732                            /sbin/init
0       8       YRAU___ 1
00608000-00609000 rw-p 00008000 08:01 1058732                            /sbin/init
8       1       Y_A_P__ 1
00609000-0062a000 rw-p 00609000 00:00 0                                  [heap]
609     5       Y_A_P__ 1
2b7d6e277000-2b7d6e294000 r-xp 00000000 08:01 1563879                    /lib/ld-2.6.so
0       1       YRAU___ 63
1       4       YRAU___ 41
5       2       YRAU___ 55
7       1       YRAU___ 50
8       1       YRAU___ 55
9       1       YRAU___ 81
a       1       YRAU___ 57
b       2       YRAU___ 55
d       2       YRAU___ 81
f       1       YRAU___ 55
10      1       YRAU___ 43
13      1       YRAU___ 81
14      1       YRAU___ 42
15      1       YRAU___ 81
16      1       YRAU___ 56
17      1       YRAU___ 81
1a      1       YRAU___ 55
2b7d6e294000-2b7d6e297000 rw-p 2b7d6e294000 00:00 0
2b7d6e294       3       Y_A_P__ 1
2b7d6e493000-2b7d6e495000 rw-p 0001c000 08:01 1563879                    /lib/ld-2.6.so
1c      2       Y_A_P__ 1
2b7d6e495000-2b7d6e4d0000 r-xp 00000000 08:01 1400920                    /lib/libsepol.so.1
0       1       YRAU___ 5
1       2       YRAU___ 3
3       1       YRAU___ 5
4       1       YRAU___ 3
30      1       YRAU___ 3
2b7d6e4d0000-2b7d6e6d0000 ---p 0003b000 08:01 1400920                    /lib/libsepol.so.1
2b7d6e6d0000-2b7d6e6d1000 rw-p 0003b000 08:01 1400920                    /lib/libsepol.so.1
3b      1       Y_A_P__ 1
2b7d6e6d1000-2b7d6e6db000 rw-p 2b7d6e6d1000 00:00 0
2b7d6e6db000-2b7d6e6f1000 r-xp 00000000 08:01 1400922                    /lib/libselinux.so.1
0       1       YRAU___ 9
1       3       YRAU___ 5
4       1       YRAU___ 4
a       1       YRAU___ 4
c       1       YRAU___ 3
f       1       YRAU___ 4
10      1       YRAU___ 3
12      2       YRAU___ 4
2b7d6e6f1000-2b7d6e8f0000 ---p 00016000 08:01 1400922                    /lib/libselinux.so.1
2b7d6e8f0000-2b7d6e8f2000 rw-p 00015000 08:01 1400922                    /lib/libselinux.so.1
15      2       Y_A_P__ 1
2b7d6e8f2000-2b7d6e8f3000 rw-p 2b7d6e8f2000 00:00 0
2b7d6e8f2       1       Y_A_P__ 1
2b7d6e8f3000-2b7d6ea40000 r-xp 00000000 08:01 1564031                    /lib/libc-2.6.so
0       2       YRAU___ 81
2       1       YRAU___ 80
3       1       YRAU___ 81
4       1       YRAU___ 72
5       1       YRAU___ 77
6       1       YRAU___ 79
7       1       YRAU___ 73
8       1       YRAU___ 79
9       1       YRAU___ 78
a       1       YRAU___ 77
b       1       YRAU___ 72
c       1       YRAU___ 75
d       1       YRAU___ 81
e       1       YRAU___ 72
f       1       YRAU___ 78
10      1       YRAU___ 81
11      1       YRAU___ 78
12      1       YRAU___ 80
13      1       YRAU___ 78
14      2       YRAU___ 81
16      1       YRAU___ 49
17      6       YRAU___ 41
1d      1       YRAU___ 80
2a      1       YRAU___ 44
2b      1       YRAU___ 69
2c      1       YRAU___ 28
31      1       YRAU___ 79
32      1       YRAU___ 49
33      1       YRAU___ 73
34      1       YRAU___ 57
35      1       YRAU___ 67
42      1       YRAU___ 77
43      3       YRAU___ 78
46      1       YRAU___ 77
47      1       YRAU___ 70
48      1       YRAU___ 15
4d      1       YRAU___ 78
5f      1       YRAU___ 78
60      1       YRAU___ 75
61      1       YRAU___ 72
62      1       YRAU___ 67
63      1       YRAU___ 59
68      1       YRAU___ 63
69      1       YRAU___ 61
6a      1       YRAU___ 63
6b      1       YRAU___ 75
6c      1       YRAU___ 76
6d      1       YRAU___ 81
6e      1       YRAU___ 77
6f      1       YRAU___ 79
70      1       YRAU___ 44
71      1       YRAU___ 79
72      1       YRAU___ 78
73      1       YRAU___ 79
74      1       YRAU___ 46
75      1       YRAU___ 78
76      1       YRAU___ 60
78      1       YRAU___ 79
79      1       YRAU___ 81
7a      1       YRAU___ 80
7e      1       YRAU___ 41
8a      1       YRAU___ 36
8b      1       YRAU___ 72
8c      1       YRAU___ 28
8d      1       YRAU___ 21
91      2       YRAU___ 19
99      1       YRAU___ 62
9a      1       YRAU___ 76
9b      1       YRAU___ 72
c4      1       YRAU___ 80
c5      1       YRAU___ 82
c6      1       YRAU___ 81
cb      1       YRAU___ 42
cc      1       YRAU___ 79
cd      1       YRAU___ 26
cf      1       YRAU___ 12
d0      1       YRAU___ 77
d1      1       YRAU___ 38
d2      1       YRAU___ 45
d3      1       YRAU___ 66
d4      1       YRAU___ 71
e0      1       YRAU___ 52
106     1       YRAU___ 33
107     1       YRAU___ 14
108     1       YRAU___ 63
109     1       YRAU___ 57
10b     1       YRAU___ 70
10c     1       YRAU___ 63
118     1       YRAU___ 65
119     1       YRAU___ 78
11a     1       YRAU___ 69
11b     1       YRAU___ 68
11e     2       YRAU___ 62
120     1       YRAU___ 74
121     1       YRAU___ 42
125     1       YRAU___ 17
2b7d6ea40000-2b7d6ec40000 ---p 0014d000 08:01 1564031                    /lib/libc-2.6.so
2b7d6ec40000-2b7d6ec43000 r--p 0014d000 08:01 1564031                    /lib/libc-2.6.so
14d     3       Y_A_P__ 1
2b7d6ec43000-2b7d6ec45000 rw-p 00150000 08:01 1564031                    /lib/libc-2.6.so
150     2       Y_A_P__ 1
2b7d6ec45000-2b7d6ec4b000 rw-p 2b7d6ec45000 00:00 0
2b7d6ec45       6       Y_A_P__ 1
2b7d6ec4b000-2b7d6ec4d000 r-xp 00000000 08:01 1564037                    /lib/libdl-2.6.so
0       1       YRAU___ 51
1       1       YRAU___ 39
2b7d6ec4d000-2b7d6ee4d000 ---p 00002000 08:01 1564037                    /lib/libdl-2.6.so
2b7d6ee4d000-2b7d6ee4f000 rw-p 00002000 08:01 1564037                    /lib/libdl-2.6.so
2       2       Y_A_P__ 1
2b7d6ee4f000-2b7d6ee50000 rw-p 2b7d6ee4f000 00:00 0
2b7d6ee4f       1       Y_A_P__ 1
7fff3c81d000-7fff3c832000 rw-p 7ffffffea000 00:00 0                      [stack]
7fffffffa       1       Y_A_P__ 1
7fffffffc       2       Y_A_P__ 1
7fffffffe       1       YRA_P__ 1
7fff3c9fe000-7fff3ca00000 r-xp 7fff3c9fe000 00:00 0                      [vdso]
0       1       YR_____ 55
#1 lore raw
Quoted 3 lines · Fengguang Wu

Inspired by Matt Mackall's pagemap patches and ideas, I worked up these textual interfaces that achieve the same goals. The patches run OK under different sized reads.

[...]

Quoted 89 lines

2b7d6e8f3000-2b7d6ea40000 r-xp 00000000 08:01 1564031 /lib/libc-2.6.so

0       2       YRAU___ 81
2       1       YRAU___ 80
3       1       YRAU___ 81
4       1       YRAU___ 72
5       1       YRAU___ 77
6       1       YRAU___ 79
7       1       YRAU___ 73
8       1       YRAU___ 79
9       1       YRAU___ 78
a       1       YRAU___ 77
b       1       YRAU___ 72
c       1       YRAU___ 75
d       1       YRAU___ 81
e       1       YRAU___ 72
f       1       YRAU___ 78
10      1       YRAU___ 81
11      1       YRAU___ 78
12      1       YRAU___ 80
13      1       YRAU___ 78
14      2       YRAU___ 81
16      1       YRAU___ 49
17      6       YRAU___ 41
1d      1       YRAU___ 80
2a      1       YRAU___ 44
2b      1       YRAU___ 69
2c      1       YRAU___ 28
31      1       YRAU___ 79
32      1       YRAU___ 49
33      1       YRAU___ 73
34      1       YRAU___ 57
35      1       YRAU___ 67
42      1       YRAU___ 77
43      3       YRAU___ 78
46      1       YRAU___ 77
47      1       YRAU___ 70
48      1       YRAU___ 15
4d      1       YRAU___ 78
5f      1       YRAU___ 78
60      1       YRAU___ 75
61      1       YRAU___ 72
62      1       YRAU___ 67
63      1       YRAU___ 59
68      1       YRAU___ 63
69      1       YRAU___ 61
6a      1       YRAU___ 63
6b      1       YRAU___ 75
6c      1       YRAU___ 76
6d      1       YRAU___ 81
6e      1       YRAU___ 77
6f      1       YRAU___ 79
70      1       YRAU___ 44
71      1       YRAU___ 79
72      1       YRAU___ 78
73      1       YRAU___ 79
74      1       YRAU___ 46
75      1       YRAU___ 78
76      1       YRAU___ 60
78      1       YRAU___ 79
79      1       YRAU___ 81
7a      1       YRAU___ 80
7e      1       YRAU___ 41
8a      1       YRAU___ 36
8b      1       YRAU___ 72
8c      1       YRAU___ 28
8d      1       YRAU___ 21
91      2       YRAU___ 19
99      1       YRAU___ 62
9a      1       YRAU___ 76
9b      1       YRAU___ 72
c4      1       YRAU___ 80
c5      1       YRAU___ 82
c6      1       YRAU___ 81
cb      1       YRAU___ 42
cc      1       YRAU___ 79
cd      1       YRAU___ 26
cf      1       YRAU___ 12
d0      1       YRAU___ 77
d1      1       YRAU___ 38
d2      1       YRAU___ 45
d3      1       YRAU___ 66
d4      1       YRAU___ 71
e0      1       YRAU___ 52
106     1       YRAU___ 33
107     1       YRAU___ 14
108     1       YRAU___ 63
109     1       YRAU___ 57
10b     1       YRAU___ 70
10c     1       YRAU___ 63
Quoted 8 lines
118     1       YRAU___ 65
119     1       YRAU___ 78
11a     1       YRAU___ 69
11b     1       YRAU___ 68
11e     2       YRAU___ 62
120     1       YRAU___ 74
121     1       YRAU___ 42
125     1       YRAU___ 17

Eh, I'd think that pivoting the data set would be a much more natural (& therefore shorter) representation.

YRAU___ 0,2:81 2:80 3:81 4:72 5:77 6:79 7:73 8:79 9:78 ...versus...

Quoted 9 lines
0       2       YRAU___ 81
2       1       YRAU___ 80
3       1       YRAU___ 81
4       1       YRAU___ 72
5       1       YRAU___ 77
6       1       YRAU___ 79
7       1       YRAU___ 73
8       1       YRAU___ 79
9       1       YRAU___ 78

So, flags followed by a list of offset[,length]:usage. If the flags change, start a new line. If you get a line that's too long, start a new line.

No?

#2 lore raw
Quoted 118 lines · Ray Lee
Quoted 3 lines · Fengguang Wu

Inspired by Matt Mackall's pagemap patches and ideas, I worked up these textual interfaces that achieve the same goals. The patches run OK under different sized reads.

[...]

Quoted 89 lines

2b7d6e8f3000-2b7d6ea40000 r-xp 00000000 08:01 1564031 /lib/libc-2.6.so

0       2       YRAU___ 81
2       1       YRAU___ 80
3       1       YRAU___ 81
4       1       YRAU___ 72
5       1       YRAU___ 77
6       1       YRAU___ 79
7       1       YRAU___ 73
8       1       YRAU___ 79
9       1       YRAU___ 78
a       1       YRAU___ 77
b       1       YRAU___ 72
c       1       YRAU___ 75
d       1       YRAU___ 81
e       1       YRAU___ 72
f       1       YRAU___ 78
10      1       YRAU___ 81
11      1       YRAU___ 78
12      1       YRAU___ 80
13      1       YRAU___ 78
14      2       YRAU___ 81
16      1       YRAU___ 49
17      6       YRAU___ 41
1d      1       YRAU___ 80
2a      1       YRAU___ 44
2b      1       YRAU___ 69
2c      1       YRAU___ 28
31      1       YRAU___ 79
32      1       YRAU___ 49
33      1       YRAU___ 73
34      1       YRAU___ 57
35      1       YRAU___ 67
42      1       YRAU___ 77
43      3       YRAU___ 78
46      1       YRAU___ 77
47      1       YRAU___ 70
48      1       YRAU___ 15
4d      1       YRAU___ 78
5f      1       YRAU___ 78
60      1       YRAU___ 75
61      1       YRAU___ 72
62      1       YRAU___ 67
63      1       YRAU___ 59
68      1       YRAU___ 63
69      1       YRAU___ 61
6a      1       YRAU___ 63
6b      1       YRAU___ 75
6c      1       YRAU___ 76
6d      1       YRAU___ 81
6e      1       YRAU___ 77
6f      1       YRAU___ 79
70      1       YRAU___ 44
71      1       YRAU___ 79
72      1       YRAU___ 78
73      1       YRAU___ 79
74      1       YRAU___ 46
75      1       YRAU___ 78
76      1       YRAU___ 60
78      1       YRAU___ 79
79      1       YRAU___ 81
7a      1       YRAU___ 80
7e      1       YRAU___ 41
8a      1       YRAU___ 36
8b      1       YRAU___ 72
8c      1       YRAU___ 28
8d      1       YRAU___ 21
91      2       YRAU___ 19
99      1       YRAU___ 62
9a      1       YRAU___ 76
9b      1       YRAU___ 72
c4      1       YRAU___ 80
c5      1       YRAU___ 82
c6      1       YRAU___ 81
cb      1       YRAU___ 42
cc      1       YRAU___ 79
cd      1       YRAU___ 26
cf      1       YRAU___ 12
d0      1       YRAU___ 77
d1      1       YRAU___ 38
d2      1       YRAU___ 45
d3      1       YRAU___ 66
d4      1       YRAU___ 71
e0      1       YRAU___ 52
106     1       YRAU___ 33
107     1       YRAU___ 14
108     1       YRAU___ 63
109     1       YRAU___ 57
10b     1       YRAU___ 70
10c     1       YRAU___ 63
Quoted 8 lines
118     1       YRAU___ 65
119     1       YRAU___ 78
11a     1       YRAU___ 69
11b     1       YRAU___ 68
11e     2       YRAU___ 62
120     1       YRAU___ 74
121     1       YRAU___ 42
125     1       YRAU___ 17

Eh, I'd think that pivoting the data set would be a much more natural (& therefore shorter) representation.

YRAU___ 0,2:81 2:80 3:81 4:72 5:77 6:79 7:73 8:79 9:78 ...versus...

Quoted 9 lines
0       2       YRAU___ 81
2       1       YRAU___ 80
3       1       YRAU___ 81
4       1       YRAU___ 72
5       1       YRAU___ 77
6       1       YRAU___ 79
7       1       YRAU___ 73
8       1       YRAU___ 79
9       1       YRAU___ 78
Quoted 5 lines

So, flags followed by a list of offset[,length]:usage. If the flags change, start a new line. If you get a line that's too long, start a new line.

No?

It's an interesting suggestion: the compression ratio could be doubled on average. Thank you!

However I still appreciate the 'beauty' of tabbed output ;-)

I'm working on an interface with similar output(see filecache below). It is less likely to be improved by the new format - and I want the two interfaces to be consistent.

As for the format, I'm not quite sure of two things:
- should hex values be used for offset/len?
Hex values are less user friendly but more consistent with the format of maps. For example, the 001bc000/1bc, 007d1000/7d1 below:
007bc000-007d1000 rw-p 001bc000 08:01 199284 /usr/bin/Xorg

                       ^^^^^
1bc     1       YR_U___ 1
^^^
1bd     5       Y_A_P__ 1
1c3     3       Y_A_P__ 1
1c6     5       YR_U___ 1
1cb     1       Y_A_P__ 1
1cc     1       YR_U___ 1
1cd     4       Y_A_P__ 1
007d1000-0108a000 rw-p 007d1000 00:00 0                                  [heap]
                       ^^^^^
7d1     4       Y_A_P__ 1
^^^
7d6     3       Y_A_P__ 1
7da     5       Y_A_P__ 1
7e0     41      Y_A_P__ 1

- should the page size be printed as a file header(offset/len are in page units)? e.g.

# page size 4096
...
But it is also available via the getpagesize() call.

I'd appreciate it a lot if you or other people could give advices on them.

Thank you,
Fengguang
---

filecache: show cached files and their cached pages
===================================================

bash-3.2# cat /proc/filecache

# filecache 1.0
#      ino    cached cached% refcnt state   dev          file
         0       568       0      0    --   00:02(bdev)  (03:00)
    176359      1164      95      2    d-   03:00(hda)   /lib/libc-2.3.6.so
    176355        92     100      2    d-   03:00(hda)   /lib/ld-2.3.6.so
     96199        12     100      0    d-   03:00(hda)   /bin/cat
     32286         4     100      0    --   03:00(hda)   /etc/mtab
     96194        40     100      0    d-   03:00(hda)   /bin/mount
    529061         4     100      0    --   03:00(hda)   /usr/share/terminfo/l/linux
     48099         4     100      0    --   03:00(hda)   /.bash_history
    176633        40     100      1    --   03:00(hda)   /lib/libnss_files-2.3.6.so
    176635        36     100      1    --   03:00(hda)   /lib/libnss_nis-2.3.6.so
    176630        76     100      1    --   03:00(hda)   /lib/libnsl-2.3.6.so
    176631        36     100      1    --   03:00(hda)   /lib/libnss_compat-2.3.6.so
    176362        12     100      1    --   03:00(hda)   /lib/libdl-2.3.6.so
    176690       264     100      1    --   03:00(hda)   /lib/libncurses.so.5.5
     96202       244     100      0    --   03:00(hda)   /bin/bash
        73       568     100      1    --   00:01(rootfs)        /dev/root
bash-3.2# echo /lib/libc-2.3.6.so > /proc/filecache
bash-3.2# cat /proc/filecache
# file /lib/libc-2.3.6.so
# flags R:referenced A:active U:uptodate D:dirty W:writeback M:mmap
# idx   len     state   refcnt
0       16      RAU__M  3
16      3       __U___  1
19      1       R_U__M  2
1a      5       __U___  1
1f      1       RAU__M  3
20      1       __U___  1
21      1       R_U__M  2
22      2       RAU__M  3
24      1       R_U__M  2
25      1       __U___  1
26      1       RAU__M  3
27      2       __U___  1
29      2       RAU__M  2
2b      2       RAU__M  3
2d      2       R_U__M  2
2f      9       __U___  1
38      1       R_U__M  2
39      1       __U___  1
3a      5       RAU__M  2
3f      1       R_U__M  2
40      4       __U___  1
44      1       RAU__M  2
45      3       __U___  1
48      6       R_U__M  2
4e      4       __U___  1
52      1       R_U__M  2
53      2       RAU__M  2
55      1       R_U__M  2
56      2       RAU__M  2
58      1       R_U__M  2
59      2       __U___  1
5b      1       RAU__M  2
5c      1       R_U__M  2
5d      5       RAU__M  2
62      1       RAU__M  3
63      2       RAU__M  2
65      1       R_U___  1
66      3       RAU__M  2
69      1       __U___  1
6a      3       RAU__M  3
6d      1       R_U__M  2
6e      3       __U___  1
71      1       R_U__M  2
72      c       __U___  1
7e      1       R_U__M  2
7f      9       __U___  1
88      2       R_U__M  2
8a      1       __U___  1
8b      1       R_U__M  2
8c      2       RAU__M  2
8e      1       R_U__M  2
8f      9       __U___  1
9f      f       __U___  1
ae      2       RAU__M  2
b0      9       __U___  1
b9      2       RAU__M  3
bb      1       RAU__M  2
bc      4       __U___  1
c0      2       RAU__M  3
c2      1       R_U__M  2
c3      2       __U___  1
c5      1       RAU__M  2
c6      2       R_U__M  2
c8      1       RAU__M  3
c9      1       RAU__M  2
ca      c       __U___  1
d6      1       RAU__M  3
d7      3       __U___  1
da      3       R_U__M  2
dd      f       __U___  1
f3      5       __U___  1
f8      4       R_U__M  2
fc      1       __U___  1
fd      2       R_U__M  2
ff      1       RAU__M  3
100     1       R_U__M  2
101     2       __U___  1
103     1       RAU__M  3
104     5       __U___  1
109     1       RAU__M  3
10a     a       __U___  1
114     1       RAU__M  2
115     1       RAU__M  3
116     1       __U___  1
117     1       RAU__M  2
118     2       R_U__M  2
11a     2       __U___  1
11c     1       RAU__M  3
11d     1       RAU__M  2
11e     1       RAU__M  3
11f     2       R_U__M  2
121     1       __U___  1
122     1       R_U__M  2
123     4       __U___  1
127     4       RAU___  1
12b     6       __U___  1