对于个人站长和技术爱好者而言,部署在 VPS 或公有云虚拟机上的 MySQL 数据库性能,往往受限于底层存储的 I/O 能力。当面临大流量、高并发的写入场景时(例如频繁的订单、日志记录),存储系统的瓶颈会导致数据库卡顿甚至假死。本文将详细对比云盘(网络附加存储)和本地 SSD(通常是 NVMe)在 MySQL 重度写入场景下的表现,并提供实操的基准测试方法。
存储系统卡顿的本质原因
MySQL 发生卡顿(Stall)通常是由于其事务日志(Redo Log)无法及时写入磁盘造成的,这直接关系到 innodb_flush_log_at_trx_commit 这个参数。如果设置为 1(最安全,也是默认设置),每次事务提交都需要强制同步写入磁盘。如果磁盘响应延迟高或者 IOPS 达到上限,MySQL 就会被阻塞,表现为整个应用卡死。
云盘 vs 本地 SSD 的性能对比
| 特性 | 云盘 (EBS/云硬盘) | 本地 SSD (NVMe) |
|---|---|---|
| 连接方式 | 网络附加 (iSCSI, Fibre Channel) | 直接连接 (PCIe) |
| 延迟 | 中等到高 (通常 1-10ms) | 极低 (通常 < 1ms) |
| IOPS 限制 | 严格的上限(取决于购买等级) | 极高,受限于硬件 |
| 写入稳定性 | 高度可靠,但易受网络拥堵影响而被限速 (Throttling) | 性能稳定,但若是临时盘(Ephemeral)则有数据丢失风险 |
| 抗卡死能力 | 达到 IOPS 阈值时,会发生明显的卡顿/限速 | 极少因自身性能瓶颈卡顿,性能优秀 |
结论:在“大量写入不卡死”这一特定目标上,本地 SSD 具有压倒性优势。 因为它避开了网络存储的延迟和云服务商设置的 IOPS/吞吐量硬限制,提供了最低的写入延迟。
实操:如何使用 fio 测试磁盘写入性能
为了量化地比较你的云盘和本地 SSD 的性能差异,我们使用 Linux 下专业的 I/O 压力测试工具 fio 进行测试。我们将模拟 MySQL 关键的随机同步写入场景。
步骤一:安装 fio
sudo apt update
sudo apt install fio -y
# 或 CentOS/RHEL:
sudo yum install fio -y
步骤二:执行重度写入性能测试
我们关注的是随机写入(randwrite)和延迟(Latency),因为这是 MySQL 事务提交最依赖的指标。请将 test_file 替换为你实际挂载点下的路径。
# 运行一个模拟数据库日志写入的测试
# 参数说明:
# bs=4k:块大小设置为4KB,接近MySQL写入日志块大小。
# iodepth=16:I/O队列深度设置为16,模拟高并发。
# numjobs=4:使用4个并发进程测试。
sudo fio --name=mysql_heavy_write \n--ioengine=libaio \n--iodepth=16 \n--rw=randwrite \n--bs=4k \n--direct=1 \n--size=1G \n--numjobs=4 \n--runtime=60 \n--group_reporting \n--filename=/mnt/data/test_file
关键观察指标:
- IOPS (Input/Output Operations Per Second): IOPS 越高越好,代表每秒能处理的事务越多。
- Latency (延迟): 特别是 clat (Completion Latency) 的 99th percentile (P99) 延迟。如果 P99 延迟在云盘上飙升到 10ms 以上,而本地 SSD 能保持在 1-3ms 以下,那么云盘在高压下必然更容易导致卡顿。
最终建议:何时选择谁?
- 选择本地 SSD (推荐用于高写负载核心数据库): 如果你的 MySQL 数据库面临极高的写入并发、日志量大,并且极度关注避免瞬间卡死(Stall),请选择具备本地 NVMe SSD 的 VPS/虚拟机套餐。请确保你的数据备份策略完善,因为本地盘通常缺乏云盘原生的三副本高可用特性。
- 选择云盘 (推荐用于稳定、可预测负载): 如果你的写入负载适中、需要高可用性保障,并且可以接受明确的 IOPS 上限,标准云盘(尤其是高性能或超高性能等级)是更可靠的选择。你需要仔细计算业务所需的 IOPS,并购买匹配的云盘等级,避免触发云服务商的限速机制。
汤不热吧