内存使用分析

操作系统级别

/proc/meminfo

其中的Buffers和Cached的迷惑性非常大,非常难理解。Buffers是指的磁盘数据的缓存,Cached是指对文件数据的缓存.

free

该命令实际上是通过读取/proc/meminfo文件得到的如下输出

1
2
3
4
$ free -h
              total        used        free      shared  buff/cache   available
Mem:            30G         22G        412M         47M        7.6G        7.3G
Swap:            0B          0B          0B

具体列含义:

  • total: 总内存大小
  • used:已经使用的内存大小,包含共享内存
  • free:未使用的内存大小
  • shared:共享内存大小
  • buff/cache:缓存和缓冲区的大小
  • available:新进程可用的内存大小

vmstat

1
2
3
4
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 4  0      0 1091484 1142360 34545436    0    0   146   265    0    0  8  5 86  1  0

容器级别

通过kubectl命令来查看内存使用

1
2
3
$ kubectl top pod nginx-ingress-controller-85cd6c7b5d-md6vc
NAME                                        CPU(cores)   MEMORY(bytes)
nginx-ingress-controller-85cd6c7b5d-md6vc   22m          502Mi

通过docker stats命令来查看容器

1
2
3
$ docker stats $container_id
CONTAINER ID  NAME                CPU %   MEM USAGE / LIMIT   MEM %  NET I/O   BLOCK I/O           PIDS
97d8bff3f89f  k8s_nginx-ingress   6.33%   180.3MiB / 512MiB   35.21% 0B / 0B   0B / 0B             119

docker通过cgroup的统计数据来获取的内存值

参考文档:https://docs.docker.com/engine/reference/commandline/stats/

进程级别

具体的含义可以通过下文的/proc/$pid/status来查看,其他进程的内存含义

cat /proc/$pid/status

 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
44
45
46
47
48
49
cat status
Name:   nginx
Umask:  0022
State:  S (sleeping)
Tgid:   46787
Ngid:   0
Pid:    46787
PPid:   33
TracerPid:      0
Uid:    1000    1000    1000    1000
Gid:    19062   19062   19062   19062
FDSize: 128
Groups:
VmPeak:   559768 kB
VmSize:   559120 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:    285240 kB
VmRSS:    284752 kB
RssAnon:          279016 kB
RssFile:            3420 kB
RssShmem:           2316 kB
VmData:   371784 kB
VmStk:       136 kB
VmExe:      4716 kB
VmLib:      6828 kB
VmPTE:       900 kB
VmSwap:        0 kB
Threads:        33
SigQ:   1/123857
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000040001000
SigCgt: 0000000198016eef
CapInh: 0000001fffffffff
CapPrm: 0000000000000400
CapEff: 0000000000000400
CapBnd: 0000001fffffffff
CapAmb: 0000000000000000
NoNewPrivs:     0
Seccomp:        0
Speculation_Store_Bypass:       vulnerable
Cpus_allowed:   0001
Cpus_allowed_list:      0
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        343464
nonvoluntary_ctxt_switches:     35061

具体字段含义可以查看man文档:https://man7.org/linux/man-pages/man5/proc.5.html,跟内存相关的字段如下:

  • VmRSS:虚拟内存驻留在物理内存中的部分大小
  • VmHWM:使用物理内存的峰值
  • VmData:进程占用的数据段大小

top命令查看

1
2
3
$ top -p $pid
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  46787 www-data  20   0  559120 286544   5740 S   1.3  0.9   2:43.64 nginx

具体列含义如下:

  • VIRT:进程使用虚拟内存总大小,即使没有占用物理内存,包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换到swap空间的内存等
  • RES: 进程实际使用的物理内存大小,不包括swap和共享内存
  • SHR:与其他进程的共享内存、加载的动态链接库、程序代码段的大小
  • MEM:进程使用的物理内存占系统总内存的百分比

ps命令查看

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data       1  0.0  0.0    212     8 ?        Ss   Apr09   0:00 /usr/bin/dumb-init -- /nginx-ingress-controller
www-data       6  0.9  0.3 813500 99644 ?        Ssl  Apr09  67:32 /nginx-ingress-controller
www-data      33  0.0  0.7 458064 242252 ?       S    Apr09   0:53 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
www-data   46786  0.0  0.7 459976 239996 ?       S    17:57   0:00 rollback logs/eagleeye.log interval=60 adjust=600
www-data   46787  1.3  0.8 559120 284452 ?       Sl   17:57   2:22 nginx: worker process
www-data   46788  1.0  0.8 558992 285168 ?       Sl   17:57   1:51 nginx: worker process
www-data   46789  0.0  0.7 452012 237152 ?       S    17:57   0:01 nginx: cache manager process
www-data   46790  0.0  0.8 490832 267600 ?       S    17:57   0:00 nginx: x
www-data   47533  0.0  0.0  60052  1832 pts/2    R+   20:50   0:00 ps aux
  • RSS:虚拟内存中的常驻内存,即实际占用的物理内存,包括所有已经分配的堆内存、栈内存、共享内存,由于共享内存非独占,实际上进程独占的物理内存要少于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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# pmap -x 452021
