Linux 服务器突然变慢,应该先看哪些指标
Linux 服务器突然变慢时,不要先猜是程序还是网络。先看 CPU、内存、Load、磁盘 IO 和最近变更,往往能更快锁定是短时流量、任务堆积还是资源瓶颈。
服务器“突然变慢”通常不是一个点坏了,而是某个资源开始被打满了。用户最容易犯的错,是一感觉慢就重启,结果速度是恢复了,但真正的原因被抹掉了。比起立刻修复,先判断“慢在哪一层”更重要。
有些慢是程序慢,比如接口计算重、数据库慢查询;有些慢是系统慢,比如磁盘 IO 飙高、内存交换、Load 堆积;还有些慢是网络慢,比如某个地区访问不稳、线路绕路、DNS 异常。看清这三类,很多排查就不会走偏。
先看四个地方
top
free -h
uptime
iostat -x 1 3
`top` 用来看 CPU 和最忙的进程,`free -h` 看内存和 Swap,`uptime` 看 Load,`iostat` 看磁盘 IO。不要只盯一个图表,几个指标放在一起看,才能知道是“算得慢”还是“等得慢”。
一个简单判断表
| 现象 | 更像什么问题 | 进一步看什么 |
|---|---|---|
| CPU 高、Load 高 | 计算压力或异常进程 | 高 CPU 进程、Web 日志 |
| CPU 不高、Load 高 | IO 等待或进程排队 | `wa`、磁盘、数据库 |
| 内存低、Swap 高 | 内存压力 | `free -h`、高内存进程 |
| 某接口慢、别的正常 | 程序或数据库局部瓶颈 | 应用日志、慢查询 |
| 只某个地区慢 | 路由或线路问题 | traceroute、多地测试 |
先看最近有没有变更
很多“突然变慢”其实发生在改配置之后,比如升级 PHP、切换数据库版本、加了反向代理、改了防火墙、加了 cron 任务。先想一想:昨天和今天有什么不一样?
如果刚部署了新版本,重点看:
tail -n 100 /var/log/nginx/error.log
tail -n 100 /var/log/php-fpm/error.log
如果是数据库慢,可以先看慢查询,尤其是原来几百毫秒的接口突然变成几秒。
不建议先做的事
不要先重启整机。不要看到慢就直接加大 CPU。不要把所有慢都归为“网络问题”。真正的瓶颈不同,处理方式也不同。
用户和服务商边界
如果你已经能定位到是某个进程、某个接口或者某个数据库语句慢,通常可以继续在应用层处理;如果是多地访问都慢,或者宿主机 IO、CPU steal、网络波动明显异常,则需要服务商协助确认底层资源。