第63集:内存监控工具

教学目标

  • 了解Linux系统中内存监控的重要性和核心指标
  • 掌握常用的内存监控工具的使用方法和参数
  • 学会解读监控工具的输出信息,识别内存性能瓶颈
  • 掌握内存监控数据的分析方法和优化建议
  • 了解不同场景下选择合适的内存监控工具的策略
  • 培养系统的内存性能分析和故障排查能力

主要知识点

1. 内存监控的基本概念

1.1 内存监控的核心指标

  • 内存使用率:已使用内存、空闲内存、缓冲内存、缓存内存
  • 交换空间使用:交换分区的使用情况
  • 内存分页:页面调入/调出次数、缺页中断次数
  • 内存分配:进程内存使用情况、内存泄漏检测

1.2 内存监控的重要性

  • 性能优化:识别内存瓶颈,优化应用程序和系统配置
  • 故障排查:当系统响应缓慢时,确定是否由内存资源不足引起
  • 容量规划:根据内存使用趋势,合理规划系统扩容
  • 资源分配:确保关键应用获得足够的内存资源
  • 内存泄漏检测:发现应用程序中的内存泄漏问题

1.3 Linux内存管理的基本原理

  • 物理内存:系统实际安装的RAM
  • 虚拟内存:包括物理内存和交换空间
  • 内存分页:将内存分为固定大小的页,便于管理
  • 内存分配:内核为进程分配内存页
  • 内存回收:当内存不足时,内核回收不常用的内存页
  • 缓存机制:使用缓存提高系统性能

2. 常用内存监控工具

2.1 free命令

命令介绍

free是最常用的内存监控工具之一,它显示系统的内存使用情况,包括物理内存、交换空间和内核缓冲区的使用情况。

基本用法
free
输出解释
              total        used        free      shared  buff/cache   available
Mem:       16384000     4096000     8192000      102400     4096000    11264000
Swap:       8192000          0     8192000
  • 第一行:内存使用情况

    • total:总内存大小
    • used:已使用的内存大小
    • free:空闲内存大小
    • shared:共享内存大小
    • buff/cache:缓冲区和缓存的大小
    • available:可用内存大小,估计有多少内存可用于启动新应用
  • 第二行:交换空间使用情况

    • total:总交换空间大小
    • used:已使用的交换空间大小
    • free:空闲交换空间大小
实用参数
  • -h:以人类可读的格式显示(如MB、GB)

    free -h
  • -m:以MB为单位显示

    free -m
  • -g:以GB为单位显示

    free -g
  • -s:指定刷新间隔,单位为秒

    free -s 2  # 每2秒刷新一次
  • -t:显示总计行

    free -t

2.2 top命令

命令介绍

top不仅可以监控CPU使用情况,还可以监控内存使用情况,它实时显示系统的内存使用情况和进程的内存使用情况。

基本用法
top
内存相关输出解释
MiB Mem :  16384.0 total,   8192.0 free,   4096.0 used,   4096.0 buff/cache
MiB Swap:   8192.0 total,   8192.0 free,      0.0 used.  11264.0 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
12345 root      20   0  100000  50000  20000 R  10.0   0.3   0:05.00 nginx
67890 user      20   0   50000  25000  10000 S   5.0   0.2   0:02.50 sshd
  • 第四行:内存使用情况

    • total:总内存大小
    • free:空闲内存大小
    • used:已使用的内存大小
    • buff/cache:缓冲区和缓存的大小
  • 第五行:交换空间使用情况

    • total:总交换空间大小
    • free:空闲交换空间大小
    • used:已使用的交换空间大小
    • avail Mem:可用内存大小
  • 进程信息中的内存字段

    • VIRT:进程使用的虚拟内存大小
    • RES:进程使用的物理内存大小(常驻内存)
    • SHR:进程使用的共享内存大小
    • %MEM:进程使用的内存百分比
内存相关交互命令
  • M:按内存使用率排序
  • f:添加或删除内存相关的显示字段

