发生读错误或写错误的扇区会被标记为坏扇区。确切地说处于「pending」状态。因为扇区的重映射仅在硬盘向被标为「pending」的扇区写入数据时发生,所以在读取失败的扇区被写入数据之前,它还没有进入硬盘内的坏扇区列表 (G 表) 中。
每个扇区除存储用户指定的数据之外,还存了本扇区数据的 ECC 校验码,用于校验和恢复本扇区内失真的用户数据。用 ECC 校验码恢复数据的过程由硬盘主控完成。ECC 校验失败且无法恢复就是读错误的一种情况,所以 ECC 校验失败且无法恢复的扇区会被按坏扇区处理。
硬盘缓存指焊在硬盘电路板上的 RAM 颗粒,断电之后其中的数据丢失。
对于机械硬盘来说,在阵列卡配置中关闭硬盘缓存可以提升阵列的可靠性。因为,在开启缓存时,硬盘将数据放入缓存就向阵列卡报告写入成功,而如果断电发生在硬盘将缓存中的数据写入盘片之前,则导致数据丢失,阵列出现不一致。关闭缓存时,硬盘在把数据写入盘片之后才会向阵列卡报告写入成功,断电不会引起数据不一致。
但机械硬盘中的例外是叠瓦式硬盘,这类硬盘关闭缓存会导致写性能下降到几乎无法接受的程度,很容易出现 I/O 大量超时的问题,所以必须打开硬盘缓存以提高性能。
对于固态硬盘来说,必须在阵列卡配置中打开硬盘缓存以提高硬盘性能。由于阵列卡不支持 trim,所以必须打开固态硬盘的缓存来提升硬盘主控执行 gc 的速度,从而提升硬盘的性能。此外,遇到断电时,硬盘自带的电容中的电量可以让硬盘将缓存中的数据转移到 NAND 颗粒上,所以也不存在丢失固态硬盘缓存内的数据的问题。
由于阵列卡不支持 trim,所有不带缓存的固态又没有主动 gc 的能力,所以不带缓存的硬盘在阵列卡上连最低劣的性能都无法维持,会直接掉盘。
注: 关闭硬盘缓存指的是关闭硬盘的写入缓存,不论写入缓存是否开启,硬盘的读缓存都正常工作。读缓存由硬盘主控控制,用户无法配置。
strip size 的含义是 Raid 卡读写硬盘的最小单位。Raid 卡带电池的话,开启 Raid 卡缓存后,64k, 128k 或 256k 的 strip size 可以满足大多数使用场合。小文件读写多选 64k,多用途的话选 128k,媒体文件读写为主用 256k。
极个别情况下才需要把 strip size 设置为 4k,比如,某些数据库使用 4k 大小来存储一个数据页。但现在很少有 Raid 卡支持 4k 的 strip size,比如 LSI Raid 卡可以设置的最小 strip size 是 8k。
当 4 盘 Raid 5 的 strip size 值为 64k 时,stripe width 为 3 (3 个数据盘),stripe size 为 3 * 64k = 192k。校验盘上存储的实际上是 3 个数据盘上共 192k 数据的校验值。
当有 1 个数据量小于 64k 的 I/O 时,4 盘 Raid 5 中的 1 个数据盘处理这个 I/O,同时 Raid 卡找到这个 I/O 的目标 strip 及其所在的 stripe width 中剩余的 2 个 strip,计算这个 stripe width 的校验和并存入校验盘。
当有 3 个数据量小于 64k 的并发 I/O 时,4 盘 Raid 5 中的 3 个数据盘同时工作,分别处理这 3 个 I/O,同时,校验盘计算这 192k 空间(1 个 stripe width)的校验值并存入硬盘。
当有 1 个数据量小于 128k 但大于 64k 的 I/O 时,Raid 卡会先把这个 I/O 按 strip size 切分成数块,一个 64k 的 I/O,一个小于 64k 的 I/O,4 盘 Raid 5 中的 2 个数据盘同时分别处理这两个 I/O,同时 Raid 卡找到这 2 个 I/O 的目标 strip 及其所在的 stripe width 中剩余的 1 个 strip,计算这个 stripe width 的校验和并存入校验盘。
读一个 20k 的文件或一个 50k 的文件都要先完整地读出文件所在的这 64k 空间,再在这 64k 空间中找到所需的文件。但一个 65k 的文件就需要 2 个 strip size 共 128k 的空间,这也导致文件被切分开,读这个文件时需要读出这两个 64k 空间的内容,再从这些数据中拼出所需文件的数据。
Raid 卡会尽可能填满 strip size,减少空间浪费,所以一个 strip size 的空间内有可能存在多个文件的数据。此外,校验盘只存储一个 stripe width 的所有空间的校验信息。
LSI 9271-8i 使用了 2208 阵列卡芯片,它是使用 2208 芯片的性能最强的阵列卡。
9271 阵列卡背面贴纸上有 fru 编号,或者可以进入系统后使用 LSI 阵列卡管理软件 MSM 获取更准确的 fru 编号。可以确认 fru 以 10B 或 38001 (MSM 中显示为 001) 结尾的都是原厂的卡。其中,10B 是 2012 到 2013 年生产的卡,38001 是 2014 年后生产的卡。13D, 22B 22C, 33B 结尾的是思科定制的卡,14A, 17A, 28A 可能也是思科定制的卡。思科的 13D, 22B, 22C 不支持 fastpath,28A 和 33B 支持 fastpath,但所有思科定制的 LSI 9271 都不能识别其它 LSI 芯片阵列卡组建的阵列。
原厂 LSI 9271 不仅带有 fastpath 功能,而且可以识别并兼容几乎所有其它 LSI 芯片阵列卡组建的阵列,包括 LSI 原厂卡及其它 OEM 定制的 LSI 芯片的卡。
从 Windows 10 1709 开始,Windows 内置了错误的 2208 芯片的驱动,只要组建阵列,Windows 就蓝屏。必须在组建阵列前,或接入有阵列的硬盘前手动更新驱动才行。但使用 2108 芯片的性能较差的、更老的 LSI 9260 系列没有问题。
Windows server 2022 上的 2208 阵列卡芯片即使安装了最新驱动也会经常蓝屏,出现 WHEA 错误,这个错误和使用了错误驱动的 Win10,Win11 的报错不同。Windows Server 2019 上的 2208 芯片没有这个问题。
storcli v6.14 是最后一个 v6 的版本,是 9271-8i 官方写明支持的最后一个版本的 storcli 工具。
storcli v6 支持使用 storcli64 /c<num> set patrolread maxconcurrentpd=<num>
来设置 Patrol Read 可以一次性处理的硬盘的数量 (默认 255),但无法显示该属性的值。必须要使用至少 0007.0209.0000.0000 版本的 storcli 工具才能让 storcli64 /c<num> show patrolread
也显示 maxconcurrentpd 这个属性。
storcli v6 在显示 CacheVault 的 Next Learn 属性的时候有 bug,v7 修了。
MSM (MegaRaid Storage Manager) 是 LSI 给 6G/s 的 Raid 卡开发的管理程序,使用本地的 GUI。
LSA (LSI Storage Authority) 是 LSI 给 12G/s 的 Raid 卡开发的管理程序,使用 WebUI。
MSM 从 17.05.03.00 开始需要用户手动安装 JRE 和相关的 java 依赖包,但这个 jar 包已经很久不维护了,而且所需版本的 JRE 不好找。最后一个不需要用户手动处理 JRE 和依赖关系的 MSM 的版本是 17.05.02.01。
但是这个版本无法从 Broadcom 官网下载,官网给的 URL 不对,访问会报 404。正确的下载链接是:
LSA 安装包里 README.txt 的兼容性描述里面没有 2xxx 系列的 6G/s 的芯片,只有 3xxx 系列的 12G/s 的芯片。
如果蜂鸣器在响,可以先用 storcli64 /cx set alarm=silence
让蜂鸣器静音。(不是关闭蜂鸣器,不影响蜂鸣器再响)
storcli64 /cx/ey/sz set offline
storcli64 /cx/ey/sz set missing
storcli64 /cx/ey/sz spindown
storcli64 /cx show autorebuild
可以查看是否打开自动重建storcli64 /cx/ey/sz insert array=0 row=0
,array, row 的值可以从 storcli64 /cx/dall show
的输出中获取。标记完成之后,重建会自动开始storcli64 /cx/ey/sz insert dg=0 array=0 row=0
(多一个 dg 参数) 标记插入到阵列的硬盘。dg, array, row 的值可以从 storcli64 /cx/dall show
的输出中获取storcli64 /cx/ey/sz start rebuild
开始重建另外,默认的重建阵列时的 I/O 压力是 30%,使用 storcli64 /cx set rebuildrate=<rate>
调高 I/O 压力 (1-100) 可以加快重建。
Patrol Read 作用于硬盘上每个可读的扇区。
Patrol Read 执行时,Raid 卡向硬盘发出 ATA read-verify(0x40) 命令来读取数据。这个命令不会让硬盘向 Raid 卡传输数据,而是让硬盘自行检测扇区数据。
如果 strip 中有硬盘报扇区读取错误,那么 Raid 卡就从属于同一个 strip 的其他硬盘上读数据 (读其他的 strip segment, strip parity 等数据),重建这个报错的这部分数据 (重建 strip segment 或 strip parity)。
数据重建后,使用 ATA write-verify(0x3C) 命令将重建好的数据写入报错的那个硬盘。命令执行成功后,继续验证下一个 strip (其他的扇区)。
Patrol Read 期间如果有无法重建的 strip,比如 Raid5 strip 中的 2 个 strip unit 报错,或者 Raid6 strip 中的 3 个 strip unit 报错,那么这个无法被重建的 strip 会被添加到 Bad Strip Table 中。
Patrol Read 也作用于热备盘。
CC 作用于阵列中使用 RAID 1, 5, 6, 10, 50 或 60 的 Virtual Drive (VD)。
CC 读取 VD 中的每一个 strip 并计算其所包含的数据是否一致。例如,在具有奇偶校验的系统中,检查一致性意味着计算一个硬盘上的数据,然后将结果与奇偶校验硬盘上的内容进行比较。
如果 CC 过程中硬盘报扇区读取错误,那此时 CC 行为与 Patrol Read 相同,即重建数据。
在 WebBIOS 中创建的 VD 默认使用 fast initialization,VD 立即可用,初始化 VD 的操作在后台进行。如果遇到重启,重启完成之后初始化继续,不会导致初始化重新开始。
但是这个初始化过程无法被 storcli64 /cx/vx show init
观察到。
使用 storcli64 命令创建 VD 之后并不会自动启动初始化进程,需要用户手动启动初始化。
在使用机械硬盘建立阵列时,关闭硬盘写入缓存可以有效提高阵列的可靠性。详见通用的知识一节。
关闭 PV 写入缓存的命令为:
storcli /c0/v<num> set pdcache=off
可以用 storcli64 /c0/v<num> show all
来查看 VD 状态,其中,表示 PV 写缓存策略的属性的名称为 Disk Cache Policy 其值应为 Disabled 。
LSI 9271 阵列卡在 Linux 上的驱动有 bug。测试出 bug 的发行版为 CentOS 7,8 以及 Debian 11, 12。bug 的具体表现为,可以在系统日志中找到 raid card reset 相关内容的日志,然后阵列卡丢失所有硬盘。原因未知。
LSI 9271 等 2208 芯片的阵列卡自 Windows 10 1709 版本开始,芯片的驱动就故意搞成错的,只要组建阵列,系统就蓝屏,一直不修复,必须在组建阵列或者接入有阵列的硬盘前手动更新驱动才行。但采用 sas2108 芯片的性能较差且更老的 LSI 9260 系列没有这个问题。
在 Windows Server 2022 上的 2208 芯片的阵列卡即使安装了最新驱动也会经常蓝屏,出现 WHEA 错误,和之前 Win10, Win11的报错不同。Windows Server 2019 则没有这个问题。同时,博通不再提供任何驱动更新。
微软和博通这些花活应该是计划报废的一部分,打算在企业端彻底报废 2208 芯片阵列卡。