欢迎光临
我们一直在努力

Linux服务器CPU占用100%怎么办?高负载进程排查与处理教程

一、服务器 CPU 100% 一定是 CPU 不够吗?

Linux 云服务器运行网站、数据库、Docker、游戏服务或其他应用时,有时会突然出现:

CPU 100%
Load Average 很高
SSH 操作卡顿
网站响应变慢
程序超时

很多用户看到 CPU 达到 100%,第一反应就是升级服务器配置。

实际上,CPU 占用高并不一定代表服务器配置不足。

常见原因还包括程序异常循环、PHP 或 Java 进程失控、MySQL 查询异常、Docker 容器持续占用资源、系统网络中断过多、虚拟化进程负载过高,以及内存不足导致频繁使用 Swap。

因此,出现 CPU 高负载时,第一步应该是定位到底是谁在消耗资源。


二、使用 top 查看 CPU 占用

Linux 最常用的性能检查工具就是:

top

运行后通常可以看到:

%Cpu(s): 20.0 us, 15.0 sy, 0.0 ni, 60.0 id, 3.0 wa, 1.0 hi, 1.0 si

其中几个比较重要的字段分别代表:

us    用户程序占用 CPU
sy    内核系统态占用 CPU
id    CPU 空闲比例
wa    等待磁盘 I/O
hi    硬件中断
si    软件中断

如果:

id = 0

或者非常低,说明 CPU 基本已经处于满负载状态。

但还需要继续看究竟是哪一种负载。


三、us 很高代表什么?

如果看到:

us 80%
sy 10%

通常说明 CPU 主要被用户程序消耗。

可以在 top 中查看 %CPU 排名前面的进程。

也可以直接执行:

ps aux --sort=-%cpu | head -20

这样可以直接显示 CPU 使用最高的进程。

例如:

USER   PID   %CPU   %MEM   COMMAND
www    1321  95.2   3.1    php-fpm
mysql  2482  82.5   8.5    mysqld
root   3521  70.1   2.0    java

这时候就可以进一步判断到底是 PHP、数据库、Java 还是其他程序导致。


四、sy 很高需要特别注意

如果 top 显示:

us 10%
sy 60%

说明大量 CPU 时间消耗在 Linux 内核。

这种情况通常比普通应用程序占用 CPU 更值得排查。

可能涉及网络数据包处理、防火墙规则、Docker 网络、虚拟化、磁盘驱动、中断以及大量系统调用。

可以查看:

top

或者:

mpstat -P ALL 1

如果没有 mpstat,Debian/Ubuntu 可以安装:

apt install sysstat -y

CentOS、Rocky Linux、AlmaLinux 可以:

dnf install sysstat -y

然后:

mpstat -P ALL 1

可以观察每个 CPU 核心的使用情况。


五、为什么总 CPU 没满,服务器还是很卡?

假设服务器有 16 核 CPU,其中一个进程只能使用单线程。

那么可能出现:

某一个核心:100%
其他核心:20%

此时整体 CPU 使用率并不会显示 100%,但对应程序已经遇到单核性能瓶颈。

执行:

mpstat -P ALL 1

可以查看每一个 CPU 核心。

也可以在 top 里按:

1

切换为每核心显示。

如果只有某个核心长期接近 100%,需要考虑程序是否存在单线程瓶颈。


六、查看 Load Average

执行:

uptime

可能看到:

load average: 2.10, 1.80, 1.50

分别代表最近:

1分钟
5分钟
15分钟

的平均系统负载。

Load Average 不能简单理解成 CPU 使用率。

例如一台 4 核服务器:

Load = 1

通常压力并不大。

如果长期:

Load = 8

则说明存在比较明显的任务排队。

但 Linux 的 Load 还会受到不可中断 I/O 等任务影响,所以 Load 高不一定就是 CPU 算力不足。


七、用 pidstat 持续观察异常进程

只看一次 top 有时抓不到瞬间高负载。

可以使用:

pidstat 1

表示每秒刷新一次。

查看指定进程:

pidstat -p PID 1

例如:

pidstat -p 12345 1

如果某个进程长时间:

%CPU 90%+

就需要进一步检查该程序。

还可以:

pidstat -u 1

重点查看 CPU。

如果需要检查磁盘:

pidstat -d 1

八、PHP 占用 CPU 很高怎么办?

网站服务器比较常见的是:

php-fpm

持续占用大量 CPU。

先执行:

ps aux --sort=-%cpu | grep php

如果大量 PHP-FPM 进程占用很高,常见原因包括:

WordPress 插件异常、PHP 脚本死循环、被大量爬虫访问、接口遭到频繁调用、后台任务过多以及网站受到 CC 请求。

可以同时查看 Web 日志。

Nginx 常见日志目录:

/www/wwwlogs/

例如:

tail -f /www/wwwlogs/example.com.log

如果短时间看到某个 IP 每秒请求几十甚至几百次,就需要进一步检查是否存在异常爬虫或攻击。


九、MySQL CPU 占用高怎么办?

如果:

top

看到:

mysqld

长期占用较高 CPU,可以登录 MySQL 查看正在运行的查询。

例如:

SHOW PROCESSLIST;

或者:

SHOW FULL PROCESSLIST;

重点注意长期处于:

Sending data
Creating sort index
Copying to tmp table

