服务器异常-服务器中`cpu`占用不高内存占用高排查
服务器异常-服务器中cpu占用不高内存占用高排查
明白了,你要的是不是怎么查,而是查出来之后怎么“治” 👍
我给你按“不同原因 → 对应解决手段”直接整理一套实战方案,你对号入座就行。
🧠 一、如果是缓存导致(最常见)
👉 特征:
buff/cache很大available还很多
✅ 解决方法(其实不用动)
这是 Linux 正常行为,不需要优化。
如果你“必须”降内存占用:
1 | sync; echo 3 > /proc/sys/vm/drop_caches |
👉 或优化策略:
1 | # 降低缓存倾向 |
✔️ 适用场景:
- 临时让监控好看
- 非性能敏感机器
🐛 二、如果是内存泄漏
👉 特征:
- 内存持续上涨
- 重启后恢复
✅ 解决方法
1. 临时止血
1 | kill -9 <pid> |
或重启服务:
1 | systemctl restart xxx |
2. 长期方案(按语言)
Java:
- 限制堆大小:
1 | -Xms2g -Xmx2g |
- Dump分析:
1 | jmap -dump:format=b,file=heap.hprof <pid> |
Python:
- 检查对象增长(gc / tracemalloc)
- 避免全局变量缓存
Go:
- 检查 goroutine 泄漏
- 调整 GC:
1 | GOGC=100 |
3. 兜底策略(很实用)
👉 加自动重启(防止拖垮机器):
1 | # systemd |
或 K8s:
- livenessProbe
- 内存limit
📦 三、如果是应用配置过大(非常常见)
👉 特征:
- 某个进程占用很大
- 但不增长
✅ 解决方法
🔹 Java
1 | -Xmx 降低(比如从 8G → 2G) |
🔹 MySQL
1 | innodb_buffer_pool_size=1G |
👉 一般建议:
- 不超过物理内存的 50~70%
🔹 Redis
1 | maxmemory 1gb |
- 淘汰策略:
1 | maxmemory-policy allkeys-lru |
💾 四、如果是 swap 在疯狂用
👉 特征:
- swap used 很高
- 系统卡顿
✅ 解决方法
1. 临时清理 swap
1 | swapoff -a && swapon -a |
2. 调整 swap 使用倾向
1 | sysctl -w vm.swappiness=10 |
3. 根本解决
- 加内存
- 或限制进程内存
🧵 五、如果是线程爆炸
👉 特征:
- 一个进程几千线程
✅ 解决方法
限制线程数:
1 | ulimit -u 4096 |
或应用层:
- Java:线程池限制
- Nginx:worker_connections
📁 六、如果是文件句柄泄漏
👉 特征:
lsof很多- fd 爆炸
✅ 解决方法
1. 临时:
1 | kill -9 <pid> |
2. 长期:
- 修代码(关闭文件)
- 限制:
1 | ulimit -n 65535 |
🧱 七、如果是内核 slab 占用高
👉 特征:
slabtop很高
✅ 解决方法
1 | echo 2 > /proc/sys/vm/drop_caches |
或:
1 | echo 1 > /proc/sys/vm/drop_caches |
👉 如果是 dentry/inode:
1 | sysctl -w vm.vfs_cache_pressure=200 |
🐳 八、如果是 Docker / Kubernetes
👉 这是生产最常见坑之一
✅ 解决方法
1. 限制容器内存
1 | resources: |
2. 防止 OOM:
1 | requests: |
3. 找异常容器
1 | kubectl top pod |
4. 自动重启
1 | livenessProbe |
🚀 九、实战建议(最有用的部分)
如果你只想记一套“解决套路”,用这个:
🥇 通用处理流程
1️⃣ 看是不是缓存
👉 是 → 不管 or 调低缓存策略
2️⃣ 找最大进程
👉 限制它(Java / MySQL / Redis)
3️⃣ 看是否增长
👉 增长 → 内存泄漏 → 重启 + 排查
4️⃣ 看 swap
👉 有 → 降 swappiness / 加内存
5️⃣ 容器环境
👉 加 limit(必须做)
💬 最后一句实话(很关键)
👉 90% 的“内存高”问题其实不是问题,而是:
- Linux 缓存机制
- 或应用配置过大
👉 真正需要修的通常是:
- 内存泄漏
- 或没做 limit(尤其 K8s)
如果你愿意,可以把你服务器的这几个输出贴给我:
1 | free -h |
我可以帮你直接判断 + 给你最优解决方案(甚至告诉你要不要动)。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment


