云服务器卡顿完整排查链路(CPU→内存→磁盘→带宽→网络→数据库→程序)
云服务器卡顿完整排查链路(CPU→内存→磁盘→带宽→网络→数据库→程序)
适用:阿里云/腾讯云/华为云/轻量、ECS、VPS,Linux为主(CentOS、Ubuntu、Debian),兼顾Windows思路;从最容易出现的瓶颈到深层业务瓶颈,附带命令、判断标准、定位方法。
核心原则:先看负载,再分层次,区分【服务器层卡顿】和【业务数据库层卡顿】
云服务器怎么选:
一、第一步:先确认现象,区分卡顿类型
先搞清楚是哪一种,避免瞎排查:
- 整机卡:ssh连进去都延迟、命令输入半天回显 → 大概率CPU/内存/磁盘IO打满
- 访问网站慢、接口超时,但ssh操作流畅 → 带宽、外网延迟、程序阻塞、数据库慢查询
- 间歇性卡顿:偶发几秒/几十秒,平时正常 → 定时任务、备份、日志切割、慢查询峰值、缓存失效
- 固定时段卡顿:比如凌晨、整点 → 备份、统计任务、自动归档
二、第一层:CPU 瓶颈排查
查看命令
top
htop
uptime
vmstat 1
mpstat -P ALL 1
关键指标解读
uptime:负载load average- 单核CPU:负载>1 就饱和;4核CPU,负载>4开始排队,>8明显卡顿
- ⚠️ Linux负载是任务队列数,不只是CPU占用,IO阻塞也会拉高负载(很容易误判)
- top里面看:
%Cpu(s):us用户CPU、sy系统CPU、id空闲- id长期<10%:CPU跑满
- us高:业务代码、PHP/Python/Java程序、加密、解压、爬虫、编译
- sy高:内核开销、频繁系统调用、磁盘IO、大量进程创建、网络收发包
- wa高:IO等待!不是CPU问题,是磁盘瓶颈(高频坑)
- 按
P在top里按CPU排序,找到耗CPU进程PID
常见CPU高原因
- 程序死循环、正则写炸、无限递归
- 恶意爬虫、CC攻击、挖矿木马
- 压缩、转码、图片处理、大量计算任务
- JVM频繁FullGC(Java服务CPU暴涨)
快速定位进程内问题
看进程内线程CPU(Java必用)
top -H -p PID
抓堆栈
jstack PID
PHP看慢进程
ps aux | grep php-fpm

三、第二层:内存(非常容易被忽略,内存不足直接连锁卡顿)
查看命令
free -h
top
vmstat 1
指标:
free -h
看 available 剩余可用内存
Swap:交换分区使用量
available持续很低、si(换入)频繁上涨 → 内存不足,开始刷swap- swap一旦大量使用:性能暴跌,磁盘IO飙升,整机反应迟钝,表现就是卡顿
云服务器很多轻量机内存小(1G、2G),跑MySQL+Nginx+PHP很容易爆内存
典型内存问题
- MySQL配置过大,buffer_pool设得超过物理内存,OOM
- Java的Xmx给太大
- php-fpm进程开太多,每个进程占用几十MB,累积吃满
- 日志、缓存文件没有自动清理
- 内存泄漏:程序长期运行内存只涨不跌
查看占用内存排序 top 按M
top -o %MEM
查看OOM日志(Linux杀进程记录)
dmesg | grep -i oom
如果dmesg出现Out of memory,系统会随机杀掉进程,伴随业务随机崩溃、卡顿。
四、第三层:磁盘IO(wa高、最容易误以为是CPU卡)
很多服务器卡顿根源不是CPU,是磁盘性能拉胯!云盘分:高效云盘、SSD、ESSD、普通机械盘;轻量服务器很多是共享磁盘,IO争抢严重。
排查命令
iostat -x 1
iotop
vmstat 1
重点看 iostat -x
%util:设备繁忙度,接近100% = 磁盘饱和await:IO平均等待时间(核心指标!)- SSD:await > 10ms 就偏慢;>30ms 明显卡顿
- 普通云盘:await >50ms 很差
r/s w/s读写请求、wkB/s rkB/s吞吐量svctm磁盘本身服务时间,svctm高=磁盘硬件瓶颈;await远大于svctm=排队拥堵
iotop:看哪个进程疯狂读写磁盘,mysqld、rsync、tar、日志写入最常见
磁盘卡顿高频场景
- MySQL大量刷脏页、大批量写入、无索引全表扫描
- 数据库备份(mysqldump)、压缩打包日志,瞬间打满IO
- 日志狂打:debug日志没关、错误日志刷屏
- 程序频繁小文件读写(上传、缓存文件)
- 云盘突发IO额度耗尽(阿里云/腾讯云云盘有IO突发上限,打限后限流降速)
- 磁盘inode耗尽:小文件太多,df -i查看
df -i

