1. 首页 > 技术教程 > 正文

存储 I/O 优化:解决网站卡顿,提升磁盘读写效能

存储 I/O 优化:解决网站卡顿,提升磁盘读写效能

网站卡顿,CPU 和内存都正常,但就是页面加载慢、数据库查询卡壳。别急着换服务器,大概率是磁盘读写瓶颈。主机选(zhujixuan.com)的这篇 Linux 教程,直接给你一套实战方案,从排查到调优,一步步把磁盘 I/O 拉上来。

存储 I/O 优化:解决网站卡顿,提升磁盘读写效能的图片

先定位:用 iostat 揪出 I/O 瓶颈

别猜,用数据说话。`iostat` 是排查磁盘性能的首选工具,能直接告诉你磁盘在“摸鱼”还是“跑满”。

安装 iostat 并查看实时 I/O

大部分 Linux 发行版默认没装 `iostat`,得先装 `sysstat` 包:

Debian/Ubuntu 系统

apt install sysstat -y

CentOS/RHEL 系统

yum install sysstat -y

装好后,用下面命令看磁盘的实时负载:

-x 显示扩展统计,1 表示每秒刷新一次,3 表示刷新 3 次

iostat -x 1 3

重点关注两个指标:

%util:磁盘繁忙度。超过 80% 说明磁盘已经快累趴了。

await:平均 I/O 响应时间(毫秒)。正常应该在 10ms 以下,超过 30ms 说明磁盘响应很慢。

老鸟叮嘱:别只看 %util。如果磁盘是 SSD,%util 可能很低但 await 很高,那是因为 SSD 的并发能力强,但遇到大量小文件读写(比如 WordPress 的缓存碎片),照样会卡。

调优工具:用 ionice 和 swap 策略降负载

找到问题了,接下来就是动手优化。别指望一块命令就能让老磁盘起飞,但把负载降下来,让关键进程优先跑,效果立竿见影。

用 ionice 给进程“排优先级”

`ionice` 能调整进程的 I/O 优先级,把数据库、Web 服务这类关键进程调到“高优”,备份、日志压缩这类后台任务调到“低优”。

查看 MySQL 进程的 PID

pgrep -x mysqld

假设 PID 是 12345,将其 I/O 调度设为“实时”级别(class 1),优先级最高(0-7,0 最高)

ionice -c 1 -n 0 -p 12345

把日志压缩进程(比如 gzip)的 I/O 设为“空闲”级别(class 3),只在磁盘空闲时运行

ionice -c 3 -p $(pgrep gzip)

排障区:如果你用的是云服务器,`ionice` 可能不生效,因为云硬盘的 I/O 调度由宿主机控制。这时候可以试试 `chrt` 调整 CPU 调度,或者直接升级云硬盘类型。

调整 swap 使用策略,避免磁盘“雪上加霜”

swap 用多了,磁盘 I/O 会飙升,因为 swap 本身就是在磁盘上划出一块区域当内存用。对于内存足够的服务器,可以调低 swap 的“积极性”:

查看当前 swap 倾向值(默认 60)

cat /proc/sys/vm/swappiness

临时调整为 10,表示尽量少用 swap

echo 10 > /proc/sys/vm/swappiness

永久生效,写入 sysctl.conf

echo "vm.swappiness=10" >> /etc/sysctl.conf

老鸟叮嘱:内存不足 2GB 的 VPS,千万别把 swappiness 设成 0,否则 OOM(内存溢出)会直接杀掉进程,比卡顿更致命。

文件系统优化:调整挂载参数,减少 I/O 次数

文件系统的挂载参数也能大幅影响 I/O。默认的 `ext4` 或 `xfs` 参数偏保守,适合通用场景,但如果你跑的是数据库或高并发网站,得手动改。

使用 noatime 和 nodiratime 禁用访问时间更新

每次读取文件,系统都会更新文件的 atime(访问时间),这会产生一次写操作。对于日志、静态资源这类文件,完全没必要。

