服务器四大件里,硬盘是最容易被低估、也最容易成为瓶颈的一个。很多人按容量选硬盘,觉得"能装下就行",结果数据库跑起来慢得无法接受,查遍 SQL 优化也无济于事,问题其实出在存储的随机读写能力上。这篇文章把硬盘的关键指标讲清楚:接口协议(SATA/AHCI 与 NVMe/PCIe 的区别)、顺序带宽与随机 IOPS 分别意味着什么、延迟的数量级差异、机械硬盘在哪些场景下仍然是合理选择,另外还会讲企业级与消费级固态的真实差距、TBW 与 DWPD 怎么看、RAID 卡的作用与常见级别、以及如何判断当前磁盘是不是瓶颈。
一、先分清三组容易混淆的概念
第一组是"接口"与"协议"。SATA 和 PCIe 是物理接口与总线,AHCI 和 NVMe 是跑在上面的协议。常见的组合是:SATA 接口 + AHCI 协议(传统 SATA 固态和机械盘),以及 PCIe 接口 + NVMe 协议(M.2 固态、U.2 固态、PCIe 插卡式固态)。也有 SAS 接口 + SCSI 协议,主要用在企业级机械盘和数据中心固态盘上。
为什么要分清这个?因为 AHCI 协议是为机械硬盘设计的,它的队列深度只有 32,而且每次访问要经过多层寄存器读写,开销较大。NVMe 是专门为闪存设计的协议,队列深度可以做到六万多个,每个队列支持六万多个命令,而且命令路径更短、支持多核并行处理。这个设计差异在高并发随机读写时会造成巨大差距:AHCI 的队列很快排满,后面的请求只能等,而 NVMe 几乎不会遇到队列瓶颈。
第二组是"闪存颗粒与形态"。M.2、U.2、PCIe 插卡是外形,SATA、NVMe 是协议,TLC、QLC 是颗粒类型,三者是不同维度。一个 M.2 接口的固态可能是 SATA 协议也可能是 NVMe 协议,购买时必须确认主板支持哪种,插错可能不识别。
第三组是"顺序性能"与"随机性能"。厂商宣传页上最显眼的是顺序读写速度,动辄每秒几千兆字节。但服务器业务真正吃的是随机读写,因为数据库的查询、文件系统的元数据操作、虚拟机的磁盘访问,全都是小尺寸、位置分散的随机访问。顺序带宽只在大文件连续读写时有意义,比如视频文件传输、备份恢复、日志写入。
# 确认磁盘类型与接口
lsblk -d -o NAME,SIZE,TYPE,MODEL,TRAN
# TRAN 列会显示 sata / nvme / sas 等,这是最直接的判断方式
# 查看 NVMe 盘的详细信息
nvme list # Debian/Ubuntu: apt install nvme-cli;RHEL 系: yum install nvme-cli
# 查看是机械盘还是固态( rotational=1 是机械盘,0 是固态)
lsblk -d -o NAME,ROTA,SIZE,MODEL
# 更直接的方式
for d in /sys/block/sd*; do echo -n "$d: "; cat $d/queue/rotational; done
最后一条命令在批量检查服务器磁盘构成时非常方便,一眼就能看出哪些是 SSD 哪些是 HDD。
二、三个关键指标:IOPS、带宽、延迟
IOPS(Input/Output Operations Per Second)是每秒能完成多少次输入输出操作,通常按 4KB 小块随机读写来测量。这是数据库、虚拟化这类场景最核心的指标。经验量级(以下均为工程实践中的常见范围,不是厂商保证值):
机械硬盘的 4K 随机读写 IOPS 大约在一两百,因为每次访问都要移动磁头、等待盘片转到目标位置,这两项都是机械动作,耗时在毫秒级。这就是为什么机械盘跑数据库会非常慢。
SATA 固态硬盘的 4K 随机读 IOPS 通常在几万量级,随机写会低一些,尤其是持续写入耗尽 SLC 缓存之后。
NVMe 固态硬盘的 4K 随机读 IOPS 可以达到几十万,队列深度拉高时甚至更高,随机写也能维持在较高水平。
也就是说,从机械硬盘到 SATA 固态大约是两个数量级的差距,从 SATA 固态到 NVMe 大约又是一个数量级左右的差距。这个差距直接决定了数据库能扛多少查询。
顺序带宽方面,机械硬盘的顺序读写大约在一百到两百兆字节每秒;SATA 固态受接口限制,大约在五百兆字节每秒上下;NVMe 固态可以达到每秒数 GB。但正如前面所说,这个数字对多数在线业务意义有限,它更多影响的是备份恢复速度和大文件传输。
延迟是最容易被忽略但体验最明显的指标。经验量级:本地 NVMe 固态的访问延迟在几十到一百微秒;SATA 固态在一百到几百微秒;机械硬盘在几毫秒到十几毫秒;网络云盘(网络附加存储)通常在几百微秒到几毫秒。差一个数量级,就意味着一次数据库查询里如果有一百次磁盘访问,延迟从 0.05 毫秒变成 5 毫秒,总耗时就从 5 毫秒变成 500 毫秒,直接从一个"快查询"变成一个"慢查询"。
# 用 fio 测随机读写 IOPS(这是最接近真实数据库负载的测试方式)
# Debian/Ubuntu: apt install fio
# RHEL/Rocky: yum install fio
# 随机读,4K,队列深度 32,单任务,跑 60 秒
fio --name=randread --ioengine=libaio --direct=1 --rw=randread --bs=4k \
--numjobs=1 --iodepth=32 --size=1G --runtime=60 --time_based --group_reporting \
--filename=/data/fio_test
# 随机写(注意:会真实写入数据,务必使用空目录或临时文件,测完删除)
fio --name=randwrite --ioengine=libaio --direct=1 --rw=randwrite --bs=4k \
--numjobs=1 --iodepth=32 --size=1G --runtime=60 --time_based --group_reporting \
--filename=/data/fio_test
# 顺序写带宽测试
fio --name=seqwrite --ioengine=libaio --direct=1 --rw=write --bs=1M \
--numjobs=1 --iodepth=16 --size=2G --runtime=60 --time_based --group_reporting \
--filename=/data/fio_test
rm -f /data/fio_test
跑 fio 时有几个注意事项。一定要加 direct=1 绕过页缓存,否则测到的是内存速度而不是磁盘速度;iodepth 要设置得和真实负载接近,数据库场景通常在 8 到 64 之间;测试文件要有一定大小,避免测到缓存;测试完成后记得删除测试文件。另外,在生产环境跑写测试要格外小心,避免影响线上 IO,最好在业务低峰期进行,并且明确知道自己在写哪个目录。
三、HDD 还有用吗:机械盘的正确使用场景
固态硬盘价格持续下降,但机械硬盘并没有退出历史舞台,原因很简单:单位容量成本。在大容量场景下,机械盘每 TB 的成本仍然显著低于固态盘,而且差距随容量增大而拉大。
机械盘适合的场景:冷备份与归档,这类数据很少被访问,读取慢一点无所谓,容量和成本才是关键;日志与监控数据的长期存储,写入是顺序的,机械盘的顺序写入性能其实不差;大文件存储,比如影视素材、图片原图的归档仓库;备份目标端,备份是批量顺序写入,机械盘完全够用。
机械盘不适合的场景:数据库的主存储;虚拟化宿主的虚拟机镜像存储(除非虚拟机负载很轻);任何高并发随机读写的业务;操作系统盘。
还有一个容易被忽略的点:机械盘的故障率曲线和固态不同。机械盘是机械部件,有磨损失效,同时也有早期失效,故障率随使用时间上升;固态没有机械部件,但有写入寿命限制,寿命耗尽后进入只读或失效状态。这意味着机械盘更适合用 SMART 监控重定位扇区计数等指标来预测故障,而固态更适合监控写入量百分比。
# 机械盘健康度检查(重点看 Reallocated_Sector_Ct 与 Pending_Sector)
smartctl -H /dev/sda
smartctl -A /dev/sda | grep -iE 'Reallocated_Sector|Pending_Sector|Power_On_Hours|Temperature'
# Debian/Ubuntu: apt install smartmontools
# RHEL/Rocky: yum install smartmontools
# 长期坏道检测(风险提示:会长时间占用磁盘 IO,生产环境请在低峰期执行)
smartctl -t long /dev/sda
# 查看测试结果
smartctl -l selftest /dev/sda
Power_On_Hours 是很实用的一个指标,它记录了硬盘累计通电时间,可以用来判断一批盘的使用程度,在采购二手服务器时尤其值得看。
四、企业级固态与消费级固态的差距
价格上企业级固态明显更贵,但它贵在几个消费级盘做不到的地方。
第一是持续写入的稳定性。消费级固态标称的速度往往是在 SLC 缓存命中时测到的,持续写入几十 GB 之后缓存耗尽,速度可能从每秒几千兆字节跌到几百甚至几十兆字节。企业级固态通过更大的预留空间和更保守的写入策略,让速度曲线更平直。对于数据库这种持续产生小写入的负载,稳定性比峰值重要得多。
第二是掉电保护。企业级固态板上有电容阵列,掉电瞬间提供几十毫秒电力,让主控把缓存数据和映射表刷写进闪存,避免元数据损坏。消费级盘没有这个设计,意外断电后可能出现整盘不可识别、文件系统损坏等严重问题。注意 UPS 只能保证供电不中断,无法防止电源模块本身故障、人为拔线、主板故障。
第三是写寿命指标明确。企业级盘会标注 TBW(全生命周期可写入总量)或者 DWPD(每天可全盘写入次数)。举例:一块 1.92TB 的盘标注 1 DWPD、五年保修,意味着五年内每天可以写满整盘一次,换算成 TBW 约为 1.92 乘以 365 乘以 5,大约 3500TBW。消费级盘的 TBW 通常低一到两个数量级,而且保修条款往往同时受时间和写入量双重限制。
第四是一致性延迟。企业级盘在长时间运行、垃圾回收压力下,延迟抖动更小。这对在线服务很重要,因为用户体验取决于最慢的那部分请求,而不是平均值。
# NVMe 盘查看已写入量与寿命百分比
nvme smart-log /dev/nvme0 | grep -iE 'critical_warning|percentage_used|data_units_written|available_spare'
# SATA SSD 查看寿命相关属性
smartctl -A /dev/sda | grep -iE 'Percentage_Used|Wear_Leveling|Total_LBAs_Written|Media_Wearout'
Percentage Used 字段直观表示寿命消耗百分比,100 表示写寿命用完。经验做法:超过 70% 列入更换计划,超过 80% 尽快更换。不要等到盘真的坏了才换,那时候往往已经在业务高峰期。
补充一个容易忽略的事实:在主从复制的数据库架构里,从库的磁盘磨损常常比主库更快,因为大量的数据同步写入、以及从库上可能跑着备份任务,都落在从库上。监控时要分别看,不能只看主库。
五、RAID 卡与 RAID 级别
RAID 是把多块物理硬盘组合成一个逻辑盘的技术,目的有两个:提高性能、提供冗余。实现方式分硬 RAID(独立 RAID 卡,有自己的处理器和缓存)和软 RAID(操作系统实现,比如 Linux 的 mdadm)。
常见级别的对比:
| 级别 | 原理 | 可用容量 | 冗余能力 | 性能特点 | 适用场景 |
|---|---|---|---|---|---|
| RAID 0 | 条带化,数据分散到多盘 | 全部 | 无,坏一块全丢 | 读写都最快 | 临时数据、可重建的缓存 |
| RAID 1 | 镜像,两盘写同样数据 | 一半 | 坏一块可用 | 读快,写不变 | 系统盘、小容量关键数据 |
| RAID 5 | 条带 + 单份校验 | n-1 块 | 坏一块可用 | 读快,写受校验影响 | 读多写少,盘数较少 |
| RAID 6 | 条带 + 双份校验 | n-2 块 | 坏两块可用 | 读快,写更慢 | 大容量阵列,重建期间更安全 |
| RAID 10 | 先镜像再条带 | 一半 | 每组镜像可坏一块 | 读写都好 | 数据库、高性能高可靠场景 |
关于 RAID 5 有一个重要提醒:随着单盘容量增大,RAID 5 在重建期间的风险显著上升。一块盘损坏后,重建需要读取所有剩余盘的全部数据,这个过程可能持续十几小时甚至几天,期间如果再有一块盘出问题或者遇到不可恢复读取错误,整个阵列就丢了。所以大容量机械盘阵列普遍推荐 RAID 6,而数据库场景更推荐 RAID 10。
还有一个认知误区必须澄清:RAID 不是备份。RAID 解决的是"单块硬盘故障不中断服务",它无法防止误删除、程序逻辑错误写入坏数据、勒索软件加密、以及机房级故障。这些场景下 RAID 会忠实地把损坏的数据同步到所有盘上。备份是独立于 RAID 的另一件事,两者必须都有。
RAID 卡本身也有讲究。带缓存和电池(或电容)保护的 RAID 卡,可以在掉电后保住写缓存里的数据;开启写缓存能显著提升写入性能,尤其是 RAID 5/6 这类需要计算校验的场景。没有电池保护的缓存建议关闭写策略或者谨慎使用。
# 软 RAID 查看状态(mdadm 方案)
cat /proc/mdstat
mdadm --detail /dev/md0 # Debian/Ubuntu: apt install mdadm;RHEL 系: yum install mdadm
# 硬 RAID 查看(以常见厂商工具为例,需按实际 RAID 卡安装对应工具)
# storcli /dev/c0 show # 部分 Broadcom/LSI 卡
# megacli -LDInfo -Lall -aAll # 较老的 LSI 卡
# hpacucli ctrl all show config # 部分 HPE 服务器
# 具体工具名以服务器厂商文档为准
# 查看是否有 RAID 卡(通过内核设备判断)
lspci | grep -iE 'raid|sas|megaraid' # Debian/Ubuntu: apt install pciutils
六、怎么判断磁盘是不是瓶颈
给一套实用的排查方法。
# 最直观的指标:磁盘利用率与等待时间
iostat -x 2 # Debian/Ubuntu: apt install sysstat;RHEL 系: yum install sysstat
iostat -x 输出里要重点看三列:%util 接近百分之百说明磁盘已经饱和;await 是平均每次 IO 的等待时间,机械盘超过十几毫秒、固态超过几毫秒就算偏高;svctm 在较新的版本里已不再可靠,主要看 await 和 %util。另外 r_await 和 w_await 分开看能判断是读还是写的问题。
还有一个经典判断方法:看 top 里的 wa(IO 等待)百分比。如果 CPU 使用率不高但 wa 很高,同时负载很高,基本可以确定是磁盘 IO 瓶颈。
其他辅助命令:
# 看哪些进程在产生磁盘 IO(需内核支持)
iotop -o # Debian/Ubuntu: apt install iotop;RHEL 系: yum install iotop
# 查看进程打开的被删除但仍占用的文件(日志删了空间没释放就是它)
lsof +L1 | head -20
# 查看某进程正在写哪些文件
lsof -p | grep -E 'REG|DIR'
# 快速定位大文件
du -xh --max-depth=1 / 2>/dev/null | sort -rh | head -15
lsof +L1 这条命令解决的是一个非常常见的困惑:磁盘显示满了,但用 du 统计所有文件加起来不够。原因是有进程还打开着某个已被删除的大文件(比如忘了做日志轮转的服务),文件在文件系统里已经被删,但空间没有释放。解决办法是重启对应服务或者清空文件句柄,而不是删除文件。
七、选型建议汇总
| 场景 | 推荐介质 | 容量考量 | 冗余建议 |
|---|---|---|---|
| 操作系统盘 | SATA SSD 或 NVMe | 100-200 GB 足够 | RAID 1 镜像 |
| 数据库主存储 | NVMe 或企业级 SAS/SATA SSD | 按数据量乘 2 到 3 倍预留 | RAID 10 |
| 数据库从库 | 企业级 SSD | 同上 | RAID 10 或单盘加备份 |
| 虚拟化宿主 | NVMe 或企业级 SSD | 按虚机总和预留 | RAID 10 |
| Web 静态资源 | SSD | 按资源量 | 视重要性定 |
| 日志与监控数据 | HDD 或大容量 SSD | 按保留周期算 | 可不做冗余 |
| 冷备份与归档 | HDD | 按保留周期乘增长量 | 异地多份 |
| 视频素材仓库 | HDD 大容量 | 按素材量 | RAID 6 |
| 开发测试环境 | 普通 SSD | 够用即可 | 不需要 |
容量规划上有个经验:数据库盘不要按当前数据量配置,要按"当前数据量乘以二到三倍"配置,因为binlog、临时表、索引重建、表碎片、备份文件都会占空间,而且数据会增长。磁盘使用率超过百分之八十就应该开始规划扩容,超过百分之九十就比较危险了,因为很多数据库操作需要临时空间。
常见问题
Q:NVMe 一定比 SATA SSD 快很多吗?
随机读写 IOPS 上差距明显,通常在一个数量级左右。但如果你的业务是顺序读写大文件,两者的差距会小很多。另外,实际感受还取决于其他瓶颈,如果业务瓶颈在 CPU 或网络,换 NVMe 可能感觉不到变化。
Q:数据库一定要用 NVMe 吗?
不是必须。数据量小、并发低、查询简单的库,SATA 固态完全够用。判断标准是看 iostat 的 %util:如果长期超过百分之七十,就该升级存储;如果只有百分之二十,说明瓶颈不在磁盘。
Q:云服务器该选哪种云盘?
取决于业务。入门级的高效云盘适合轻量应用和普通网站;SSD 云盘适合多数数据库和在线业务;高性能或者本地 NVMe 盘适合 IO 密集型数据库。选择前建议用 fio 实测一下 IOPS 和延迟,以实测数据为准,具体规格与价格以主流云厂商官网为准。
Q:SSD 会不会突然坏掉没预兆?
固态确实不像机械盘那样有明显的机械故障前兆,但它有写寿命指标可以监控。定期看 Percentage Used 和 SMART 的关键属性,配合备份,就能把风险控制在可接受范围。不要依赖预警,要有备份。
Q:机械盘做备份盘可靠吗?
可靠,而且成本低。关键是备份要多份、要异地、要定期验证可恢复性。一块从没验证过的备份,等于没有备份。建议定期做恢复演练,实际把备份恢复到一个临时环境验证一遍。
Q:RAID 卡缓存要不要开写缓存?
有电池或电容保护的可以开,能显著提升写入性能,尤其是 RAID 5/6。没有掉电保护的不要开写缓存,断电时会丢失缓存中的数据甚至损坏阵列。
总结
选硬盘不要只看容量和厂商宣传的顺序读写速度。服务器业务真正吃的是 4K 随机读写的 IOPS 和延迟,这两个指标才是决定数据库快慢的关键。
三个数量级要记住:机械硬盘随机读写在百级 IOPS、延迟毫秒级;SATA 固态在几万 IOPS、延迟百微秒级;NVMe 固态在几十万 IOPS、延迟几十微秒级。差一个数量级,数据库查询耗时就会差一个数量级。
机械硬盘没有被淘汰,它在冷备份、归档、日志存储、大文件仓库这类顺序读写为主且看重单位容量成本的场景里仍然是性价比最高的选择。不适合的场景是数据库主存储和虚拟化宿主。
企业级固态贵在持续写入稳定性、掉电保护、明确的 TBW/DWPD 寿命指标和一致性延迟。数据库这类持续写入负载尤其需要这些特性,Percentage Used 超过 70% 就该列入更换计划。
RAID 解决的是单盘故障不中断,它不能替代备份。大容量机械盘阵列优先 RAID 6,数据库优先 RAID 10,RAID 5 在大容量盘上的重建风险需要认真评估。
判断磁盘是否瓶颈,看 iostat -x 的 %util 和 await,以及 top 里的 wa。确认瓶颈在磁盘后再升级存储,否则换再快的盘也不会有效果。
企业QQ咨询