五、第四层:带宽 & 外网网络链路(访问慢,但服务器内部操作很快)
区分两个:服务器出口带宽、内网带宽(数据库内网通信)
查看带宽
安装
yum install nload iftop -y
实时看网卡流量
nload
iftop -i eth0
指标:
- 出带宽(Outgoing)跑满:下载、视频、资源文件、爬虫回传、CC攻击向外发包
- 入带宽(Incoming)跑满:大量用户上传、爬虫、攻击流量
带宽≠延迟!两个东西
- 带宽跑满:大文件传输卡住,页面加载转圈
- 带宽空闲,但延迟高、丢包:网络链路问题
丢包、延迟检测
mtr 你的域名/数据库IP
ping
mtr 重点看:是否中间节点丢包、目的IP丢包
- 外网跨运营商、跨地域访问高延迟
- 云服务器安全组、防火墙限流、TCP连接数打满
TCP连接数瓶颈(隐性网络卡顿)
当前连接数统计
ss -s
netstat -an | wc -l
- 连接数满:新用户连不上、请求排队、超时卡顿
- TIME_WAIT大量堆积:短连接高频创建(PHP、接口服务常见)
优化:调整内核tcp参数(tw_reuse等)
内网带宽:如果应用和数据库分开两台机器,内网流量走内网网卡,内网带宽、内网丢包同样会导致数据库访问慢!
六、第五层:数据库瓶颈(业务卡顿TOP元凶,前面资源都正常,就查这里)
现象:CPU/内存/磁盘/带宽都不高,但是网页、接口响应慢、超时,大概率数据库
以MySQL为主,MariaDB通用:
第一步:实时看数据库状态
-- 登录mysql
show processlist;
show full processlist;
重点看:
- Command = Sleep:大量休眠连接(连接池配置问题)
- Command = Query:长时间运行的SQL
- State:
Sending data、Copying to tmp table、Sorting result、Locked - Time字段:执行几十秒以上的SQL就是元凶
开启慢查询日志(必开)
my.cnf
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = ON
long_query_time=1:超过1秒的SQL记录下来;同时记录没有走索引的SQL
分析慢日志工具:mysqldumpslow、pt-query-digest
mysqldumpslow -s t /var/log/mysql/slow.log
MySQL常见卡顿原因分类
- 缺少索引、全表扫描:单表数据上万后,无索引查询直接扫全表,IO飙升、锁表
- 锁等待(InnoDB行锁/MyISAM表锁)
看TRANSACTIONS部分,事务没提交,行锁阻塞其他DMLshow engine innodb status; - 大批量更新、删除、导入数据
- 事务过大:一次性修改几万行,事务长时间不提交
- MySQL配置不合理:
- innodb_buffer_pool_size太小(建议物理内存50%-70%)
- innodb_log_file_size 太小,频繁刷盘
- max_connections 设置太小,连接被占满
Too many connections
- 数据库和应用同机:MySQL抢占IO、内存,业务和数据库互相打架
- 主从同步延迟大:读从库读到旧数据,业务重试加重压力
Redis卡顿补充(如果用到Redis)
redis-cli info
看:
- used_memory 内存占用,是否达到maxmemory触发淘汰
- blocked_clients:被阻塞客户端(慢命令KEYS、HGETALL、大value)
- 持久化RDB/AOF:fork子进程、刷磁盘,瞬间IO抖动卡顿
禁止线上用 KEYS ,大key、热key是Redis卡顿最常见原因。

七、第六层:应用层 & Web中间件(资源充足,数据库也快,依然慢)
Nginx / Apache / PHP-FPM / Tomcat / Node / Java
- php-fpm进程数量太少,请求排队
ps aux | grep php-fpm
- Nginx连接数限制、队列满,backlog不足
- 程序串行逻辑:同步等待外部接口(第三方API)、没有异步
- 缓存缺失:本来走Redis缓存,缓存失效,全部击穿打到数据库
- 文件句柄数上限:
ulimit -n太小,高并发打开文件失败
ulimit -n
- 静态资源没CDN、没缓存头,重复请求
八、标准化排查顺序(直接照着执行)
uptime→ 看负载,初步判断有没有阻塞free -h→ 看内存、swap是否被吃top→ 看CPU us/sy/wa,定位高占用进程iostat -x 1→ 确认磁盘IO await、utilvmstat 1→ 综合看si/so、us、wa、ioiftop/nload→ 带宽是否跑满ss -s→ TCP连接状态- MySQL
show full processlist+ 慢查询日志 - mtr 检测外网/内网丢包延迟
- 查看程序日志、Nginx错误日志、数据库error日志
日志位置参考:
Nginx:/var/log/nginx/
MySQL:/var/log/mysql/
系统日志:/var/log/messages (CentOS) /var/log/syslog(Ubuntu)
九、快速对照表(一眼定位)
| 现象 | 优先怀疑方向 |
|---|---|
| ssh进去敲命令都卡,负载很高 | 内存swap、磁盘IO打满、CPU跑满 |
| ssh流畅,网站打开转圈,带宽跑满 | 带宽上限、大文件、攻击流量 |
| 资源指标都正常,接口偶尔超时 | 慢SQL、锁等待、第三方接口阻塞、缓存击穿 |
| 固定凌晨卡顿 | 备份任务、统计脚本、定时任务 |
| 数据库await很高,慢查询一堆全表扫描 | 缺少索引、批量DML |
| 大量si swap | 内存不足 |
| wa很高CPU idle很高 | 磁盘IO瓶颈 |
十、排查之后通用优化方向
-
资源瓶颈:升级配置、ESSD云盘、分开部署应用和数据库(内网互通)
-
数据库:加索引、拆分大事务、限制批量操作、读写分离、缓存热点数据
-
IO:关闭不必要的debug日志、分散备份时间、避免高峰打包
-
网络:静态资源CDN、TCP内核调优、限流防CC
-
程序:加缓存、异步化、避免慢命令、优化循环和查询
-
一份生产环境MySQL my.cnf推荐配置模板(区分2G/4G/8G内存)

云服务器卡顿完整排查链路(CPU→内存→磁盘→带宽→网络→数据库→程序)
> 适用:阿里云/腾讯云/华为云/轻量、ECS、VPS,Linux为主(CentOS、Ubuntu、Debian),兼顾Windows思路;从最容易出现的瓶颈到深层业务瓶颈,附带命令、判断标准、定位方法。
> 核心原则:先看负载,再分层次,区分【服务器层卡顿】和【业务数据库层卡顿】
浙公网安备 33010602011771号