CentOS 7.6 服务器内存或CPU占用随时间升高是常见问题,以下是系统化的排查和处理步骤:
一、快速诊断步骤
1. 实时监控工具
# 查看CPU和内存实时使用情况
top
htop(需安装)
# 按内存排序
top -o %MEM
# 按CPU排序
top -o %CPU
# 查看进程树
pstree -p
2. 识别问题进程
# 查看内存占用前10的进程
ps aux --sort=-%mem | head -11
# 查看CPU占用前10的进程
ps aux --sort=-%cpu | head -11
# 查看僵尸进程
ps aux | grep 'Z'
二、深度排查方法
1. 内存泄漏检测
# 监控内存变化
watch -n 5 'free -m'
# 查看内存详细使用
cat /proc/meminfo
# 使用smem分析
smem -s rss -r | head -20
2. CPU使用分析
# 查看每个CPU核心使用率
mpstat -P ALL 2 5
# 查看中断统计
vmstat 2 10
# 查看系统调用
strace -p <PID> -c
3. 日志分析
# 系统日志
journalctl --since "2 hours ago" | grep -E "(error|fail|kill|oom)"
# 内核日志
dmesg | tail -50
# 特定服务日志
journalctl -u <service_name> --since today
三、常见原因及解决方案
内存泄漏可能原因:
- 应用程序bug – 重启相关服务
- 内核模块问题 – 更新内核或相关驱动
- 缓存未释放 – 手动清理:
sync; echo 3 > /proc/sys/vm/drop_caches - Java应用堆内存泄漏 – 调整JVM参数,使用jmap分析
CPU占用高可能原因:
- 死循环或无限递归 – 重启问题进程
- 数据库查询慢 – 优化查询,添加索引
- 外部攻击 – 检查异常连接:
netstat -anp | grep ESTABLISHED - 计划任务异常 – 检查cron:
crontab -l
四、自动化监控设置
1. 安装监控工具
# 安装sysstat用于历史分析
yum install sysstat -y
systemctl enable sysstat
systemctl start sysstat
# 使用sar查看历史数据
sar -u # CPU历史
sar -r # 内存历史
2. 配置报警
# 简单监控脚本示例
#!/bin/bash
THRESHOLD=90
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
echo "CPU usage high: $CPU_USAGE%" | mail -s "Alert" admin@example.com
fi
五、长期优化建议
-
定期维护
- 清理日志:
logrotate配置优化 - 更新系统:
yum update -y - 重启长期运行的服务
- 清理日志:
-
资源限制
# 使用cgroups限制资源 yum install libcgroup-tools -y -
性能调优
- 调整内核参数:
/etc/sysctl.conf - 优化swap使用
- 考虑升级硬件或迁移到更新的CentOS版本
- 调整内核参数:
六、紧急处理措施
如果服务器即将耗尽资源:
- 立即重启最耗资源的服务
- 临时增加swap空间
dd if=/dev/zero of=/swapfile bs=1G count=4 chmod 600 /swapfile mkswap /swapfile swapon /swapfile - 终止问题进程
kill -9 <PID>
建议先使用诊断工具确定具体原因,再采取针对性措施。如果是生产环境,请在维护窗口进行操作,并做好备份。
CLOUD技术笔记