452021:   nginx: worker process
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000    4716    1540       0 r-x-- tengine
0000000000a9a000      20      16       4 r---- tengine
0000000000a9f000     212     196     176 rw--- tengine
0000000000ad4000     248      60      60 rw---   [ anon ]
00002b0da6cb0000     136       4       0 r-x-- ld-2.17.so
00002b0da6cd2000       4       4       4 rw---   [ anon ]
00002b0da6cd3000       4       4       4 rw-s- zero (deleted)
00002b0da6cd7000      28      24      24 rw---   [ anon ]
00002b0da6cde000      64       8       8 rwx--   [ anon ]
00002b0da6ed1000       4       4       4 r---- ld-2.17.so
00002b0da6ed2000       4       4       4 rw--- ld-2.17.so
00002b0da6ed3000       4       4       4 rw---   [ anon ]
00002b0da6ed4000       8       0       0 r-x-- libdl-2.17.so
00002b0da70d8000      92      32       0 r-x-- libpthread-2.17.so
00002b0da72f0000      16       4       4 rw---   [ anon ]
00002b0da72f4000      32       0       0 r-x-- libcrypt-2.17.so
00002b0da72fc000    2044       0       0 ----- libcrypt-2.17.so
00002b0da74fb000       4       4       4 r---- libcrypt-2.17.so
00002b0da74fc000       4       4       4 rw--- libcrypt-2.17.so
00002b0da74fd000     184       0       0 rw---   [ anon ]
00002b0da752b000    1028       8       0 r-x-- libm-2.17.so
00002b0da7a35000     760     372       0 r-x-- libssl.so.1.1
00002b0da7d03000    2812    1124       0 r-x-- libcrypto.so.1.1
00002b0da7fc2000    2044       0       0 ----- libcrypto.so.1.1
00002b0da81c1000     172     172     172 r---- libcrypto.so.1.1
00002b0da81ec000      12      12      12 rw--- libcrypto.so.1.1
00002b0da81ef000      16       8       8 rw---   [ anon ]
00002b0da81f3000      84      40       0 r-x-- libgcc_s-4.8.5-20150702.so.1
00002b0da8409000    1808     316       0 r-x-- libc-2.17.so
00002b0da85cd000    2044       0       0 ----- libc-2.17.so
00002b0da87cc000      16      16      16 r---- libc-2.17.so
00002b0da87d0000       8       8       8 rw--- libc-2.17.so
00002b0da87d2000      20      12      12 rw---   [ anon ]
00002b0da87d7000       8       0       0 r-x-- libfreebl3.so
00002b0da87d9000    2044       0       0 ----- libfreebl3.so
00002b0da89d8000       4       4       4 r---- libfreebl3.so
00002b0da89d9000       4       4       4 rw--- libfreebl3.so
00002b0da8a00000   24576   21936   21936 rw---   [ anon ]
00002b0daa200000    8192    8180    8180 rw---   [ anon ]
00002b0daaa00000    8192    8192    8192 rw---   [ anon ]
00002b0dab200000    8192    8192    8192 rw---   [ anon ]
00002b0daba00000    8192    8172    8172 rw---   [ anon ]
00002b0dac200000    4096    4096    4096 rw---   [ anon ]
00002b0dac600000    4096    4096    4096 rw---   [ anon ]
00002b0daca00000    4096      12      12 rw-s- zero (deleted)
00002b0dace00000    1024       0       0 rw-s- zero (deleted)
00002b0dacf00000    1024       0       0 rw-s- zero (deleted)
00002b0dad000000   16384   16384   16384 rw---   [ anon ]
00002b0dae000000   10240       0       0 rw-s- zero (deleted)
00002b0db3f00000      24      16       0 r-x-- cjson.so
00002b0db3f06000    2048       0       0 ----- cjson.so
00002b0db4106000       4       4       4 r---- cjson.so
00002b0db4107000       4       4       4 rw--- cjson.so
00002b0db4108000       8       0       0 r-x-- librestychash.so
00002b0db410a000    2044       0       0 ----- librestychash.so
00002b0db4309000       4       4       4 r---- librestychash.so
00002b0db430a000       4       4       4 rw--- librestychash.so
00002b0db430b000   10240    1784    1784 rw-s- zero (deleted)
00002b0db4d0b000   10240       0       0 rw-s- zero (deleted)
00002b0db5800000    6144    6144    6144 rw---   [ anon ]
00002b0db5e00000    6144    6144    6144 rw---   [ anon ]
00002b0db6400000    8192    8192    8192 rw---   [ anon ]
00002b0db6c0b000    5120       8       8 rw-s- zero (deleted)
00002b0db7200000    8192    8192    8192 rw---   [ anon ]
00002b0dc2800000    1024       0       0 rw-s- zero (deleted)
00002b0dc2900000   10240       0       0 rw-s- zero (deleted)
00002b0dc3300000   10240       0       0 rw-s- zero (deleted)
00002b0dc861f000    2048       8       8 rw---   [ anon ]
00002b0dc881f000       4       0       0 -----   [ anon ]
00002b0dc8820000    2048       8       8 rw---   [ anon ]
00007fff60f6c000     136      44      44 rw---   [ stack ]
00007fff60fdd000       8       4       0 r-x--   [ anon ]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB          558996  289376  285888
  • Mapping: 支持如下值
    • [anon]:分配的内存