这篇文章上次修改于 899 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

1 内存性能指标

  • 系统内存指标

    • 应用内存
    • 剩余内存
    • 可用内存:新进程可以使用的最大内存,包括了剩余内存和可回收缓存。
    • 共享内存:通过 tmpfs 实现。
    • 缓存/缓冲区:缓存包括对文件页的缓存和 Slab 分配器中的可回收内存。缓冲区是原始磁盘块的临时存储。
    • 缺页异常

      • 主缺页异常:需要磁盘 I/O 介入(比如 Swap)。
      • 次缺页异常:可直接从物理内存中分配。
  • 进程内存指标

    • 虚拟内存(VSS):包括了代码段,数据段,共享内存,已经申请的堆和已经换出的内存。
    • 常驻内存(RSS):进程实际使用的物理内存,不包括共享内存和 Swap。
    • 共享内存:包括与其它进程共用的共享内存,动态库和代码段等。
    • SWAP 内存:通过 Swap 缓存到磁盘的内存。
    • 缺页异常:包括主缺页异常和次缺页异常。
  • SWAP

    • 已用空间
    • 剩余空间
    • 换入速度
    • 换出速度

2 内存性能工具

2.1 根据工具查指标

2.1.1 free, /proc/meminfo

系统已用、可用、剩余内存,缓存和缓冲区的使用量。

$ free
              total        used        free      shared  buff/cache   available
Mem:        8169348      263524     6875352         668     1030472     7611064
Swap:             0           0           0

2.1.2 vmstat

系统剩余内存、缓存、缓冲区、换入、换出。

# 每隔1秒输出1组数据
$ 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
0  0      0 7743608   1112  92168    0    0     0     0   52  152  0  1 100  0  0
 0  0      0 7743608   1112  92168    0    0     0     0   36   92  0  0 100  0  0

2.1.3 sar

系统内存换页情况、内存使用率、缓存和缓冲区使用量及 Swap 使用情况。

# 间隔1秒输出一组数据
# -r表示显示内存使用情况,-S表示显示Swap使用情况
$ sar -r -S 1
04:39:56    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
04:39:57      6249676   6839824   1919632     23.50    740512     67316   1691736     10.22    815156    841868         4

04:39:56    kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
04:39:57      8388604         0      0.00         0      0.00

04:39:57    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
04:39:58      6184472   6807064   1984836     24.30    772768     67380   1691736     10.22    847932    874224        20

04:39:57    kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
04:39:58      8388604         0      0.00         0      0.00

…


04:44:06    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
04:44:07       152780   6525716   8016528     98.13   6530440     51316   1691736     10.22    867124   6869332         0

04:44:06    kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
04:44:07      8384508      4096      0.05        52      1.27

2.1.3 top, ps

进程虚拟内存,常驻,共享内存和缺页异常。

$ top
top - 19:05:19 up 186 days, 23:06,  1 user,  load average: 0.02, 0.18, 0.13
Tasks: 105 total,   1 running, 104 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1882020 total,   127000 free,   683948 used,  1071072 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1013712 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1 root      20   0  191192   3808   2288 S  0.0  0.2  13:31.74 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:06.55 kthreadd
    4 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0       0      0      0 S  0.0  0.0   5:15.94 ksoftirqd/0
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2 191192  3808 ?        Ss   4月03  13:31 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    4月03   0:06 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   4月03   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    4月03   5:15 [ksoftirqd/0]
root         7  0.0  0.0      0     0 ?        S    4月03   0:00 [migration/0]
root         8  0.0

2.1.4 cachestat

系统缓存和缓冲区命中率。

$ cachestat 1 3
   TOTAL   MISSES     HITS  DIRTIES   BUFFERS_MB  CACHED_MB
       2        0        2        1           17        279
       2        0        2        1           17        279
       2        0        2        1           17        279 

2.1.5 cachetop

进程缓存和缓冲区命中率。

$ cachetop
11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID      UID      CMD              HITS     MISSES   DIRTIES  READ_HIT%  WRITE_HIT%
   13029 root     python                  1        0        0     100.0%       0.0%

2.1.6 其它

pmap:进程地址空间和内存使用情况。

valgrind:进程内存错误检查工具。

memleak:内存泄露检查工具。

pcstat:查看指定文件的缓存情况。

2.2 根据性能指标查工具

系统已用,可用,剩余内存:free,vmstat,sar、/proc/meminfo

进程虚拟内存、常驻、共享内存:top、ps

进程内存分布:pmap

进程 Swap 换出内存:top、/proc/pid/status

进程缺页异常:ps、top

系统换页情况:sar

缓存、缓冲区使用量:free、vmstat、sar、cachestat

缓存/缓冲区命中率:cachetop

SWAP 已用空间和剩余空间:free、sar

内存泄露检测:memleak、valgrind

指定文件的缓存大小:pcstat

3 如何迅速分析内存的性能瓶颈

  • 先用 free 和 top 查看系统整体内存的使用情况
  • 再用 vmstat 和 pidstat 观察一段时间趋势,判断内存问题类型。
  • 进行详细分析,如内存分配分析,缓存/缓冲区分析,具体进程的内存使用分析等。

参考

倪朋飞. Linux 性能优化实战.