第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 0memory:内存使用情况
- swpd:已使用的交换空间大小
- free:空闲内存大小
- buff:用于缓冲的内存大小
- cache:用于缓存的内存大小
swap:交换空间使用情况
- si:从交换空间调入内存的数据量(每秒)
- so:从内存调入交换空间的数据量(每秒)
实用参数
-s:显示内存统计信息
vmstat -sinterval:指定刷新间隔,单位为秒
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 -Sinterval:指定数据收集间隔,单位为秒
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
- 使用方法:运行
top或htop命令,按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:识别并解决内存泄漏问题
场景描述
系统内存使用率持续增长,即使没有新的应用程序启动,最终导致系统响应缓慢。
分析步骤
- 使用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- 使用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- 分析结果
从输出可以看出:
memory-leak-app进程的内存使用持续增长,从1000000 KB增长到1150000 KB- 没有页面错误,说明内存分配是成功的
- 进程的虚拟内存和物理内存都在增长
解决方案
- 方案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验证结果
应用解决方案后,再次使用top和pidstat命令检查内存使用情况,确认内存泄漏问题是否解决。
案例2:分析系统内存不足的原因
场景描述
系统内存使用率持续超过90%,交换空间也在使用,系统响应缓慢。
分析步骤
- 使用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- 使用top命令查看占用内存最高的进程
top -o %MEM输出显示多个占用内存较高的进程,包括Web服务器、数据库等。
- 使用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- 分析结果
从输出可以看出:
- 系统内存使用率超过90%,可用内存只有1.2GB
- 交换空间已使用2GB
- vmstat显示有少量的内存分页和交换活动
- 系统有5%的I/O等待时间
解决方案
- 方案1:增加系统内存,从16GB升级到32GB
- 方案2:优化应用程序,减少内存使用
- 调整Web服务器配置,减少每个连接的内存使用
- 优化数据库配置,调整缓存大小
- 方案3:使用内存限制,确保关键应用获得足够的内存
- 方案4:考虑使用容器化技术,隔离应用程序的内存使用
验证结果
应用解决方案后,再次使用free、top和vmstat命令检查系统内存使用情况,确认内存不足问题是否解决。
课后练习
基础练习
- 使用free命令查看系统内存使用情况
- 使用top命令查看占用内存最高的进程
- 使用vmstat命令查看内存分页和交换情况
- 使用pidstat命令监控特定进程的内存使用情况
进阶练习
- 配置sysstat服务,使用sar命令收集和分析内存使用历史数据
- 使用slabtop命令查看内核slab缓存使用情况
- 分析系统内存使用率高的原因,提出优化建议
- 模拟内存泄漏场景,测试不同监控工具的表现
挑战练习
- 编写一个脚本,使用free和vmstat命令定期收集内存使用数据,生成报告
- 分析一个实际系统的内存性能问题,提出详细的优化方案
- 比较不同内存监控工具的性能开销,评估其对系统的影响
总结
本集教程详细介绍了Linux系统中常用的内存监控工具,包括free、top、htop、vmstat、pidstat、sar、slabtop等命令的使用方法、输出解释和实战应用。
内存监控的核心指标:
- 内存使用率(已使用、空闲、缓冲、缓存)
- 交换空间使用情况
- 内存分页和交换活动
- 进程内存使用情况
常用内存监控工具:
- free:简单易用的内存监控工具,显示基本内存信息
- top:实时显示系统和进程内存使用情况
- htop:功能丰富的交互式内存监控工具
- vmstat:综合性系统监控工具,显示内存分页和交换情况
- pidstat:进程级内存监控工具,识别内存泄漏
- sar:历史内存使用趋势分析工具
- slabtop:内核slab缓存监控工具
- /proc/meminfo:提供最详细的内存信息
工具选择与使用场景:
- 快速查看:free
- 进程监控:top或htop
- 内存分页分析:vmstat
- 进程级监控:pidstat
- 历史趋势分析:sar
- 内核内存分析:slabtop
- 详细内存信息:/proc/meminfo
内存性能问题分析与优化:
- 内存使用率过高:识别内存占用高的进程,优化应用程序
- 交换空间使用频繁:增加内存,优化应用程序
- 内存分页错误频繁:优化应用程序的内存使用模式
- 内存泄漏:修复应用程序代码,使用内存限制
内存优化建议:
- 应用程序优化:合理管理内存,避免内存泄漏
- 系统配置优化:合理配置交换空间,使用内存限制
- 硬件优化:增加内存,使用更高性能的内存
通过本集教程的学习,您已经掌握了Linux系统中内存监控的基本方法和工具,能够独立分析内存性能问题,提出优化建议,确保系统的稳定运行和性能优化。在实际工作中,您应该根据具体场景选择合适的内存监控工具,结合系统的其他指标进行综合分析,从而更准确地识别和解决内存问题。