我的服务器变慢了:如何检查 RAM、CPU 和磁盘
如果您的服务器变慢了,请查看三样东西:RAM、CPU 和磁盘。连接服务器,运行三条命令:用 free -h 看内存,用 top 看处理器,用 df -h 看磁盘。哪一个占满了,哪一个就是瓶颈。如果三者看起来都正常,问题通常出在应用本身。
先看负载
平均负载是等待 CPU 或磁盘的进程的平均数量。下面输出中的前三个数字,分别是最近 1、5 和 15 分钟的平均值。请把它们与您的核心数对比:
cat /proc/loadavg
nproc
如果负载长时间高于核心数,说明服务器已经跟不上工作量。
RAM:free -h
free -h
最重要的一列是可用(available)。如果它非常小,而且 Swap 一行在不断被占满,说明 RAM 不够了。内存耗尽时,内核会终止其中一个占用内存最多的进程(OOM killer)。数据库或 Web 应用自己关闭,往往就是这个原因。可以这样检查:
sudo dmesg -T | grep -i -E "out of memory|killed process"
CPU:top
top
在打开的界面中,P 键按 CPU 使用率对进程排序,M 键按内存使用率排序。按 q 退出。在顶部的 CPU 行中,请看这几项:
- us:用户进程所占的比例。如果很高,说明某个应用在吃 CPU。
- wa:等待磁盘输入输出所花的时间。如果很高,问题不在 CPU,而在磁盘。
- st:从虚拟服务器“偷走”的时间,也就是虚拟化层把 CPU 让给了别的对象的时间。如果它一直很高,问题可能不在您的服务器内部。这种情况下,请联系支持。
磁盘:df -h
df -h
df -i
第一条命令显示已用空间,第二条显示文件数量限制(inode)。磁盘完全写满时,数据库和应用无法写入,服务器会变慢或报错。找出是什么占用了空间:
sudo du -xh / --max-depth=1 2>/dev/null | sort -h | tail -n 8
如果系统日志变大了,可以用 sudo journalctl --vacuum-size=200M 缩小。如果使用 Docker,docker system df 会显示镜像和容器占用的空间,docker stats --no-stream 会显示每个容器使用多少 CPU 和内存。
症状、可能的原因和解决办法
| 现象 | 可能的原因 | 操作 |
|---|---|---|
| 页面时不时变慢,可用(available)很低,swap 已满 | RAM 不足 | 关闭不需要的服务,并调小应用的内存设置(例如 PHP-FPM 的 worker 数量或数据库内存)。如果还不够,就升级服务器。 |
某个服务自己关闭,dmesg 输出中出现“killed process” | 内存耗尽,OOM killer 介入了 | 增加 RAM 或减少内存使用。 |
top 中有一个进程一直占满整个核心 | 进程卡住、插件有缺陷或陷入循环 | 找到这个进程,然后修复或停用它背后的应用或插件。 |
| 负载很高,CPU 空闲,wa 很高 | 在等待磁盘(大量写入或 swap) | 查看 vmstat 1 5 中的 si 和 so 两列。如果在使用 swap,就增加 RAM。 |
df -h 或 df -i 已满 | 磁盘空间或 inode 用完了 | 清理大文件和日志。如果总是被写满,就升级。 |
| st 一直很高 | 问题可能出在您的服务器之外 | 联系支持。 |
在 Seturack,每台服务器的磁盘速度是有限制的:读取持续 500 MB/s 和 20,000 IOPS,写入 200 MB/s 和 8,000 IOPS。如果 iostat -x 1 5 输出中您的数值停在这些数字上,说明拖慢您的是磁盘负载。请用缓存减少工作量,或者把工作分散到不同时间。如果没有 iostat,用 sudo apt install -y sysstat 安装。
swap 什么时候有用?
Swap 用磁盘代替 RAM。它能让服务器在 OOM killer 介入之前撑过短暂的内存峰值,但速度比不上 RAM。如果 vmstat 1 5 输出中的 si 和 so 一直大于零,说明服务器在不停地写入 swap。解决办法是加 RAM,而不是加 swap。如果您没有 swap(swapon --show 没有输出),又想平滑峰值,可以添加一个 2 GB 的 swap 文件。这些命令适用于 ext4 文件系统:
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
如果资源看起来正常
如果 RAM、CPU 和磁盘看起来都很宽裕,请在 top 中查看排在最前面的进程名称:
- 如果排在最前面的是
php-fpm、apache2或nginx,问题通常出在网站本身:插件太重、缺少缓存,或者访问量突然猛增。 - 如果排在最前面的是
mysqld或mariadbd,说明有慢查询。请开启数据库的慢查询日志,看看哪些查询耗时长。 - 如果有一个您不认识的进程一直在吃 CPU,服务器可能已被入侵。请更改密码,检查已打开的会话和
sudo ss -tulpn的输出,必要时用干净的系统重装服务器。
何时升级
顺序是:先调优,再加缓存,关掉不必要的工作。如果这之后负载仍然很高,就升级服务器。在面板中打开您服务器的配置标签页,把滑块移到新的配置并确认。付款后,服务器会自动重启一次,并以新配置恢复运行。您的 IP 地址和数据保持不变,只需为剩余天数补差价。RAM、vCore 和磁盘可以分别增加,所以只需提高不够用的那一项。升级会增大磁盘,而降配不会缩小磁盘。详情请参阅升降配文章。
如果服务器因为负载过高而完全没有响应,SSH 可能连不上。这种情况下,请从面板中打开 VNC 控制台,或者在面板中重启服务器。
评论0
暂无评论
成为第一个分享想法的人。
请登录或注册后发表评论。