查看当前挂载参数

mount | grep /dev/vda1

修改 /etc/fstab,在 options 列添加 noatime,nodiratime

示例:/dev/vda1 / ext4 defaults,noatime,nodiratime 0 0

重新挂载生效

mount -o remount /

排障区:修改 fstab 后,如果重启时系统提示挂载失败,大概率是语法错误。建议先 `mount -o remount,noatime /` 测试,确认没问题再写进 fstab。

针对数据库的 I/O 调度优化

MySQL 或 MariaDB 的数据库文件,建议单独挂载分区,并调整 I/O 调度器为 `noop`(适合 SSD)或 `deadline`(适合机械盘):

查看当前 I/O 调度器

cat /sys/block/vda/queue/scheduler

临时切换为 noop

echo noop > /sys/block/vda/queue/scheduler

永久生效(以 Ubuntu 为例,修改 grub)

在 /etc/default/grub 中的 GRUB_CMDLINE_LINUX 添加 elevator=noop

update-grub 后重启

老鸟叮嘱:云服务器通常用 virtio 驱动,I/O 调度器选 noop 最稳,因为宿主机已经做过调度了。别瞎折腾 cfq,那是对机械盘的老古董优化。

排障区:常见 I/O 问题与解决

磁盘 I/O 高但 %util 低:大概率是文件系统碎片化或小文件太多。用 `fsck` 检查文件系统,或者把临时文件目录(如 `/tmp`、`/var/cache`)挂载为 tmpfs。

使用 iostat 看到 await 高但 svctm 低:svctm 是平均服务时间,如果 await 远高于 svctm,说明 I/O 请求在队列里排队了,要么升级磁盘,要么减少并发写操作。

BBR 开启后 I/O 没变化:BBR 是 TCP 拥塞控制算法,只影响网络 I/O,和磁盘 I/O 没关系。如果网站还卡,检查的是磁盘,不是网络。

FAQ

Linux SSH 连不上怎么办?

先检查服务器是否在运行(ping 通但 SSH 连不上),然后确认 SSH 服务是否启动:`systemctl status sshd`。如果服务正常,检查防火墙是否放行了 22 端口:`iptables -L -n | grep 22`。云服务器还得看安全组规则。

VPS 防火墙端口放行后还是访问不了是什么原因?

大概率是应用本身没监听正确 IP。用 `netstat -tlnp | grep 端口号` 查看,如果监听的是 `127.0.0.1`,改成 `0.0.0.0`。另外,检查 SELinux 是否拦截:`getenforce`,如果是 Enforcing,临时关闭测试:`setenforce 0`。

Linux 小白可以直接用 root 账号操作吗?

不建议。root 权限太大,一个命令打错(比如 `rm -rf /`)就凉了。建议用普通用户操作,需要提权时用 `sudo`。如果非要用 root,至少做好快照或备份。

BBR 开启后为什么速度没有明显提升?

BBR 优化的是长连接、高延迟的网络场景。如果你的网站流量小、延迟低,或者服务器带宽本身就不足(比如 1Mbps),BBR 基本没效果。另外,检查是否真的开启了:`sysctl net.ipv4.tcp_congestion_control`,返回值是 `bbr` 才算成功。

磁盘 I/O 突然飙高,怎么快速定位是哪个进程?

用 `iotop` 工具,安装后直接运行:`iotop -o`,只显示正在读写磁盘的进程。如果没装,可以用 `pidstat -d 1` 看每个进程的 I/O 统计。

网站卡顿,但 iostat 显示磁盘负载很低,是什么原因?

可能是 PHP-FPM 或 Nginx 的进程数不够,或者数据库查询慢(慢查询日志分析)。用 `top` 看 CPU 和内存,用 `strace` 跟踪进程的系统调用,定位是卡在哪个环节。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9548.html 商家投稿邮箱:zhujixuanblog@qq.com