2.3 htop命令

命令介绍

htop是top的增强版,它提供了更友好的界面和更多的功能,包括更直观的内存使用情况显示。

基本用法
htop
内存相关输出解释

htop的顶部显示了内存和交换空间的使用情况,使用彩色条形图直观表示。进程列表中也包含了内存使用相关的字段。

内存相关交互命令
  • M:按内存使用率排序
  • F6:选择排序字段,可选择内存相关字段
  • f:添加或删除内存相关的显示字段

2.4 vmstat命令

命令介绍

vmstat(Virtual Memory Statistics)是一个综合性的系统监控工具,它可以显示内存使用情况、进程状态、CPU使用情况、I/O状态等信息。

基本用法
vmstat
内存相关输出解释
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0      0 8388608 102400 4194304    0    0     0     0   10   20  5  2 93  0  0
  • memory:内存使用情况

    • swpd:已使用的交换空间大小
    • free:空闲内存大小
    • buff:用于缓冲的内存大小
    • cache:用于缓存的内存大小
  • swap:交换空间使用情况

    • si:从交换空间调入内存的数据量(每秒)
    • so:从内存调入交换空间的数据量(每秒)
实用参数
  • -s:显示内存统计信息

    vmstat -s
  • interval:指定刷新间隔,单位为秒

    vmstat 2  # 每2秒刷新一次

2.5 pidstat命令

命令介绍

pidstat是sysstat包的一部分,它可以显示指定进程或所有进程的内存使用情况、CPU使用情况、I/O使用情况等。

基本用法
pidstat -r
内存相关输出解释
Linux 5.4.0-80-generic (hostname)     06/01/2023     _x86_64_    (4 CPU)

10:00:00 AM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
10:00:00 AM     0      1234      0.00      0.00  100000  50000   0.30  nginx
10:00:00 AM     0      5678      0.00      0.00   50000  25000   0.15  sshd
  • minflt/s:每秒发生的次要页面错误数(不需要从磁盘加载)
  • majflt/s:每秒发生的主要页面错误数(需要从磁盘加载)
  • VSZ:进程使用的虚拟内存大小(KB)
  • RSS:进程使用的物理内存大小(KB)
  • %MEM:进程使用的内存百分比
  • Command:进程命令名
实用参数
  • -r:显示内存使用情况

    pidstat -r
  • -p:监控指定PID的进程

    pidstat -r -p 1234  # 只监控PID为1234的进程的内存使用情况
  • interval:指定刷新间隔,单位为秒

    pidstat -r 2  # 每2秒刷新一次内存使用情况

2.6 sar命令

命令介绍

sar(System Activity Reporter)是sysstat包的一部分,它可以收集、报告和保存系统活动信息,包括内存使用情况、CPU使用情况、I/O使用情况、网络使用情况等。

基本用法
sar -r
内存相关输出解释
Linux 5.4.0-80-generic (hostname)     06/01/2023     _x86_64_    (4 CPU)

10:00:00 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
10:10:00 AM   8388608   8195400     50.00   1024000   4194304  12288000     75.00
10:20:00 AM   8388608   8195400     50.00   1024000   4194304  12288000     75.00
10:30:00 AM   8388608   8195400     50.00   1024000   4194304  12288000     75.00
Average:      8388608   8195400     50.00   1024000   4194304  12288000     75.00
  • kbmemfree:空闲内存大小(KB)
  • kbmemused:已使用的内存大小(KB)
  • %memused:内存使用百分比
  • kbbuffers:用于缓冲的内存大小(KB)
  • kbcached:用于缓存的内存大小(KB)
  • kbcommit:承诺使用的内存大小(KB)
  • %commit:承诺使用的内存百分比
实用参数
  • -r:显示内存使用情况

    sar -r
  • -B:显示内存分页情况

    sar -B
  • -S:显示交换空间使用情况

    sar -S
  • interval:指定数据收集间隔,单位为秒

    sar -r 2 5  # 每2秒收集一次内存使用情况,共收集5次

