在
Linux 系统管理中,
物理内存的监控与优化是保障系统稳定和性能的关键。本文整理了
Linux 下查看、分析和管理
物理内存的常用命令,涵盖基础信息查看、深度分析、优化管理及问题诊断等方面,帮助系统管理员和开发人员掌握内存管理核心技能。
- 功能:显示内存总量、已用、空闲及缓存 / 缓冲区占用情况。
- 常用命令:
free -h
(以 GB/MB 等人类可读格式显示)。
- 关键参数:
-m
:以 MB 为单位显示;
-s 5
:每 5 秒刷新一次,适合动态监控。
- 输出解读:
total
:物理内存总量;
used
:已用内存(含应用和缓存);
free
:完全空闲的内存;
available
:实际可用内存(含可回收缓存,重点关注)。
- 场景:快速判断系统内存是否充足,监控内存变化趋势。
- 功能:实时显示内存、CPU 使用率及进程资源占用。
- 常用操作:
top
:进入交互式界面,按M
按内存使用率排序进程,按q
退出;
htop
(增强版):支持鼠标操作、彩色界面,显示进程树状结构。
- 输出解读:
Res
:进程实际占用的物理内存;
VIRT
:进程使用的虚拟内存总量(含交换分区)。
- 场景:排查高内存占用的进程,实时跟踪内存变化。
- 功能:提供最详细的内存信息,是其他工具的数据来源。
- 常用命令:
cat /proc/meminfo
。
- 核心字段:
MemTotal
/MemFree
:总内存 / 完全空闲内存;
Buffers
/Cached
:内核缓冲区 / 磁盘缓存占用的内存;
Active/Inactive
:活跃 / 非活跃内存页(用于内核回收策略);
Dirty
:等待写入磁盘的脏页(过多可能导致 I/O 瓶颈)。
- 场景:深入分析内存使用细节,结合脚本定期采集数据。
- 功能:报告虚拟内存、进程、CPU 活动等信息,识别内存瓶颈。
- 常用命令:
vmstat 1 5
(每 1 秒采样 1 次,共 5 次)。
- 关键字段:
si
/so
:交换分区的读入 / 写出数据量(持续高值说明内存不足);
r
:等待运行的进程数(高值可能是 CPU 瓶颈);
b
:不可中断睡眠的进程数(高值可能是 I/O 瓶颈)。
- 场景:诊断内存不足导致的频繁交换,判断系统瓶颈类型(CPU / 内存 / I/O)。
- 功能:按进程统计实际物理内存使用(避免共享内存重复计算)。
- 常用命令:
smem -k -s pss
(以 KB 为单位,按 PSS 排序)。
- 关键概念:
USS
:进程独占的物理内存(不含共享库);
PSS
:USS + 共享库按比例分摊的内存(更真实反映进程占用)。
- 场景:准确识别内存占用高的进程,尤其适用于多进程共享库的情况。
- 功能:显示进程的内存映射关系,分析内存泄漏或异常占用。
- 常用命令:
pmap -x <PID>
(查看指定进程的详细内存映射)。
- 输出解读:
Address
:内存映射起始地址;
RSS
:该区域实际占用的物理内存;
Mapping
:映射的文件或匿名内存区域。
- 场景:定位进程内存泄漏(如匿名内存区域持续增长),分析动态库内存占用。
- 功能:将内核缓冲区中的脏页强制写入磁盘,确保数据一致性,释放缓存内存。
- 常用命令:
sync
。
- 场景:系统关机前保障数据不丢失,配合手动释放缓存使用。
- 功能:在测试等场景下手动释放缓存(内核通常会自动管理,生产环境慎用)。
- 常用命令:
- 释放页缓存:
echo 1 > /proc/sys/vm/drop_caches
;
- 释放目录项和 inode 缓存:
echo 2 > /proc/sys/vm/drop_caches
;
- 释放所有缓存:
echo 3 > /proc/sys/vm/drop_caches
。
- 注意:执行后系统性能可能短暂下降(需重新构建缓存)。
- 功能:通过修改内核参数优化内存行为。
- 常用设置:
- 调整交换分区使用倾向(服务器建议 10-20):
echo 10 > /proc/sys/vm/swappiness
;
- 调整脏页写入阈值:
echo 10240 > /proc/sys/vm/dirty_background_bytes
(后台写回阈值);
- 内存分配策略:
echo 2 > /proc/sys/vm/overcommit_memory
(禁止过量分配)。
- 功能:调试 C/C++ 程序的内存泄漏、非法内存访问等问题。
- 常用命令:
valgrind --leak-check=full ./your_program
。
- 输出解读:
Definitely lost
:明确丢失的内存(未释放且无指针引用);
Indirectly lost
:通过结构体间接丢失的内存。
- 功能:跟踪进程的系统调用,分析内存分配是否异常。
- 常用命令:
strace -e trace=memory -p <PID>
(跟踪指定进程的内存相关调用)。
- 关键调用:
brk
(调整堆内存)、mmap
(映射内存区域)、munmap
(解除映射)。
- 功能:显示内核环形缓冲区日志,排查内存硬件错误或 OOM(内存不足)事件。
- 常用命令:
dmesg | grep -i "memory\|oom"
。
- 典型日志:
Out of memory: Killed process <PID>
(内核因内存不足终止进程)。
#!/bin/bash
THRESHOLD=90
INTERVAL=60
while true; do
USED=$(free | awk '/Mem/{printf("%.0f"), $3/$2*100}')
if [ "$USED" -gt "$THRESHOLD" ]; then
echo "WARNING: Memory usage exceeds ${THRESHOLD}% (Current: ${USED}%)" | mail -s "Memory Alert" admin@example.com
fi
sleep $INTERVAL
done
#!/bin/bash
OUTPUT_CSV="memory_data.csv"
echo "Timestamp,Total(GB),Used(GB),Free(GB),Available(GB)" > $OUTPUT_CSV
while true; do
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
MEM_INFO=$(free -g | awk '/Mem/{print $2,$3,$4,$7}')
echo "$TIMESTAMP,$MEM_INFO" >> $OUTPUT_CSV
sleep 60
done
- 优先监控
available
内存(含可回收缓存),而非free
内存;
- 服务器调低
swappiness
至 10-20,减少不必要的交换;
- 避免频繁手动释放缓存,依赖内核自动管理;
- 结合多种工具诊断内存问题(如
vmstat+smem+strace
);
- 及时处理 OOM 事件,通过
dmesg
分析原因并优化应用。
掌握这些命令和技巧,可有效监控 Linux 内存状态、定位性能瓶颈,构建高效稳定的系统运行环境。