采购或升级服务器时,销售给你的配置单上往往只写一句"1TB SSD"或"500GB 云硬盘"。看上去都是"硬盘",用起来却完全是两回事:同样是 1TB,云硬盘可以在线扩到 4TB 而业务不中断,本地盘想扩容就得停机拆机;同样标称 IOPS,一块 NVMe 本地盘的随机写延迟可能只有云硬盘的三分之一,但本地盘一旦物理损坏,数据就真的没了。搞清楚服务器云硬盘和本地硬盘的区别,直接决定了你的数据库该放哪、备份该怎么做、以及未来两年扩容要花多少钱。本文从性能、扩容、数据可靠性三个维度拆开讲。
一、先分清概念:本地盘、云硬盘到底指的是什么
先澄清一个常见的混淆。"本地硬盘"在物理服务器场景指插在机器上的 SATA/SAS/NVMe 盘,由服务器的 RAID 卡或主板控制器直接管理;在云服务器场景,"本地盘"(有的厂商叫"本地 SSD 盘""实例存储")指的是与某台云主机同机部署、物理上直接挂在该宿主机上的盘,它不是网络存储,但它的生命周期跟随实例——实例被释放或宿主机故障,数据一起消失。
"云硬盘"(云盘、块存储、EBS 类服务)则是从存储集群里通过网络划出来的一块块设备。对操作系统而言它和本地盘一样有 /dev/vdb、/dev/sdb 这样的设备名,可以分区、格式化、挂载,但底层数据被切成多份副本分散在不同机柜的不同磁盘上,通过网络连接挂载到你的实例。
用一条命令就能看出盘是不是网络盘:本地 NVMe 通常走 PCIe,设备名带 nvme 命名空间;云硬盘在虚拟化环境下常常以 virtio-blk 形式出现,驱动是 virtio_blk。
# 查看块设备与驱动/传输类型 lsblk -d -o NAME,SIZE,ROTA,TYPE,MODEL,TRAN # 查看某块盘走的是什么驱动(虚拟化环境常见 virtio_blk) lsblk -S -o NAME,HCTL,TYPE,VENDOR,MODEL,REV,SIZE # 内核识别到的设备队列与调度信息 ls -l /sys/block/vdb/device/driver cat /sys/block/vdb/queue/rotational # 0=SSD/闪存 1=机械盘 cat /sys/block/vdb/queue/scheduler
这里 ROTA 列为 1 表示机械旋转介质,0 表示固态;TRAN 字段在部分环境会直接显示 nvme、sas 或空值。判断介质类型很关键,因为后面所有的性能预期都建立在它是机械还是固态之上。
二、性能对比:别只看 IOPS,要看延迟和一致性
性能是云硬盘和本地硬盘差异最直观的地方,但绝大多数人只盯着厂商标称的 IOPS 数字,忽略了两个更重要的指标:延迟(latency)和延迟的一致性。
2.1 三个核心指标的读法
- IOPS:每秒能完成多少次 I/O 请求。小块随机读写场景(数据库 OLTP)的主要瓶颈,块大小通常按 4KB 计。
- 吞吐(带宽,BW):每秒传输多少 MB。大块顺序读写场景(日志、视频、备份)的主要瓶颈,单位是 MiB/s。
- 延迟(lat):一次 I/O 从发出到返回的时间,看平均值意义不大,要看 99.00%、99.99% 分位(clat percentiles)。数据库对尾延迟极其敏感。
本地 NVMe 盘因为直接走 PCIe,单队列延迟常在几十微秒量级;云硬盘要经过网络传输,延迟里多出一跳网络往返,通常在百微秒到毫秒量级。这个差距在单次操作上不明显,但在"一个 SQL 请求触发几百次随机读"的场景下会被放大成明显的慢查询。
2.2 用 fio 实测,别信标称值
无论销售怎么说,拿到机器上先自己测一轮。下面是一组通用的随机读写测试命令,--iodepth 控制队列深度,--numjobs 控制并发任务数,这是模拟真实业务压力的关键。
# 4K 随机读,队列深度 32,4 并发,测试 60 秒
fio --name=randread --filename=/data/testfile --ioengine=libaio \
--direct=1 --rw=randread --bs=4k --iodepth=32 --numjobs=4 \
--size=2G --runtime=60 --time_based --group_reporting
# 4K 随机写
fio --name=randwrite --filename=/data/testfile --ioengine=libaio \
--direct=1 --rw=randwrite --bs=4k --iodepth=16 --numjobs=4 \
--size=2G --runtime=60 --time_based --group_reporting
# 1M 顺序读(看吞吐)
fio --name=seqread --filename=/data/testfile --ioengine=libaio \
--direct=1 --rw=read --bs=1M --iodepth=8 --numjobs=1 \
--size=4G --runtime=60 --time_based --group_reporting
结果里重点看这几行:IOPS= 是平均 IOPS;BW= 是带宽;lat 段里的 avg、99.00th、99.99th 是延迟分布。经验判读:如果 99.99th 延迟是 avg 的 10 倍以上,说明这块盘存在严重的抖动(可能被其他租户抢占、或后端正在做数据重建);如果随机写 IOPS 只有随机读的三分之一甚至更低,很可能是固态盘的写放大或云盘的写入同步延迟导致的。
注意 --direct=1 必须加,否则测的是操作系统页缓存,数字会高得离谱而毫无参考价值。测试文件也要远大于内存容量。
2.3 用 iostat 看实时负载
# 每 2 秒刷新一次,显示扩展统计 iostat -x 2 # 只看某块盘 iostat -x -d /dev/vdb 2
输出里 %util 接近 100% 说明设备已饱和;await 是平均 I/O 等待时间(毫秒),SSD 上持续超过 5ms、机械盘持续超过 20ms 通常意味着存在压力;svctm 在新版本 sysstat 中已不可靠,不要作为判断依据。另外要区分:机械盘的 %util 高但 IOPS 很低是正常现象(IOPS 上限由寻道时间决定),而固态盘 %util 高同时 IOPS 也很高。
三、扩容能力:一个要停机,一个在线完成
这是两者在运维体验上最大的分水岭。
本地盘扩容:物理服务器需要采购新盘、停机、开箱、插入、做 RAID 重建;云服务器的本地盘则通常不支持直接扩容,只能在新建实例时选择更大的本地盘规格,然后把数据整体迁移过去。无论哪种,都要停机,而且窗口期不可控。
云硬盘扩容:控制台点几下把容量从 200GB 改成 500GB,然后在操作系统内做两件事——扩展分区、扩展文件系统——全程业务不中断。
# 1. 确认盘已识别到新容量 lsblk # 2. 扩展分区(如 /dev/vdb 的第 1 个分区) growpart /dev/vdb 1 # 3. ext4 文件系统扩容;XFS 则用 xfs_growfs /挂载点 resize2fs /dev/vdb1 # 4. 确认结果 df -h
关于容量上限,不同厂商、不同类型的盘差异很大,选购时要看清楚"单盘最大容量"和"单实例可挂载数量",不要默认所有盘都能到几十 TB。
四、数据可靠性:副本、快照与"本地盘会丢数据"
这是最容易被低估、也最容易出事的部分。
4.1 本地盘的可靠性模型
一块物理盘就是单点。企业级机械盘的年化故障率(AFR)通常在百分之一到百分之几的量级,看起来不高,但换算成 100 块盘一年,出问题的概率就非常可观。机械盘还有明显的"浴盆曲线":刚上线的早期故障期、稳定期、以及使用三五年后的损耗期。
本地盘唯一的自救手段是 RAID:RAID 1 牺牲一半容量换取镜像,RAID 5/RAID 6 用校验换取容错。但 RAID 有个致命误区——RAID 不是备份。误删文件、勒索软件加密、文件系统元数据损坏,RAID 会原封不动地把破坏同步到所有成员盘。
# 定期检查硬盘健康状态(需要 smartmontools) smartctl -a /dev/sda smartctl -H /dev/sda # 重点关注 Reallocated_Sector_Ct、Current_Pending_Sector、UDMA_CRC_Error_Count smartctl -A /dev/sda | grep -Ei 'realloc|pending|uncorrect|crc|power_on|temperature'
判断标准:Current_Pending_Sector(待映射扇区)大于 0,或 Reallocated_Sector_Ct(已重映射扇区)持续上涨,说明盘已经在物理损坏,应尽快更换而不是继续观察。
4.2 云硬盘的可靠性模型
云硬盘底层通常采用多副本或纠删码(EC)机制,把数据切分后写入不同机柜的多个存储节点,单块盘甚至单个机柜故障不影响数据可用性,后台自动重建。这就是云硬盘敢宣称"几个 9 的可靠性"的底气。
但云平台给你的可靠性是基础设施层的,它防的是硬件故障,防不住你自己的误操作。所以即便用了云硬盘,仍然必须做两件事:
- 开启定期快照:快照是崩溃一致性(crash-consistent)的,恢复速度快,用于应对误删、改错配置、升级失败。数据库场景需要先做一致性处理再打快照。
- 异地/异地介质备份:快照通常和源盘在同一地域的同一存储集群,遇到地域级故障或账号被入侵删除时不起作用,必须把备份复制到另一个地域或对象存储。
五、一张表看清差异与选型
| 对比维度 | 本地硬盘(本地盘) | 云硬盘(块存储) |
|---|---|---|
| 数据访问路径 | 直连 SATA/SAS/NVMe,无网络跳转 | 经网络访问存储集群,多一跳延迟 |
| 随机 I/O 延迟 | 低且稳定,尤其 NVMe 本地盘 | 略高,受网络与后端负载影响,可能有抖动 |
| IOPS 上限 | 取决于单盘/RAID 卡,NVMe 可极高 | 与容量、盘类型挂钩,可配置规格 |
| 扩容方式 | 停机加盘/重建,或迁移到新实例 | 控制台在线扩容量 + 系统内扩展分区文件系统 |
| 单盘容量上限 | 受机型盘位与单盘容量限制 | 取决于厂商规格,通常可到数 TB~数十 TB |
| 硬件故障影响 | 单盘故障即数据风险,需 RAID 兜底 | 底层多副本,单盘/单机柜故障透明 |
| 实例故障后数据 | 云服务器本地盘随实例释放而丢失 | 可卸载后挂载到另一台实例,数据保留 |
| 快照/回滚 | 不支持,依赖自建备份 | 原生支持快照与回滚 |
| 成本形态 | 一次性买断(物理机)或含在实例价内 | 按容量与盘类型独立计费,通常另计 |
| 典型场景 | 高性能计算、缓存层、可重建的临时数据 | 数据库主存储、业务数据、系统盘、需长期保存的数据 |
六、落地选型:五步判断法
- 先判断数据能不能重建。缓存、临时计算中间结果、可从源重新拉取的数据可以放本地盘;用户上传文件、订单数据、账目数据一律放云硬盘。
- 实测延迟而不是看标称。用 fio 跑 4K 随机写,看 99.99th 分位延迟。延迟抖动大的盘,即使平均 IOPS 好看也不适合放数据库。
- 估算 12 个月后的容量。按日均增量 × 365 × 1.5(留余量)估算,如果 12 个月后需要停机扩容才能解决,就选云硬盘。
- 确认单盘上限与可挂载数量。不要等到容量不够才发现这个机型最多挂 4 块盘。
- 把备份方案在采购前就定下来。快照周期、保留份数、异地复制目标、恢复演练时间,写进运维文档,不要等出事再想。
小结与避坑建议
云硬盘和本地硬盘的核心区别不在"快不快",而在三个问题:故障后数据还在不在、扩容要不要停机、延迟是否稳定。本地盘胜在延迟低、单位性能成本有优势,代价是可靠性完全靠你自己兜底;云硬盘胜在弹性、可迁移、有底层副本和快照,代价是延迟略高、成本按容量持续支出。
几条常见的坑:
- 把云服务器的本地盘当持久存储用。实例释放、宿主机故障、甚至某些情况下的停机迁移,本地盘数据都可能丢失。这是最高频的数据事故来源。
- 认为"云硬盘有副本就不用备份"。副本防硬件故障,不防误删、不防勒索、不防账号被盗后数据被整体删除。
- 测试时不加
--direct=1,测出来的是内存缓存速度,几 GB/s 的数字完全不能反映真实磁盘性能。 - 只看平均延迟。业务卡顿往往由 P99/P99.9 尾延迟引起,平均值掩盖了一切。
- 忽略 inode 与文件系统上限。海量小文件场景下,
df -h还有空间但df -i显示 inode 用满,同样会写入失败。
最终建议是混合使用:系统盘和核心业务数据放云硬盘并配定期快照;对延迟极度敏感且可重建的缓存、临时目录放本地盘。这样既拿到了性能,也没有把数据的命交给一块物理盘。
本文为存储与硬盘管理系列之一,命令示例基于常见 Linux 发行版,具体参数请以实际环境为准。
企业QQ咨询




