HoRain云--服务器Docker OOM RSS高问题排查思路
🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录
⛳️ 推荐
1. 实时资源监控
2. 定位问题容器
2.1 查看容器内存使用详情
2.2 检查OOM事件记录
3. 容器内进程分析
3.1 进入容器查看进程
3.2 使用nsenter直接分析
4. 高级内存分析工具
4.1 使用ebpf工具
4.2 Java应用专项检查
5. 配置优化建议
5.1 内存限制策略
5.2 应用层优化
6. 监控方案部署
7. 典型问题处理流程
8. 内核参数调优
1. 实时资源监控
# 查看所有容器实时资源占用
docker stats --no-stream --format "table {{.Name}} {{.CPUPerc}} {{.MemUsage}} {{.MemPerc}}"
# 显示容器内存限制
docker inspect --format='{{.Name}} {{.HostConfig.Memory}}' $(docker ps -q)
2. 定位问题容器
2.1 查看容器内存使用详情
# 获取容器内存详情(需cgroup支持)
cat /sys/fs/cgroup/memory/docker//memory.stat
关注关键指标:
rss # 物理内存占用
swap # 交换分区使用
cache # 页面缓存
hierarchical_memory_limit # 内存限制值
oom # OOM发生次数
2.2 检查OOM事件记录
# 查看内核日志
dmesg -T | grep -i 'killed process'
# 查看系统日志
journalctl -k --since "1 hour ago" | grep -E 'oom|kill'
3. 容器内进程分析
3.1 进入容器查看进程
docker exec -it sh
# 安装procps(如容器无top命令)
apt-get update && apt-get install procps
# 查看进程内存排行
ps -eo pid,rss,cmd --sort -rss | head -n 10
3.2 使用nsenter直接分析
# 获取容器PID
docker inspect -f '{{.State.Pid}}'
# 进入容器命名空间
nsenter -t -m -p
# 现在可运行宿主机的top/htop工具
htop --filter=UID:
4. 高级内存分析工具
4.1 使用ebpf工具
# 追踪容器内存分配(需Linux 4.9+)
sudo /usr/share/bcc/tools/memleak -c
4.2 Java应用专项检查
# 检查JVM堆配置
docker exec jcmd 1 VM.flags | grep MaxHeapSize
# 生成堆转储
docker exec jmap -dump:live,format=b,file=/tmp/heap.hprof 1
docker cp :/tmp/heap.hprof .
5. 配置优化建议
5.1 内存限制策略
# 启动容器时设置硬限制
docker run -m 2g --memory-swap 2g --oom-kill-disable=false ...
# 调整Swappiness(0-100,越低越少用swap)
echo 10 > /sys/fs/cgroup/memory/docker//memory.swappiness
5.2 应用层优化
应用类型 | 关键参数 | 推荐配置示例 |
---|---|---|
Java | -Xmx, -XX:MaxMetaspaceSize | -Xmx1g -XX:MaxMetaspaceSize=256m |
Node.js | --max-old-space-size | node --max-old-space-size=2048 |
Python | 对象缓存机制优化 | 使用__slots__减少内存占用 |
MySQL | innodb_buffer_pool_size | 设置为物理内存的50-70% |
6. 监控方案部署
# Prometheus + Grafana监控配置示例
- job_name: 'docker'
static_configs:
- targets: ['docker-host:9323']
metrics_path: /metrics
关键监控指标:
container_memory_usage_bytes{container_label_com_docker_compose_service="app"}
container_memory_failcnt # 内存超限次数
container_memory_swap # Swap使用量
7. 典型问题处理流程
- 突发OOM:检查内存限制是否过小 → 分析应用内存需求 → 调整
-m
参数 - 渐进式RSS增长:使用
valgrind
检测内存泄漏 → 优化代码/配置 - Swap滥用:降低
memory.swappiness
→ 增加物理内存 → 优化应用缓存机制 - 缓存堆积:调整应用缓存策略 → 增加内存 → 使用
echo 3 > /proc/sys/vm/drop_caches
定期清理
8. 内核参数调优
# 防止系统内存耗尽(建议值:0-100)
sysctl -w vm.overcommit_memory=1
# 调整OOM Killer权重(-1000到1000,值越低越不易被杀)
echo -500 > /proc//oom_score_adj
通过以上步骤可系统化诊断内存问题,建议结合监控系统建立长期趋势观察。对于关键业务容器,建议配置--oom-kill-disable
时同时设置合理的-m
限制。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