在Linux系统中,内存管理是系统性能优化的核心环节,准确查询内存使用情况有助于及时发现资源瓶颈、排查内存泄漏等问题,Linux提供了多种命令和工具来查询内存信息,涵盖系统总内存、已用内存、空闲内存、缓存、交换分区(Swap)等维度,以下从基础到进阶详细介绍各类方法。
基础内存查询命令:free
free
是最常用的内存查看命令,以简洁的表格形式展示系统内存和交换分区的使用情况,适合快速了解内存整体状态。
基本用法与参数
free
:默认以KB为单位显示内存信息,包含两大部分(Mem
和Swap
)。free -h
:以人类可读格式(如KB、MB、GB)显示,更直观。free -m
:以MB为单位显示,适合脚本处理。free -g
:以GB为单位显示,适用于大内存服务器。free -t
:显示内存总计行(Total
),方便汇总计算。free -s 3
:每3秒刷新一次,实时监控内存变化(需配合-c
指定次数,如-s 3 -c 5
表示刷新5次)。
输出字段解读(以free -h
为例)
total used free shared buff/cache available
Mem: 7.7Gi 2.1Gi 4.2Gi 1.0Mi 1.4Gi 5.3Gi
Swap: 2.0Gi 0B 2.0Gi
total
:系统总内存(物理内存)。used
:已使用内存(包括应用程序占用、内核缓冲、缓存等)。free
:完全空闲内存,未被任何进程或系统使用。shared
:被多个进程共享的内存(如tmpfs文件系统)。buff/cache
:缓冲区(Buffers)和缓存(Cache)内存,是内核为提升性能预留的,可被释放供程序使用。available
:实际可用的内存(free + buff/cache中可释放的部分
),比free
更准确反映可用内存,是判断内存是否紧张的关键指标。
动态内存监控:top与htop
top
和htop
是动态进程监控工具,不仅能查看内存整体使用情况,还能按进程维度分析内存占用,适合定位高内存消耗进程。
top命令
top
:启动后默认按CPU使用率排序,按M
键可切换为按内存使用率(%MEM
)排序。top -d 2
:设置刷新间隔为2秒。top -p <PID>
:监控指定进程ID的内存使用。
关键内存字段
VIRT
(虚拟内存):进程占用的虚拟内存总量(包括物理内存、交换分区、共享库等)。RES
(常驻内存):进程实际占用的物理内存(不包括交换分区)。SHR
(共享内存):进程与其他进程共享的内存(如共享库)。%MEM
:进程物理内存占用率(RES/总内存
)。
htop命令(top的增强版)
htop
需安装(如apt install htop
或yum install htop
),界面更友好,支持鼠标操作、进程树可视化、内存条图形化显示等。
- 内存条区域:直观显示物理内存和交换分区的使用比例(绿色为可用,黄色为已用,红色为紧张)。
- 排序:点击
%MEM
可按内存使用率排序,支持多级排序。 - 进程操作:选中进程后按
F9
可终止,按F5
查看进程树。
虚拟内存统计:vmstat
vmstat
(Virtual Memory Statistics)是虚拟内存统计工具,可实时报告内存、交换、IO、CPU等核心指标,适合分析内存使用趋势。
基本用法
vmstat
:显示系统启动以来的平均统计(默认只输出一次)。vmstat 1 5
:每1秒刷新一次,共输出5次,实时监控内存变化。
关键内存字段
swpd
:使用的交换分区大小(KB),若持续增长可能内存不足。free
:空闲内存(KB)。buff
:缓冲区大小(KB),用于存储文件系统元数据。cache
:缓存大小(KB),用于缓存文件数据。si
/so
:每秒从交换区读入(si
)和写入(so
)的数据量(KB),频繁交换说明内存紧张。
内核内存详情:/proc/meminfo
/proc/meminfo
是Linux内核提供的内存信息伪文件,记录了最详细的内存数据(包括物理内存、交换分区、大页内存、Slab缓存等),是其他命令的数据源。
查看方式
cat /proc/meminfo
:输出所有内存信息,按字段分类。grep "MemTotal" /proc/meminfo
:提取总内存字段(MemTotal: 7976032 kB
,即约7.7GB)。
关键字段示例
字段名 | 含义 | 示例值(KB) |
---|---|---|
MemTotal | 总物理内存 | 7976032 |
MemFree | 完全空闲内存 | 4312576 |
Buffers | 缓冲区内存 | 123456 |
Cached | 页缓存(文件数据) | 2345678 |
SwapTotal | 总交换分区大小 | 2097152 |
SwapFree | 空闲交换分区 | 2097152 |
Slab | 内核对象缓存(如inode) | 345678 |
HugePages_ | 大页内存相关(如HugePages_Total) | 0(未启用) |
高级内存分析工具:smem与lsmem
smem(计算PSS内存)
smem
可计算进程的“比例集大小(PSS)”,更准确反映共享内存的分摊占用(避免重复计算共享内存),适合分析多进程场景下的内存真实使用。
安装与使用
- 安装:
apt install smem
(Debian/Ubuntu)或yum install smem
(CentOS/RHEL)。 smem -t
:按内存类型(如Unique
、Shared
、Slab
)汇总显示。smem -p <PID>
:查看指定进程的PSS内存。
lsmem(物理内存块分布)
lsmem
(Linux 3.17+)显示物理内存的块信息(如在线/离线状态、大小、位置),适合分析NUMA架构服务器的内存分布。
使用示例
lsmem
:列出所有内存块,显示online
状态、size
、block
位置。lsmem -a
:显示所有内存块(包括离线)。lsmem -s size
:按内存大小排序。
内存使用分析关键点
-
区分“已用内存”与“可用内存”:
free
中的used
包含buff/cache
,而available
才是程序可真正使用的内存,若available
持续低于10%,可能内存不足;buff/cache
高但available
充足,属于正常缓存,可释放。 -
交换分区(Swap)使用判断:
si
/so
频繁且不为0,说明系统频繁使用交换分区,会显著降低性能,需考虑扩容内存或优化进程。 -
高内存进程排查:
通过top
/htop
按%MEM
排序,或用ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem
查看内存占用最高的进程。
相关问答FAQs
Q1:为什么free
命令显示的可用内存(available)比空闲内存(free)少?
A:available
是系统实际可分配给程序的内存,它等于free
加上buff/cache
中可释放的部分(如缓存的不活跃页),而free
是完全未被使用的内存,若系统缓存了大量文件数据(cache
高),这些缓存可在内存紧张时释放,因此available
会显著高于free
,更能反映真实可用内存,若available
很低而free
较高,可能是内核预留内存或缓存无法释放,需进一步排查。
Q2:如何查看某个进程占用的具体内存大小(如RSS、PSS)?
A:可通过以下方式查看:
ps
命令:ps -p <PID> -o pid,rss,vsz
,其中rss
为常驻内存(物理内存占用),vsz
为虚拟内存大小。smem
命令:smem -p <PID>
,可查看进程的PSS(比例集大小),更准确反映共享内存分摊。pmap
命令:pmap -x <PID>
,显示进程的内存映射详情,包括每段内存的RSS、大小、权限等,适合分析进程内存分布。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/18953.html