Linux 系统内存不足导致服务崩溃的排查方法

# Linux 系统内存不足导致服务崩溃的排查方法
当 Linux 系统因内存不足导致服务崩溃时,可以按照以下步骤进行排查和诊断:
## 1. 确认内存不足现象
```bash
free -h
```
查看内存使用情况,关注 available 列(表示可用内存)。
```bash
cat /proc/meminfo
```
获取更详细的内存信息。
## 2. 检查 OOM Killer 日志
```bash
dmesg | grep -i "out of memory"
dmesg | grep -i "killed process"
```
查看内核日志中是否有进程被 OOM Killer 杀死的记录。
```bash
grep -i "oom" /var/log/messages
grep -i "oom" /var/log/syslog
```
检查系统日志中的 OOM 相关记录。
## 3. 查找内存消耗大的进程
```bash
top
```
按 M 键按内存使用排序。
```bash
htop
```
更直观的进程查看工具(如未安装需先安装)。
```bash
ps aux --sort=-%mem | head -n 10
```
显示内存使用最高的前10个进程。
## 4. 检查进程内存详情
```bash
pmap -x
```
查看指定进程的内存映射情况。
```bash
cat /proc//status | grep -i vm
```
查看进程的虚拟内存使用情况。
## 5. 检查缓存和缓冲区
```bash
vmstat 1 5
```
查看系统内存、交换分区、I/O 等情况。
```bash
sar -r 1 5
```
监控内存使用变化(需安装 sysstat)。
## 6. 检查交换空间使用
```bash
swapon --show
```
查看启用的交换分区。
```bash
free -h
```
查看交换空间使用情况。
## 7. 检查 slab 内存使用
```bash
cat /proc/meminfo | grep -i slab
```
查看内核 slab 分配器使用的内存。
```bash
slabtop
```
实时显示内核 slab 缓存信息(按内存使用排序)。
## 8. 检查内存泄漏
对于怀疑有内存泄漏的服务:
```bash
valgrind --leak-check=full
```
使用 valgrind 工具检测内存泄漏(需安装)。
## 9. 长期监控
```bash
cat /proc/meminfo > meminfo_before.txt
# 一段时间后
cat /proc/meminfo > meminfo_after.txt
diff meminfo_before.txt meminfo_after.txt
```
比较内存使用变化。
## 10. 解决方案
1. 临时缓解:
- 重启内存消耗大的服务
- 增加交换空间
- 手动释放缓存:`echo 3 > /proc/sys/vm/drop_caches`
2. 长期解决:
- 优化应用程序内存使用
- 增加物理内存
- 配置 OOM Killer 策略
- 设置服务内存限制(cgroups)
- 对关键服务设置 OOM 调整分数:`echo -1000 > /proc//oom_score_adj`
通过以上步骤,可以系统性地排查 Linux 系统因内存不足导致服务崩溃的问题,并找到合适的解决方案。
