0%

Linux内存相关的测试工具

smem

1
2
3
4
  PID User     Command                         Swap      USS      PSS      RSS 
40200 test bash 0 524.0K 687.0K 3.1M
39757 test bash 0 524.0K 692.0K 3.2M
40203 test /usr/bin/python /usr/bin/sm 0 6.1M 6.2M 7.7M

运行smem -k命令可以看到系统里进程占用内存的情况。如上各个SS的含义是:

USS: unique set size. 表示的是进程独占的物理内存,不包含动态库占的内存。
PSS: proportional set size. 进程自己的物理内存 + 动态库折算到进程里的内存。
RSS: resident set size. 进程实际使用的物理内存,包括共享库内存。
VSS: virtual set size. 进程使用的所有虚拟内存,包括共享库虚拟内存。

/proc/buddyinfo

1
2
3
4
Node 1, zone      DMA     10     12     11     11     13     11     10     10      6      6    226 
Node 1, zone DMA32 1 0 1 1 4 2 4 3 4 4 176
Node 1, zone Normal 15807 52091 12723 877 258 703 579 194 35 34 5546
Node 3, zone Normal 54266 41801 23819 10038 3476 641 65 29 13 19 6714

表示系统里伙伴系统中,2^1, 2^2…连续页有多少个,这个可以看到伙伴系统内存碎片的
情况。

/sys/kernel/mm/*

1
2
3
4
├── hugepages
├── ksm
├── swap
└── transparent_hugepage

可以看到如上各个特性的一些统计值。

pidof + pmap + /proc/pid/maps /proc/pid/smaps /proc/pid/stack

./a.out &
pmap -x pidof a.out

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
41677:   ./a.out
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 4 4 0 r-x-- a.out
0000000000400000 0 0 0 r-x-- a.out
0000000000410000 4 4 4 r---- a.out
0000000000410000 0 0 0 r---- a.out
0000000000411000 4 4 4 rw--- a.out
0000000000411000 0 0 0 rw--- a.out
0000ffff8dac8000 1204 480 0 r-x-- libc-2.23.so
0000ffff8dac8000 0 0 0 r-x-- libc-2.23.so
0000ffff8dbf5000 60 0 0 ----- libc-2.23.so
0000ffff8dbf5000 0 0 0 ----- libc-2.23.so
0000ffff8dc04000 16 16 16 r---- libc-2.23.so
0000ffff8dc04000 0 0 0 r---- libc-2.23.so
0000ffff8dc08000 8 8 8 rw--- libc-2.23.so
0000ffff8dc08000 0 0 0 rw--- libc-2.23.so
0000ffff8dc0a000 16 8 8 rw--- [ anon ]
0000ffff8dc0a000 0 0 0 rw--- [ anon ]
0000ffff8dc0e000 112 112 0 r-x-- ld-2.23.so
0000ffff8dc0e000 0 0 0 r-x-- ld-2.23.so
0000ffff8dc2b000 8 8 8 rw--- [ anon ]
0000ffff8dc2b000 0 0 0 rw--- [ anon ]
0000ffff8dc37000 8 0 0 r---- [ anon ]
0000ffff8dc37000 0 0 0 r---- [ anon ]
0000ffff8dc39000 4 4 0 r-x-- [ anon ]
0000ffff8dc39000 0 0 0 r-x-- [ anon ]
0000ffff8dc3a000 4 4 4 r---- ld-2.23.so
0000ffff8dc3a000 0 0 0 r---- ld-2.23.so
0000ffff8dc3b000 8 8 8 rw--- ld-2.23.so
0000ffff8dc3b000 0 0 0 rw--- ld-2.23.so
0000ffffc48f9000 132 12 12 rw--- [ stack ]
0000ffffc48f9000 0 0 0 rw--- [ stack ]
---------------- ------- ------- -------
total kB 1592 672 72

/proc/pid/smaps反应一个进程里的各个vma里的信息。提供的信息比/proc/pid/maps多

numastat -p

1
2
3
4
5
6
7
8
9
Per-node process memory usage (in MBs) for PID 417 (a.out)
Node 0 Node 1 Total
--------------- --------------- ---------------
Huge 0.00 0.00 0.00
Heap 0.01 0.00 0.01
Stack 0.00 0.00 0.01
Private 0.17 0.40 0.57
---------------- --------------- --------------- ---------------
Total 0.18 0.41 0.59

可以看到一个进程在各个numa节点上的内存使用情况,可以用这个命令观察一段时间进程
的内存在各个numa之间使用的情况。

mallopt

C库中设定内存分配配置的接口, 通过mallopt这个函数可以改变malloc/free的行为。

mbind/madvise

mbind是对应系统调用的封装,可以把虚拟内存对应的物理内存和对应的numa节点绑定。
madvise也是对应系统调用的封装,可以从用户态传递一些内存相关的属性给内核。

getrusage

getrusage是一个库函数,可以得到一个进程的相关资源的使用情况。其中包括内存使用
的统计。比如其中,ru_minflt就是系统里初次分配内存这种缺页的次数,而ru_majflt
是从swap分区里换入内存这样缺页的数目。

proc下的关于内存的信息

/proc/slabinfo
/proc/iomem
/proc/meminfo
/proc/vmstat
/proc/zoneinfo
/proc/vmallocinfo
/proc/sys/vm/*