由于工作的需要,我们会经常去排查服务器的内存占用情况,是自身程序占用的还是外部流量占用导致的。所以我们需要一一排查,这里我们整理到一些排查的方法和工具。
第一、基础监控工具
1. top命令实时监控
top -o %MEM
按内存占用降序排列进程
关注RES(常驻内存)列和Swap列的值
使用Shift+M切换排序方式
2. ps命令精准查询
# 查看所有进程内存信息
ps auxf --sort=-%mem
# 查看特定进程内存
ps -p <PID> -o rss,vsz
字段说明:
rss:实际物理内存占用(KB)
vsz:虚拟内存大小(KB)
3. free命令全局视图
free -h
关注:
Total内存总量
Used内存使用量
Swap分区状态
第二、进阶分析工具
4. pmap工具内存映射分析
pmap -x <PID>
输出包含:
线程堆栈信息
内存映射文件细节
共享内存区域统计
5. smem工具统计报告
smem -r -P java
生成报告包含:
每个进程的物理内存使用
内存共享比例
可视化图表输出(需安装graphviz)
6. proc文件系统解析
# 查看进程内存统计
cat /proc/<PID>/status | grep -E "VmSize|VmRSS"
# 内存分配详细信息
cat /proc/<PID>/smaps
第三、内存泄漏排查
1. valgrind检测工具
valgrind --leak-check=full --show-leak-kinds=all ./your_program
2. gdb堆栈跟踪
gdb -p <PID>
(gdb) p (char*)malloc(1024 * 1024)
第四、自动化监控方案
1. systemd服务监控
创建自定义单元文件:
ini
[Unit]
Description=Memory Watchdog
After=network.target
[Service]
ExecStart=/usr/bin/sh -c 'while true; do echo $(date) "Memory usage: $(free -m)"; sleep 30; done'
[Install]
WantedBy=multi-user.target
2. Prometheus + Grafana监控
部署node_exporter:
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-*.tar.gz
cd node_exporter-*/
systemctl daemon-reload
systemctl start node_exporter
第五、典型问题处理
1. 内存耗尽应急处理
# 查找占用内存最大的进程
find /proc -type f -name status -exec grep -E "^VmSize|VmRSS" {} \; | sort -k3nr
# 终止进程
kill -9 <PID>
2. 大内存进程优化建议
使用内存池技术(如jemalloc)
启用内存压缩(ZRAM)
调整OOM Killer参数:
echo 3 > /proc/sys/vm/overcommit_memory