2.7 slabtop命令

命令介绍

slabtop是一个实时显示内核slab缓存使用情况的工具,它可以帮助了解内核如何使用内存。

基本用法
slabtop
输出解释

slabtop的输出显示了内核slab缓存的使用情况,包括缓存名称、对象数量、对象大小、使用情况等。

实用参数
  • -d:指定刷新间隔,单位为秒

    slabtop -d 2  # 每2秒刷新一次
  • -s:指定排序字段

    slabtop -s c  # 按缓存大小排序
    slabtop -s n  # 按对象数量排序

2.8 /proc/meminfo文件

文件介绍

/proc/meminfo是一个虚拟文件,它包含了系统内存使用的详细信息,可以通过cat命令查看。

基本用法
cat /proc/meminfo
输出解释
MemTotal:       16384000 kB
MemFree:         8388608 kB
MemAvailable:   11264000 kB
Buffers:         1024000 kB
Cached:          4194304 kB
SwapCached:            0 kB
Active:          4194304 kB
Inactive:        2097152 kB
Active(anon):    2097152 kB
Inactive(anon):      0 kB
Active(file):    2097152 kB
Inactive(file):  2097152 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       8192000 kB
SwapFree:        8192000 kB
Dirty:                0 kB
Writeback:            0 kB
AnonPages:       2097152 kB
Mapped:          1048576 kB
Shmem:            102400 kB
Slab:            1048576 kB
SReclaimable:     524288 kB
SUnreclaim:       524288 kB
KernelStack:       16384 kB
PageTables:        32768 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     16384000 kB
Committed_AS:    12288000 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      1048576 kB
DirectMap2M:     15728640 kB
  • MemTotal:总内存大小
  • MemFree:空闲内存大小
  • MemAvailable:可用内存大小
  • Buffers:用于缓冲的内存大小
  • Cached:用于缓存的内存大小
  • SwapTotal:总交换空间大小
  • SwapFree:空闲交换空间大小
  • Active:最近活跃使用的内存大小
  • Inactive:最近不活跃使用的内存大小
  • Slab:内核slab缓存大小
  • Committed_AS:承诺使用的内存大小

3. 内存监控工具的选择与使用场景

3.1 工具对比

工具 优势 劣势 适用场景
free 简单易用,默认安装,显示基本内存信息 信息不够详细 快速查看系统内存使用情况
top 实时显示,包含进程内存使用情况 界面相对简单 监控进程内存使用情况,识别内存占用高的进程
htop 界面友好,功能丰富,支持彩色显示 需要额外安装 交互式内存监控,进程管理
vmstat 综合性强,显示内存分页和交换情况 内存信息不够详细 系统整体内存性能监控,识别内存瓶颈
pidstat 显示进程级别的详细内存信息 需要额外安装 进程级内存监控,识别内存泄漏
sar 可以保存历史数据,支持趋势分析 需要额外安装,配置复杂 长期内存使用趋势分析,容量规划
slabtop 显示内核slab缓存使用情况 信息较为专业,不易理解 内核内存使用分析
/proc/meminfo 提供最详细的内存信息 输出格式不够友好 深入分析系统内存使用情况

3.2 使用场景推荐

场景1:快速查看系统内存使用情况
  • 推荐工具:free
  • 使用方法:直接运行free -h命令
  • 适用情况:快速了解系统内存的基本使用情况
场景2:监控进程内存使用情况
  • 推荐工具:top或htop
  • 使用方法:运行tophtop命令,按M键按内存使用率排序
  • 适用情况:识别占用内存最高的进程
场景3:分析内存分页和交换情况
  • 推荐工具:vmstat
  • 使用方法:运行vmstat命令,查看si、so、swpd等字段
  • 适用情况:当系统内存不足时,分析分页和交换情况
