服务器异常-服务器中cpu占用不高内存占用高排查

明白了,你要的是不是怎么查,而是查出来之后怎么“治” 👍
我给你按“不同原因 → 对应解决手段”直接整理一套实战方案,你对号入座就行。


🧠 一、如果是缓存导致(最常见)

👉 特征:

  • buff/cache 很大
  • available 还很多

✅ 解决方法(其实不用动)

这是 Linux 正常行为,不需要优化。

如果你“必须”降内存占用:

1
sync; echo 3 > /proc/sys/vm/drop_caches

👉 或优化策略:

1
2
# 降低缓存倾向
sysctl -w vm.vfs_cache_pressure=200

✔️ 适用场景:

  • 临时让监控好看
  • 非性能敏感机器

🐛 二、如果是内存泄漏

👉 特征:

  • 内存持续上涨
  • 重启后恢复

✅ 解决方法

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
2
# systemd
Restart=always

或 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
2
3
resources:
limits:
memory: "1Gi"

2. 防止 OOM:

1
2
requests:
memory: "512Mi"

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
2
3
free -h
top
ps aux --sort=-%mem | head

我可以帮你直接判断 + 给你最优解决方案(甚至告诉你要不要动)