VPS性能突然变差怎么排查?CPU内存磁盘网络四个诊断命令

用top、free、iostat和mtr四个命令分别定位CPU、内存、磁盘和网络的性能瓶颈
发布于
2

VPS用着用着突然变卡,网站打开要好几秒、SSH敲命令有明显延迟——这种情况比完全断连更难排查。不是挂了,是慢了。本文用四个命令分别定位CPU、内存、磁盘IO和网络的瓶颈,告诉你性能卡在哪个环节。

排查前的第一步:确认不是自己的网络问题

很多”VPS变慢”其实是本地网络到机房的线路波动。在动手排查之前,先换个网络环境(比如手机热点)ping一下服务器,排除自己这一端的问题。如果不同网络都慢,才往下看。

CPU排查:top和htop看谁在吃算力

SSH连上服务器后先跑 top,按1键展开所有CPU核心。关注三行关键数据:

top
# 按1显示每个核心的负载
# 关注这三行:
# load average: 0.15, 0.10, 0.05  — 1/5/15分钟平均负载
# %Cpu(s): 2.3 us, 0.7 sy, 0.0 ni, 96.8 id  — 注意idle值
# 然后按P按CPU占用排序进程

判断标准:单核VPS的load average持续超过1.0、idle持续低于20%,说明CPU在满负荷跑。如果MySQL或PHP-FPM进程长期占在CPU排行榜第一行,就是应用层的问题——查慢查询日志或者PHP报错日志。

如果htop看到大量D状态(不可中断睡眠)的进程,说明问题不在CPU而是磁盘IO阻塞了进程,跳到第三节。

内存排查:free看真实可用内存

Linux的内存使用情况看free命令比看top更准确:

free -h
# 关键看 available 这一列,不是 free
# free小但available大=正常,Linux把空闲内存用做文件缓存了
# available也接近0=内存真的不够了

如果available持续低于200MB,系统在频繁做SWAP交换——内存不够了,把数据写到磁盘上的swap分区。SWAP的读写速度比内存慢几十倍,这就是为什么内存不够时整个服务器都像卡死了一样。

排查谁在吃内存:

ps aux --sort=-%mem | head -10
# 按内存占用排序,看前10名

常见的吃内存大户:MySQL的InnoDB缓冲池(调小innodb_buffer_pool_size)、Redis(设置maxmemory)、PHP-FPM的进程数(调pm.max_children)。

磁盘IO排查:iostat找到读写瓶颈

磁盘慢是很多VPS性能问题的根因,但容易被忽略。先装工具:

apt install sysstat -y
# 然后运行
iostat -x 1 5
# 每秒输出一次,共5次

重点看 %util 和 await 两列。%util接近100%说明磁盘忙不过来了。await是单次IO的平均等待时间——HDD正常在10-20ms,SATA SSD在1-5ms,NVMe在0.1-0.5ms。如果你的VPS用的是SSD但 await 显示80ms以上,很可能是同一台物理机上其他VPS在和你抢磁盘,这种情况只能换服务商。

看看具体是哪个进程在刷磁盘:

iotop -o
# 只看有IO活动的进程

常见磁盘杀手:MySQL的binlog写入、网站访问日志(关闭或调低nginx的access_log级别)、备份任务定时跑了。

网络排查:ping/mtr定位延迟来源

VPS的”慢”如果是网络延迟导致的,查法不一样。先从简单开始:

# 从服务器往国内测
ping -c 10 114.114.114.114
# 延迟>200ms、丢包>5%就需要关注

# 更详细的路径分析用mtr
mtr -r -c 50 114.114.114.114
# 看每一跳的丢包率和延迟

mtr的价值在于能看到延迟卡在哪一跳。如果丢包从中间某跳开始一路到底,问题在骨干网路由(你基本控制不了,只能等恢复或者换机房位置)。如果只在最后一跳丢包,可能是你本地网络问题。

另外检查带宽使用情况:

nload
# 实时看入/出流量
# 如果出向带宽长期跑满,检查是否被攻击或者有大文件下载任务

性能问题总结对照表

症状 最可能原因 先跑的命令
SSH敲命令卡、网页响应慢但能打开 CPU满载或SWAP交换 top; free -h
网站偶尔完全打不开、刷新几次又好了 内存不足导致进程被杀 dmesg | grep -i kill
数据库查询慢、数据写入慢 磁盘IO瓶颈 iostat -x 1 5
速度时快时慢、不稳定 线路波动或带宽被占 mtr; nload

日常做好三件事避免性能问题

  1. 装监控:配一个轻量的监控脚本或工具(比如Netdata),CPU、内存、磁盘、带宽四个维度的历史曲线比事后再查日志有用得多。
  2. 设告警:内存使用超过80%、CPU持续高负载就自动通知你,不要等问题严重了才发现。
  3. 定期看dmesg:dmesg -T | tail -50 翻一下最近的内核日志,OOM killer杀了什么进程、磁盘有没有坏块、网卡有没有异常——这些信息在dmesg里都有。

常见问题

VPS配置不差为什么还是卡?

VPS是共享物理机的,你的2核4G写在账单上,但如果同物理机上其他VPS在疯狂吃资源,你的性能照样受影响。这是VPS的固有问题,想彻底解决只能用独立服务器或KVM构架的VPS(相比OpenVZ资源隔离更好)。雨云的KVM云服务器资源隔离更彻底,优惠码admin01首月五折。

top看到的load average怎么看?

load average是处于运行和等待状态的进程数,不是CPU使用率。单核VPS上load持续大于1说明有进程在排队等CPU;大于2说明已经明显卡了。多核VPS的load阈值等于核心数——4核VPS的load超过4才算有压力。

VPS经常被OOM Killer杀进程怎么解决?

OOM Killer是Linux内存不够时的自救机制,会杀掉内存占用最大的进程。治本的方法是加内存或者调小应用的内存占用(MySQL调小buffer_pool、PHP-FPM减少max_children)。临时方案是加swap,但swap只是延缓不解决问题。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600

VPS突然抽风——SSH连不上、控制台显示”Unknown”、机房通知物理机故障。慌的时候容易把本来就复杂的事情搞得更乱。本文是一份冷静状态下写好的恢复清单——按步骤走,二十分钟内把服务迁到新机器上。 第一步:确认挂到什么程度 先别急着重建

Nginx默认配置能跑,但远不是最优——没有开启Gzip压缩浪费带宽、没有文件缓存每次请求都读磁盘、并发连接数默认只有512在高流量下不够用。花十分钟调几个关键参数,性能和用户体验有明显提升。 开启Gzip压缩——最直接的提速 网页的HTM

VPS突然连不上,SSH断掉、网站打不开、面板也进不去——如果你正在经历这个,大概率是被DDoS了。这时候慌没用,按下面的步骤走,先止血再恢复。 怎么判断是不是DDoS攻击 不是所有的连不上都是DDoS。先排除几个常见情况:服务器欠费被停了

一台VPS撑不住了——CPU跑满、带宽打满、偶尔502。这时候加配置是一条路,但单机的上限摆在那里。更灵活的做法是加机器做负载均衡:多台VPS分担流量,一台挂了其他继续服务。本文用Nginx反向代理搭建一个最基础的负载均衡方案,三台后端服务

VPS磁盘满了最常见的表现:网站打不开(MySQL写不进去)、Docker容器启动失败(没空间写日志)、SSH登录巨慢。本文用du和ncdu两个命令找到谁在吃空间,再针对Docker日志、系统日志和旧备份三类大户下手清理。 第一步:确认磁盘