文章

内存分析需要理解的几个概念

top_memory_info

“真实的” 内存空闲率 = (free + shared + buffers + cached)/ Total = 5860 M / 7983M X 100 % = 73.4 %

1. Linux内存分类

  • 匿名内存:存储用户计算过程中间的数据,与物理磁盘上的文件无关;
  • File-Backed内存:用作磁盘高速缓存,其物理内存与物理磁盘上的文件对应;

1.1 Shmem

包括:

  • shared memory.
  • tmpfs:所使用的内存(基于内存的文件系统)。Linux将空闲内存用于缓存,并且在需要的时候,回收这些内存。
  • devtmpfs:指的是/dev文件系统,/dev目录下所有的文件占用的空间也属于共享内存。

1.2 buffers & cache

  1. buffers: 用于块设备I/O缓存;
  2. cachedpage cache,用于文件系统(读取文件时,kernel创建的缓存);

使用top命令查看时,bufferscached通常合并在一起显示,他们都是kernel使用的缓存。在需要的时候,可以被回收。

2. 查看内存使用情况

2.1 内存利用率详细信息

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
35
36
37
38
39
40
41
42
43
cat /proc/meminfo

MemTotal:        8174352 kB
MemFree:          376952 kB
Buffers:          527412 kB
Cached:          5178924 kB
SwapCached:           60 kB
Active:          3061760 kB
Inactive:        4066588 kB
Active(anon):    1112780 kB
Inactive(anon):   314156 kB
Active(file):    1948980 kB
Inactive(file):  3752432 kB
Unevictable:        6724 kB
Mlocked:            6724 kB
SwapTotal:      16779884 kB
SwapFree:       16777400 kB
Dirty:               376 kB
Writeback:             0 kB
AnonPages:       1428844 kB
Mapped:            64632 kB
Shmem:               644 kB
Slab:             557384 kB
SReclaimable:     338272 kB
SUnreclaim:       219112 kB
KernelStack:        4024 kB
PageTables:        12440 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    20867060 kB
Committed_AS:    2406484 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      111536 kB
VmallocChunk:   34359455060 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        6384 kB
DirectMap2M:     2080768 kB
DirectMap1G:     6291456 kB

2.2 查看进程内存占用

有用的信息:

  • VmData:data段大小;
  • VmExe:text段大小;
  • Vmlib:共享库占用内存空间大小;
  • VmRSS:物理内存使用量;
  • VMSwap:交换分区使用量;
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
35
36
37
38
cat /proc/30029/status
Name:	java
State:	S (sleeping)
Tgid:	30029
Pid:	30029
PPid:	29983
TracerPid:	0
Uid:	54322	54322	54322	54322
Gid:	54323	54323	54323	54323
FDSize:	8192
Groups:	10 54323
VmPeak:	 2754032 kB
VmSize:	 2678836 kB
VmLck:	       0 kB
VmHWM:	 1337912 kB
VmRSS:	 1337512 kB
VmData:	 2575692 kB
VmStk:	    1012 kB
VmExe:	      60 kB
VmLib:	  101564 kB
VmPTE:	    3048 kB
Threads:	98
SigQ:	0/63825
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000004
SigIgn:	0000000000000001
SigCgt:	1000000180005cce
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
CapBnd:	ffffffffffffffff
Cpus_allowed:	ffffffff
Cpus_allowed_list:	0-31
Mems_allowed:	00000000,
Mems_allowed_list:	0
voluntary_ctxt_switches:	12468
nonvoluntary_ctxt_switches:	19

2.3 pmap 命令

执行 ps aux 后输出的各进程的 RSS (resident set size), 表示进程占用内存的大小,单位是KB。 需要注意的是, RSS 值实际上是基于 pmap 命令,表示该进程正在使用的物理内存的总和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pmap -x 30029
30029:   /slview/jdk150/jdk1.5.0_06/bin/java -com.apache.Test
Address           Kbytes     RSS   Dirty Mode   Mapping
0000000008048000      60      48       0 r-x--  java
0000000008057000       8       8       8 rwx--  java
0000000009f1d000   23184   23140   23140 rwx--    [ anon ]
000000004d1f1000     108      96       0 r-x--  ld-2.5.so
000000004d20c000       4       4       4 r-x--  ld-2.5.so
000000004d20d000       4       4       4 rwx--  ld-2.5.so
000000004d214000    1356     548       0 r-x--  libc-2.5.so
000000004d367000       8       8       8 r-x--  libc-2.5.so
00007f581e51d000      16      16       0 r--s-  huanan-product-2.6.1-snapshots.jar
00007f581e521000      24      24       0 r--s-  dt.jar
00007f581e527000      36      36       0 r--s-  gnome-java-bridge.jar
00007f581e530000      32      32       8 rw-s-  13228
00007f581e538000       4       4       4 rw---    [ anon ]
00007f581e539000       4       4       0 r----    [ anon ]
00007f581e53a000       8       8       8 rw---    [ anon ]
00007fffe9eb7000      84      32      32 rw---    [ stack ]
00007fffe9fff000       4       4       0 r-x--    [ anon ]
ffffffffff600000       4       0       0 r-x--    [ anon ]
(部分省略)
----------------  ------  ------  ------
total kB         2484196   36180   26880

3. 参考资料

kernel内存分配学习文档:

本文由作者按照 CC BY 4.0 进行授权