场景4:监控特定进程的内存使用情况
  • 推荐工具:pidstat
  • 使用方法:运行pidstat -r -p <pid>命令
  • 适用情况:监控特定进程的内存使用情况,检测内存泄漏
场景5:分析系统内存使用趋势
  • 推荐工具:sar
  • 使用方法:配置sysstat服务,定期收集数据,然后使用sar -r命令查看历史数据
  • 适用情况:需要分析系统内存使用的长期趋势,进行容量规划
场景6:深入分析系统内存使用情况
  • 推荐工具:/proc/meminfo
  • 使用方法:运行cat /proc/meminfo命令
  • 适用情况:需要详细了解系统内存的各个组成部分

4. 内存监控数据的分析与优化

4.1 常见内存性能问题及分析

问题1:内存使用率过高
  • 现象:内存使用率持续超过80%,系统响应缓慢
  • 可能原因
    • 应用程序内存泄漏
    • 应用程序内存使用效率低下
    • 系统内存不足
    • 缓存和缓冲区过大
  • 分析方法
    • 使用top或htop查看占用内存最高的进程
    • 使用pidstat监控特定进程的内存使用情况
    • 使用vmstat查看内存分页和交换情况
  • 解决方法
    • 优化应用程序,修复内存泄漏
    • 增加系统内存
    • 调整应用程序的内存使用策略
    • 考虑使用内存限制,如cgroups
问题2:交换空间使用频繁
  • 现象:vmstat显示si和so值较大,系统响应缓慢
  • 可能原因
    • 系统内存不足
    • 内存使用效率低下
    • 应用程序内存泄漏
  • 分析方法
    • 使用free查看内存使用情况
    • 使用top查看占用内存最高的进程
    • 使用vmstat查看交换空间使用情况
  • 解决方法
    • 增加系统内存
    • 优化应用程序,减少内存使用
    • 调整交换空间大小
    • 考虑使用更高性能的存储设备作为交换空间
问题3:内存分页错误频繁
  • 现象:pidstat显示majflt/s值较大,系统响应缓慢
  • 可能原因
    • 应用程序内存使用模式不佳
    • 系统内存不足
    • 内存碎片化
  • 分析方法
    • 使用pidstat查看进程的页面错误情况
    • 使用vmstat查看内存分页情况
    • 使用sar -B查看内存分页统计信息
  • 解决方法
    • 优化应用程序的内存使用模式
    • 增加系统内存
    • 考虑使用大页内存(HugePages)
问题4:内存泄漏
  • 现象:进程内存使用持续增长,不释放
  • 可能原因
    • 应用程序代码错误,未释放内存
    • 应用程序逻辑问题,导致内存不断分配
  • 分析方法
    • 使用pidstat监控进程的内存使用趋势
    • 使用valgrind等工具检测内存泄漏
    • 分析应用程序的内存分配和释放代码
  • 解决方法
    • 修复应用程序代码,确保正确释放内存
    • 优化应用程序的内存管理逻辑

4.2 内存优化建议

应用程序优化
  • 内存管理:合理分配和释放内存,避免内存泄漏
  • 数据结构:选择合适的数据结构,减少内存使用
  • 缓存策略:合理使用缓存,避免过度缓存
  • 内存池:使用内存池管理频繁分配和释放的内存
  • 垃圾回收:如果使用支持垃圾回收的语言,优化垃圾回收策略
系统配置优化
  • 交换空间:合理配置交换空间大小,一般为物理内存的1-2倍

    # 查看交换空间大小
    free -h
    
    # 创建交换文件
    sudo dd if=/dev/zero of=/swapfile bs=1G count=8
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
    # 永久启用交换文件
    echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
  • 内存限制:使用cgroups限制进程的内存使用

    # 创建cgroup
    sudo mkdir /sys/fs/cgroup/memory/myapp
    
    # 设置内存限制为1GB
    sudo echo 1G > /sys/fs/cgroup/memory/myapp/memory.limit_in_bytes
    
    # 将进程加入cgroup
    sudo echo <pid> > /sys/fs/cgroup/memory/myapp/cgroup.procs
  • 大页内存:配置大页内存,提高内存访问性能

    # 查看大页内存设置
    cat /proc/meminfo | grep Huge
    
    # 临时设置大页内存
    echo 1024 > /proc/sys/vm/nr_hugepages
    
    # 永久设置大页内存
    echo "vm.nr_hugepages=1024" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
  • 内存回收策略:调整内核内存回收策略

    # 调整内存回收阈值
    echo "vm.swappiness=60" | sudo tee -a /etc/sysctl.conf
    echo "vm.vfs_cache_pressure=100" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
