主机 光 纤 光 纤 ”: 困 :圄 : l 圈 1 多路径t 盘配置 每个 sd 设备上又可以创建 1 5 个磁盘分区,在分区设备 上建立文件系统。 分区设备也使用 sd 驱动程序, 其设备号等 于磁盘设备号加上分区号, 分区号的范围为 l一 】 5。 l_2 路径识剐 Linux 系统根据 SCSI 地址和启动时发现 LUN 的顺序来 创建磁盘设备, 在多路径环境下, 一个 LUN就对应于多个磁 盘没备。 在图 1中, 主机通过 HBA 1发现了LUN 1和 LUN 2, 创建 sda 和 sdb,接着又通过 HBA 2 发现了这两个 LUN,又 创建了sdc 和 sdd。 因此, LUN 1的路径为 sda和 sdc, 而 L UN 2 的路径为 sdb 和 sdd。 驱动程序需要识别出一个 LUN 的多条路径, 并为其建立 个唯一的设备名供上层使用。 为识别 LUN 的路径,向系统中的每一个 sd 设备发出查 询(Inquiry)命令,从 Inquiry 命令返回的数据中取得 LUN 的 唯一标识(unique identifier, UID)。UID 相同的所有 sd 设备对 一基金项 目:国家自然科学基金资助项目(60273073) 作者倚介:谭毓安(1972一),男, 博士、副教授, 主研方向: 存储区 域网络和计算机安全;朱直谷,博上后、副教授 收穑日期:2005— 05— 23 E-mail;victortan@yeah. net 维普资讯 http://www.cqvip.com 应于同一个 LUN。例如,向上述的 4 个 sd 设备发送 Inquiry 命令时, 通过查询 sda和 sdc 取得的标识相同, 对应于 L UN l ; 而由sdb 和 sdd 取得的标识相同,对应于 L UN 2。 不同 RA ID 系统中返回 LUN 的 UID 的方法有所不同, UID 可能放在标准查询页的序号(serial number)字段中,也可 能放在扩展查询页(vital product data)O 0 的相关字段中。可通 过标准查询页的厂商(vendor)字段确定RA ID 系统的类型, 再 使用对应方法取得 UID。 2 SPD 驱动程序设计 对每一个 L UN, SPD 驱动程序建立一个虚拟设备(pseudo device),即spd 设备。和 sd 设备不同, spd设备和 LUN是一 一对应的。 文件系统和上层应用程序的 1 / 0 请求都发送给 spd 设备,而不再直接发送到 州 设备。系统配置中对 sd 设备的 引用需要转换到 spd 设备 上。如 sda是 spda 的一个路径 ,不 能对 sda设备直接进行 mount 操作, 只能在 spda设备上进行。 SPD 驱动程序处理所有对 spd 虚拟设备的 I/ O 请求。收 到 I/ O请求后, 从其路径集合中选择一个 sd 设备执行。如果 该路径出现故障,I/ O 请求失败后通知 SPD 驱动程序,则选 择另外一个路径重新执行。 2. 1 I/ O 请求的处理 L inux 系统中为块设备建立了blk— dev 数组。 驱动程序在 该数组中为 spd 设备设置对应的参数,如设备号、磁盘容量 等,再调用 register— blkdev( J注册 spd 设备。同样,再将 spd 设备上的分区插入到 gendisk 链表中。之后,SPD 驱动程序 就能够接收到来自上层对 spd 设备的 I/ 0 请求。 对一个设备的所有的 I/ O请求以buf f er_head结构表示, 结构中包括该 I/ O 的设备号、缓冲区指针、扇区号等 。在 bl k设备的 I/ 0 请求的处理函数,由它负责处理所有对 spd 设备 的 I/ 0 请求。其执行流程如图 2 所示。 — dev 数组中,驱动程序登记 sp— m ake— request 作为对 spd 分配 spbz ● 复制 bh, 】 到 bh ◆ 调 用 路 径 选 择 算 法 『将选择 的 sd 没备号放入 bh 一 >b— rdev ◆ 将 bh . >b— end io 没为 sp _ cn d— req ue st ● 将 bh 交给磁盘驱动程序 sp— end— request :入 口 bh 图2 SPD驱动程序对 I/ O 请求的处理 sp—m ak e— request 收到对 spd 设备的 1 / O 请求 bh 后,申 请一个新的结构 spbf ),spb 中包含 buffer head 结构 bh 。bhp 由SPD 驱动程序使用,而 bh 由磁盘驱动程序使用。由路径 选择算法为 1 / O 请求选择一个路径,路径的 sd 设备号送 bh 一 > b— rdev。 再设置 bh 的回调函数为 sp— end— request。 当 I/ 0 操作 bh 由磁盘驱动程序完成后,内核会调用 sp— end— request 通知 SPD 驱动程序。 在 sp— end— request l1|, 若 bh 执行成功, 将该路径的状态 标记为正常,再调用 bhp 的回调函数向上层报告 bh 执行成 功,释放 spb 结构。若路径发生故障,则 bh 执行失败,标 记路径的状态为故障,再检查 sp 的重试次数,如果超过了 预定的重试次数,则调用 bhn的回调函数报告 bh 执行失败, 否则将 spb 加入到重试队列中。重试次数缺省设鼍为 20,重 试次数应该大于路径个数,以保证在向上层报告 bh 前,在 每条路径上都至少执行过一次。 SPD 驱动程序创建一个线程,线程定期检查重试队列。 重试队列记录了失败的、需要重试的 I/ O 请求。从重试队列 中取出 spb 结构,为它重新选择一个路径执行,此时 spb 结 构中的重试次数加 1。 驱动程序还创建一个线程定期检测各路径的状态,向磁 盘设备发送 “ 测试单元准备好” (test unit ready)命令,根据命 令执行的结果设置路径状态。 2. 2 路径选择算法 本文提出一种基于 HBA 负载的路径选择算法, 将主机的 I/ O 负载动态地分配到每个 HBA 上。设 LUN 有 n个路径, 对应的磁盘设备为DI, , ⋯, 径上的 I/ O 负载来确定选择一条路径,将当前 I/ O 请求发送 到该路径上执行 设主机上有 m 个 HBA ,按顺序编号为 1, 2,⋯ , m。根据磁盘设备的 SCSI 地址即可确定它属于哪一个 HBA ,第 i 条路径的 HBA 编号记为 日f,这里 l ≤f≤n,1≤ 。路径选择算法根据各个路 日 ≤ m 。 为每一个 HBA 设置两个计数器,第 个 HBA 的计数器 记为 c , 和 , 这里 1≤ ≤m。cf为该 HBA 正在处理的I/ 0 请 求个数, 为发送给该 HBA 的I/ O 请求的总数。 HBA 的当前负载,而 代表了 HBA 完成的总负载。 SPD 驱动程序收到一个 I/ 0 请求后, 从该 LUN 的 n个路 径中选出P,1≤ p≤ 且路径 P 的 HBA 负载最小。选择路径 P 的过程为: M : = 最大整数 ; N : = 最大整数 for i : = l tO n do 取得路径 i 磁盘设备 D 以及D 所属 HBA 的编号 I=H if (M ≥ Cf) then M : = C i : P : : i 代表的是 if (Ⅳ> ) then N : = : P : = i fj fi 是HBA 的最小 负载最小的路径(c f最小)。如果有若干个路径的 cf相等, 再 从中选择 计数器最小的哪一条路径。 在负载较轻的情况下, 各 HBA 的c f计数器很小, 借助 将负载均匀地分配到各 I/ O 路径。 选择出路径 P 后,向磁盘设备 D 发送I/ O 请求 ,取得 D, , 所属 HBA 的编号 l=HD ,Cf和 行完毕后,c 』 减去 1。 3 实验结果 在 RedHat Advanced Server 2. 1( 内核 2. 4. 9e3)操作系统下 进行测试。RAID 存储设备采用SUN StorEdge 3510,主机的 配置为 2. 4GHz Pentium 4 CPU,内存为 1GB。在生机上安装 QLA 2342 光纤卡, 卡上的2 个端口分别连接到 RA ID 的2 个 主机通道上 由 12 个 Seagate 36GB(sT336752F)按 RAID 0 构成一个 4l3GB 的逻辑磁盘, 映射到 2 个主机通道 1 =。 缓存 优化策略为顺序 I/ O,写回(write— back)方式。 计数器, 所以算法首先选择的是HBA 计数器中记录的历史信息, 分别增加 l ;I/ O 请求执 ~2 3 1— 维普资讯 http://www.cqvip.com 3. 1 故障切换测试 为测尾故障切换时间, 使用_ ,dt 测试软件 它将数据写 入 L UN 后,再读回并进行比较,以验证数据读写的正确性。 在测试结束后,dt 报告的结果包括:读写是否正确,测试过 程持续的时间,平均数据传输速率等。 在以下 4 种情况下分别运行 dt 测试程序写入大小为 500MB 的文件。 ( 1) 路径 I E常; (2) 在 RAID 控制器中解除当前路径的 LUN 映射; (3) 将主机和磁盘阵列之间的当前路径的光纤电缆拔F ; (4) 重新启动 RAID 控制器。 第(2)、 (3)种情况足对一条路径故障的模拟; 而第(4)种情 况是对两: 条 路径同时发生故障的模拟, 在 RAID 控制器最新 启动过程中,2 条路径均处于故障状态下,直到控制器启动 完成后才恢复正常。 dt 运行时间如表 l 所示 取各次测试得到的运行时间的 平均值, 将故障情况下dt 的运行时间减去正常运行时间, 就 得到故障切换时闻。 袭1 故障韧换时问的测试结果(单位: s) 测试项目 正常 取消映射 第 1次 26 59 27. 75 第 2 次 26 88 28. 3(】 第 3 次 27. 26 28 77 平均 26 9l 28 27 切换时问 l 36 不同故障条件下,故障切换所需的时间相差较大,主要 取决于 I/ O请求在故障路径下的执行时问。 取消 LUN 的映射 时, 路径的物理连接仍保持正常 , LUN返回的错误码能够到 达主机的HBA 及磁盘驱动程序,I/ O 请求立即返同到 E层, 由SPD 驱动程序进行重试处理。而其它两种故障情况下,主 机的 HBA 及磁盘驱动程序不能及时获得 LUN 的状态,直到 I/ 0 请求超时后才向上返回到 SPD 驱动程序,凶此故障切换 时间较长。在所有的测试巾, dt 测试程序都报告数据枝验正 常,SPD 驱动程序在路径故障发生后通过存正常路径上重试 拔 F 光纤 56. 68 69, 49 54 l 3 60. 1 O 33. I 9 最新启动 9I. 96 98. 33 87. 07 92. 45 65. 54 I/ O 请求,保证了数据访问的连续怵。 3. 2 负羲均衡测试 对顺序读、顺序 i 、随机读、随机写 4 种访问模式,分 别选取 12 种 1 / O 块长(从51 2B 一直到 1MB),在不加载 SPD 驱动程序条件下直接对 sd 设备读写, 测得 1条路径的吞吐能 力;之后再加载 SPD 驱动程序直接对 spd 设备读写,得出使 用 2 条路径进行负载均衡后的吞吐能力。最后取测试结果的 平均值,如表 2 所示 ,其中吞吐能力的单位为MB/ s。 表2 负载均衡的测试结果 测试项口 l 条路径 顺序读 1 06 288 顺序写 73. 6l9 随机读 59. 958 随...