CentOS 7.6服务器内存或CPU占用随时间升高怎么处理?

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

三、常见原因及解决方案

内存泄漏可能原因:

  1. 应用程序bug – 重启相关服务
  2. 内核模块问题 – 更新内核或相关驱动
  3. 缓存未释放 – 手动清理:sync; echo 3 > /proc/sys/vm/drop_caches
  4. Java应用堆内存泄漏 – 调整JVM参数,使用jmap分析

CPU占用高可能原因:

  1. 死循环或无限递归 – 重启问题进程
  2. 数据库查询慢 – 优化查询,添加索引
  3. 外部攻击 – 检查异常连接:netstat -anp | grep ESTABLISHED
  4. 计划任务异常 – 检查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

五、长期优化建议

  1. 定期维护

    • 清理日志:logrotate配置优化
    • 更新系统:yum update -y
    • 重启长期运行的服务
  2. 资源限制

    # 使用cgroups限制资源
    yum install libcgroup-tools -y
  3. 性能调优

    • 调整内核参数:/etc/sysctl.conf
    • 优化swap使用
    • 考虑升级硬件或迁移到更新的CentOS版本

六、紧急处理措施

如果服务器即将耗尽资源:

  1. 立即重启最耗资源的服务
  2. 临时增加swap空间
    dd if=/dev/zero of=/swapfile bs=1G count=4
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
  3. 终止问题进程
    kill -9 <PID>

建议先使用诊断工具确定具体原因,再采取针对性措施。如果是生产环境,请在维护窗口进行操作,并做好备份。

云服务器