硬件优化
  • 增加内存:根据应用程序需求,合理增加系统内存
  • 使用更快的内存:选择更高频率的内存模块
  • 内存通道:使用多通道内存配置,提高内存带宽

实用案例分析

案例1:识别并解决内存泄漏问题

场景描述

系统内存使用率持续增长,即使没有新的应用程序启动,最终导致系统响应缓慢。

分析步骤

  1. 使用top命令查看内存使用情况
top -o %MEM

输出显示:

top - 10:00:00 up 1 day,  2:30,  1 user,  load average: 0.50, 0.60, 0.70
Tasks: 150 total,   1 running, 149 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.0 us,  2.0 sy,  0.0 ni, 92.0 id,  1.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  16384.0 total,   1024.0 free,  12288.0 used,   3072.0 buff/cache
MiB Swap:   8192.0 total,   7168.0 free,   1024.0 used.   2048.0 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
12345 root      20   0  2000000 1000000  20000 S   5.0  6.1   0:30.00 memory-leak-app
67890 user      20   0   50000  25000  10000 S   0.0  0.2   0:02.50 sshd
  1. 使用pidstat监控进程的内存使用情况
pidstat -r -p 12345 2

输出显示:

Linux 5.4.0-80-generic (hostname)     06/01/2023     _x86_64_    (4 CPU)

10:00:00 AM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
10:00:02 AM     0     12345      0.00      0.00 2000000 1000000   6.10  memory-leak-app
10:00:04 AM     0     12345      0.00      0.00 2050000 1050000   6.40  memory-leak-app
10:00:06 AM     0     12345      0.00      0.00 2100000 1100000   6.70  memory-leak-app
10:00:08 AM     0     12345      0.00      0.00 2150000 1150000   7.00  memory-leak-app
  1. 分析结果
    从输出可以看出:
  • memory-leak-app进程的内存使用持续增长,从1000000 KB增长到1150000 KB
  • 没有页面错误,说明内存分配是成功的
  • 进程的虚拟内存和物理内存都在增长
  1. 解决方案

    • 方案1:重启有内存泄漏的应用程序
    sudo systemctl restart memory-leak-app
    • 方案2:修复应用程序代码,解决内存泄漏问题
    • 方案3:使用cgroups限制进程的内存使用
    # 创建cgroup
    sudo mkdir /sys/fs/cgroup/memory/memory-leak-app
    
    # 设置内存限制为1GB
    sudo echo 1G > /sys/fs/cgroup/memory/memory-leak-app/memory.limit_in_bytes
    
    # 将进程加入cgroup
    sudo echo 12345 > /sys/fs/cgroup/memory/memory-leak-app/cgroup.procs
  2. 验证结果
    应用解决方案后,再次使用top和pidstat命令检查内存使用情况,确认内存泄漏问题是否解决。

案例2:分析系统内存不足的原因

场景描述

系统内存使用率持续超过90%,交换空间也在使用,系统响应缓慢。

分析步骤

  1. 使用free命令查看内存使用情况
free -h

输出显示:

              total        used        free      shared  buff/cache   available
Mem:            16G         14G        512M        128M        1.5G        1.2G
Swap:           8.0G        2.0G        6.0G
  1. 使用top命令查看占用内存最高的进程
top -o %MEM