等状态的查询。

还应该检查是否存在缺少索引、慢查询、大量并发查询或者数据库表异常增长。

MySQL 高 CPU 并不一定要直接增加 CPU,很多情况下优化 SQL 或索引效果更明显。


十、Docker 容器 CPU 占用过高

如果服务器运行 Docker,可以执行:

docker stats

例如:

CONTAINER      CPU %      MEM USAGE
web-app        95.30%     1.2GB
mysql          35.21%     3.1GB
redis           2.10%     300MB

如果某个容器长期占用 CPU,可以:

docker top 容器名称

查看容器内部进程。

也可以:

docker logs --tail 100 容器名称

检查程序日志。

不建议看到 Docker CPU 高就立即执行:

docker restart

重启可能暂时恢复,但如果根本原因没有解决,CPU 很快还会再次升高。


十一、虚拟化服务器出现 vhost 高 CPU

如果宿主机运行 KVM/QEMU,有时可以看到:

vhost-xxxxx

进程占用大量 CPU。

例如:

vhost-893537 100%

这种情况通常与虚拟机网络 I/O、virtio、数据包转发或者对应虚拟机负载有关。

可以结合:

virsh list

查看虚拟机。

再通过:

ps aux

或者对应虚拟化管理平台确认具体是哪台虚拟机产生大量网络或系统负载。

如果 sy 同时非常高,更应该检查网络包处理、中断和虚拟化相关进程。


十二、检查 wa 是否过高

如果 CPU 信息类似:

wa 40%

说明 CPU 很多时间并不是在计算,而是在等待 I/O。

这时服务器卡顿的原因可能不是 CPU,而是磁盘。

可以使用:

iostat -x 1

如果没有:

apt install sysstat -y

重点关注:

%util
await
r/s
w/s

如果磁盘长期接近满负载,就应该继续排查磁盘性能、数据库写入、日志写入或其他 I/O 操作。


十三、内存和 Swap 也要一起检查

执行:

free -h

例如:

Mem:    16G   15G   200M
Swap:    8G    7G     1G

如果内存严重不足,同时 Swap 大量使用,服务器也可能出现明显卡顿。

进一步:

vmstat 1

重点观察:

si
so

如果持续出现大量 Swap In / Swap Out,说明系统正在频繁交换内存页面。

这种情况下,即使 CPU 没有真正达到 100%,服务器体验也可能非常差。


十四、查看是不是某个进程异常循环

可以执行:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -20

找到异常 PID 后:

ps -fp PID

再查看程序启动时间:

ps -p PID -o lstart,etime,cmd

如果需要进一步查看线程:

top -H -p PID

这样可以判断是不是某个线程单独占用了大量 CPU。


十五、可以直接 kill 高 CPU 进程吗?

不建议看到高 CPU 就直接:

kill -9 PID

首先应该确认进程是什么。

可以先:

ps -fp PID

如果确认是异常的普通应用程序,可以优先尝试:

kill PID

让程序正常退出。

只有程序完全无响应,并且确认终止不会影响重要业务时,才考虑:

kill -9 PID

像:

mysqld
docker
sshd
nginx
虚拟化进程

这类核心服务尤其不要随便强杀。


十六、CPU 突然变高还要检查访问日志

如果服务器平时只有:

10% CPU

某一天突然:

90% CPU

需要检查最近是否发生了:

流量增长
搜索引擎集中抓取
恶意爬虫
CC请求
定时任务
数据备份
程序升级
批量任务

例如查看当前连接:

ss -ant | wc -l

查看连接来源:

ss -ant | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head

如果某些 IP 建立了大量连接,就需要进一步检查访问日志。


十七、推荐的排查顺序

出现 CPU 100% 时,可以按照这个顺序:

top
↓
看 us / sy / wa
↓
找最高 CPU 进程
↓
确认 PID 和程序
↓
检查程序日志
↓
检查网络连接
↓
检查磁盘 I/O
↓
检查内存和 Swap
↓
判断是程序问题还是资源不足

这样比一开始直接重启服务器更容易找到真正原因。


十八、常用命令汇总

CPU:

top
ps aux --sort=-%cpu | head -20
pidstat 1
mpstat -P ALL 1

内存:

free -h
vmstat 1

磁盘:

iostat -x 1

Docker:

docker stats

网络:

ss -s

这些命令组合起来,通常已经能够处理大部分 Linux 高负载排查场景。


总结

Linux 服务器 CPU 占用 100% 时,不建议立即重启或升级配置。

首先应该区分:

用户程序 CPU 高
系统内核 CPU 高
磁盘 I/O 等待高
某个核心单独满载
Docker 容器异常
数据库查询异常
内存和 Swap 压力
网络请求异常

然后再根据具体进程进行处理。

如果服务器长期运行网站、Docker、数据库或其他业务,也建议部署监控系统,记录 CPU、内存、磁盘以及网络变化。这样出现性能问题时,可以结合历史数据判断负载是突然增加还是长期资源不足。

对于使用莱卡云云服务器的用户,如果遇到 CPU、内存或网络异常,也建议先通过系统监控和上述命令定位具体原因,再决定是否需要调整程序配置或升级服务器资源。

赞(0)
未经允许不得转载:莱卡云 » Linux服务器CPU占用100%怎么办?高负载进程排查与处理教程