输出显示多个占用内存较高的进程,包括Web服务器、数据库等。

  1. 使用vmstat查看内存分页和交换情况
vmstat 2

输出显示:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
1  0 2097152 524288 102400 1572864    1    2     5    10   20   30 10  5 80  5  0
  1. 分析结果
    从输出可以看出:
  • 系统内存使用率超过90%,可用内存只有1.2GB
  • 交换空间已使用2GB
  • vmstat显示有少量的内存分页和交换活动
  • 系统有5%的I/O等待时间
  1. 解决方案

    • 方案1:增加系统内存,从16GB升级到32GB
    • 方案2:优化应用程序,减少内存使用
      • 调整Web服务器配置,减少每个连接的内存使用
      • 优化数据库配置,调整缓存大小
    • 方案3:使用内存限制,确保关键应用获得足够的内存
    • 方案4:考虑使用容器化技术,隔离应用程序的内存使用
  2. 验证结果
    应用解决方案后,再次使用free、top和vmstat命令检查系统内存使用情况,确认内存不足问题是否解决。

课后练习

  1. 基础练习

    • 使用free命令查看系统内存使用情况
    • 使用top命令查看占用内存最高的进程
    • 使用vmstat命令查看内存分页和交换情况
    • 使用pidstat命令监控特定进程的内存使用情况
  2. 进阶练习

    • 配置sysstat服务,使用sar命令收集和分析内存使用历史数据
    • 使用slabtop命令查看内核slab缓存使用情况
    • 分析系统内存使用率高的原因,提出优化建议
    • 模拟内存泄漏场景,测试不同监控工具的表现
  3. 挑战练习

    • 编写一个脚本,使用free和vmstat命令定期收集内存使用数据,生成报告
    • 分析一个实际系统的内存性能问题,提出详细的优化方案
    • 比较不同内存监控工具的性能开销,评估其对系统的影响

总结

本集教程详细介绍了Linux系统中常用的内存监控工具,包括free、top、htop、vmstat、pidstat、sar、slabtop等命令的使用方法、输出解释和实战应用。

  1. 内存监控的核心指标

    • 内存使用率(已使用、空闲、缓冲、缓存)
    • 交换空间使用情况
    • 内存分页和交换活动
    • 进程内存使用情况
  2. 常用内存监控工具

    • free:简单易用的内存监控工具,显示基本内存信息
    • top:实时显示系统和进程内存使用情况
    • htop:功能丰富的交互式内存监控工具
    • vmstat:综合性系统监控工具,显示内存分页和交换情况
    • pidstat:进程级内存监控工具,识别内存泄漏
    • sar:历史内存使用趋势分析工具
    • slabtop:内核slab缓存监控工具
    • /proc/meminfo:提供最详细的内存信息
  3. 工具选择与使用场景

    • 快速查看:free
    • 进程监控:top或htop
    • 内存分页分析:vmstat
    • 进程级监控:pidstat
    • 历史趋势分析:sar
    • 内核内存分析:slabtop
    • 详细内存信息:/proc/meminfo
  4. 内存性能问题分析与优化

    • 内存使用率过高:识别内存占用高的进程,优化应用程序
    • 交换空间使用频繁:增加内存,优化应用程序
    • 内存分页错误频繁:优化应用程序的内存使用模式
    • 内存泄漏:修复应用程序代码,使用内存限制
  5. 内存优化建议

    • 应用程序优化:合理管理内存,避免内存泄漏
    • 系统配置优化:合理配置交换空间,使用内存限制
    • 硬件优化:增加内存,使用更高性能的内存

通过本集教程的学习,您已经掌握了Linux系统中内存监控的基本方法和工具,能够独立分析内存性能问题,提出优化建议,确保系统的稳定运行和性能优化。在实际工作中,您应该根据具体场景选择合适的内存监控工具,结合系统的其他指标进行综合分析,从而更准确地识别和解决内存问题。

« 上一篇 CPU 监控工具 下一篇 » 磁盘监控工具