一个Linux多路径磁盘过滤驱动程序 第32 计算机工程ComputerEngineering 2006 May2006?开发研究与设计技术?文章号 t100o_-3428(2006)09_一o23o_一03 文献糟}识个Linux多路径磁盘过滤驱动程序 (1.北京理工大学计算机科学与工程系,北京10008I;2.华中科技大学计算机科学学 院,武汉430074) 摘要:研究 Linux 系统中多路径磁盘过滤驱动程序的设计和实现.驱动程序将物理 磁盘的多路径封装为一个虚拟没备.虚拟设备的I/O 请求转发到磁盘设备执行,由路径选择算法将主机的负载均衡地分配到各路径上. 当路径发生故障时由驱动程序将失败的I/O 请求切换 到其它路径,屏蔽了路径故障.驱动程序利用多路径改善了主机的 1/0 性能,提高了 系统的町用性. 关词:容错;高可用性:负载均衡;Linux AMulti-pathDiskFilterDriverforLinux TANYu'an.ZHULigu (1.Dept,ofComputerScienceandEngineering,BeijingInstituteofTechnology,Beijing100 081: 2.SchoolofComputerScience,HuazhongUniversityofScience&Technology,Wuhan 430074) [Abstract]Amulti pathdiskfilterdriverforLinuxisdesignedandimplementedtorepresentthepluralityofdatapathstotheI/Odeviceasasingle virtualdevice.TheI/Orequestsforthevirtualdeviceareredirectedtoselecteddiskdevices, andtheI/Oloadisdistributedamongmultiplepathsby thepathselectionalgorithm.Ifonepathfails,theincompleteI/Orequestsareredirectedtothes urvivalpathsSOthepathfailureisisolated.Thefilter driverincreasesthedataaCCeSSthroughputandavailabilitybyusingmultiplepaths. [Keywords]Faulttolerance;Highavailability;Loadbalance;Linux 路径是主机和RAID设备之间的数据传输路径,只有 路径时,如果任何一个元素发生故障,主机就不能访问到存储系统,应用程序就不能继续运行.为提高可用性, 需要采用冗余配置,在主机和RAID 设备中建立两条或多条 并行的路径.在软件方面,必须在操作系统的存储架构中增 加一个SPD(Storagepathdriver)设备驱动程序,完成负载均衡 和故障切换等功能.该驱动程序将1/0 分配到不同的路径 在路径故障时将1/0转移到其它路径. 文献【1J 介绍了在Linux 的SCSI 中间层进行修改扩充的 种实现方法,它和操作系统代码紧密耦合,避免创建冗余的磁盘没备,节约了内核空问.但它依赖于具体的Linux 核版本,在内核的I/O处理过程中引入了较复杂的数据结构 和路径管理,不便于移植.文献[2l 在光纤卡驱动程序的层次 上实现冗余功能,只能支持Qlogic 光纤卡,通用性较差.本 文实现了一种基于磁盘驱动程序的过滤驱动程序,它以模块 (module)的形式实现,适用于从2.4-2.6 的各种内核版本和各 种硬件环境 硬件环境1.1 多路径磁盘的配置 多路径磁盘如图 所示,RAID系统中的一个逻辑存储 单元(1ogicalunit,LUN)映射到两个端口(port)上,再连接到 主机的光纤接口卡(hostbusadapter,HBA),主机和磁盘设备 之间就建立了冗余的I/O 路径,主机可通过任何一条路径访 问LUN. 对于连接到多条路径上的LUN,Linux 系统为每一条路 径都创建一个磁盘没备.磁盘设备的类型为sd(scsidisk),每个sd 设备都被赋予一个唯一的设备号和SCSI 地址.磁盘设 备号由主设备号(major)和次设备号(minor)构成,而SCSI 23(卜址由HBA 号,总线号,ID 号,LUN 个部分组成.固光纤": ]光纤困:圄:.:l 主机 多路径t盘配置 每个sd 设备上又可以创建15 个磁盘分区,在分区设备 上建立文件系统.分区设备也使用sd 驱动程序,其设备号等 于磁盘设备号加上分区号,分区号的范围为 l_2路径识剐 Linux 系统根据SCSI 地址和启动时发现 LUN 的顺序来 创建磁盘设备,在多路径环境下,一个LUN 就对应于多个磁 中,主机通过HBA1发现了 LUN1 LUN2,创建sda 和sdb,接着又通过HBA2 发现了这两个LUN,又 创建了sdc 和sdd.因此,LUN1 的路径为sda 和sdc,而LUN 的路径为sdb和sdd. 驱动程序需要识别出一个LUN 的多条路径,并为其建立 个唯一的设备名供上层使用.为识别LUN 的路径,向系统中的每一个sd 设备发出查 询(Inquiry)命令,从Inquiry 命令返回的数据中取得 LUN 唯一标识(uniqueidentifier,UID).UID相同的所有sd 设备对 基金项目:国家自然科学基金资助项目(60273073) 作者倚介:谭毓安(1972 一),男,博士,副教授,主研方向:存储区 域网络和计算机安全;朱直谷,博上后,副教授 收穑日期:2005—05—23E- mail;victortan@yeah.net 应于同一个LUN.例如,向上述的4 个sd 设备发送 Inquiry 命令时,通过查询sda 和sdc 取得的标识相同,对应于 LUNl; 而由sdb 和sdd 取得的标识相同,对应于LUN2. 不同RAID 系统中返回 LUN 的UID 的方法有所不同, UID 可能放在标准查询页的序号(serialnumber)字段中,也可 能放在扩展查询页(vitalproductdata)O0 的相关字段中.可通 过标准查询页的厂商(vendor)字段确定 RAID 系统的类型,再 使用对应方法取得UID. 2SPD 驱动程序设计 对每一个LUN,SPD 驱动程序建立一个虚拟设备(pseudo device),即spd 设备.和sd 设备不同,spd 设备和 LUN 对应的.文件系统和上层应用程序的1/0请求都发送给spd 设备,而不再直接发送到州设备.系统配置中对sd 设备的 引用需要转换到spd 设备上.如sda 是spda 的一个路径,不 能对sda 设备直接进行 mount 操作,只能在 spda 设备上进行. SPD 驱动程序处理所有对spd 虚拟设备的I/O 请求.收 请求后,从其路径集合中选择一个sd设备执行.如果 该路径出现故障,I/O 请求失败后通知SPD 驱动程序,则选 择另外一个路径重新执行. 2.1I/O 请求的处理 Linux 系统中为块设备建立了blk—dev 数组.驱动程序在 该数组中为spd 设备设置对应的参数,如设备号,磁盘容量 等,再调用register—blkdev(J 注册spd 设备.同样,再将 spd 设备上的分区插入到gendisk 链表中.之后,SPD 驱动程序 就能够接收到来自上层对spd 设备的I/0 请求. 对一个设备的所有的I/O 请求以buffer_head 结构表示, 结构中包括该I/O 的设备号,缓冲区指针,扇区号等.在blk—dev 数组中,驱动程序登记sp—make—request 作为对spd 设备的I/0 请求的处理函数,由它负责处理所有对spd 设备 请求.其执行流程如图2所示. 分配spbz 『调用路径选择算法将选择的sd 没备号放入 bh 一>b—rdev 将bh交给磁盘驱动程序 sp—end— request:入口bh 图2SPD 驱动程序对I/O 请求的处理 sp—make—request 收到对spd 设备的1/O 请求bh 请一个新的结构spbf),spb中包含bufferhead 结构bh.bhp 由SPD 驱动程序使用,而bh 由磁盘驱动程序使用.由路径 选择算法为1/O 请求选择一个路径,路径的sd 设备号送 bh 一>b— rdev.再设置bh 的回调函数为 sp—end—request.当I/0 操作bh 由磁盘驱动程序完成后,内核会调用sp—end—request 通知SPD 驱动程序. 在sp—end—requestl1|,若bh 执行成功,将该路径的状态 标记为正常,再调用bhp 的回调函数向上层报告bh 执行成 功,释放spb 结构.若路径发生故障,则bh 执行失败,标 记路径的状态为故障,再检查sp 的重试次数,如果超过了 预定的重试次数,则调用bhn 的回调函数报告bh 执行失败, 否则将spb 加入到重试队列中.重试次数缺省设鼍为20,重 试次数应该大于路径个数,以保证在向上层报告bh 每条路径上都至少执行过一次.SPD 驱动程序创建一个线程,线程定期检查重试队列. 重试队列记录了失败的,需要重试的I/O 请求.从重试队列 中取出spb 结构,为它重新选择一个路径执行,此时spb 构中的重试次数加1.驱动程序还创建一个线程定期检测各路径的状态,向磁 盘设备发送"测试单元准备好"(testunitready)命令,根据命 令执行的结果设置路径状态. 2.2 路径选择算法 本文提出一种基于HBA 负载的路径选择算法,将主机的 个路径,对应的磁盘设备为DI,,…,.路径选择算法根据各个路 负载来确定选择一条路径,将当前I/O请求发送 到该路径上执行设主机上有 m个HBA,按顺序编号为1, 2,…,m.根据磁盘设备的SCSI 地址即可确定它属于哪一个 HBA,第 条路径的HBA 编号记为日 f,这里 为每一个HBA设置两个计数器,第个HBA 的计数器 记为c,和,这里1m.cf HBA正在处理的I/0 请求的总数.代表的是HBA 的当前负载,而代表了HBA 完成的总负载. SPD 驱动程序收到一个I/0 请求后,从该 LUN 径中选出P,1p且路径P的HBA 负载最小.选择路径 的过程为:M:=最大整数;N:=最大整数 fori:=ltOndo 取得路径i 磁盘设备D 以及 所属HBA的编号I=H if(MCf)then M:=Ci:P::i if(>)then fjfi 是HBA 的最小计数器,所以算法首先选择的是HBA 负载最小的路径(cf 最小).如果有若干个路径的cf 相等,再 从中选择计数器最小的哪一条路径.在负载较轻的情况下, 各HBA 的cf 计数器很小,借助计数器中记录的历史信息, 将负载均匀地分配到各I/O 路径. 选择出路径P 后,向磁盘设备D 发送I/O 请求,取得 D,,所属HBA 的编号 l=HD,Cf 和分别增加 请求执行完毕后,c』减去1. 实验结果在RedHatAdvancedServer2.1(内核2.4.9e3)操作系统下 进行测试.RAID 存储设备采用SUNStorEdge3510,主机的 配置为2.4GHzPentium4CPU,内存为1GB.在生机上安装 QLA2342 光纤卡,卡上的2 个端口分别连接到 RAID 主机通道上由12个Seagate36GB(sT336752F)按RAID0 构成一个4l3GB 的逻辑磁盘,映射到2 个主机通道1=.缓存 优化策略为顺序I/O,写回(write—back)方式. 231—3.1 故障切换测试 为测尾故障切换时间,使用_,dt 测试软件它将数据写 入LUN 后,再读回并进行比较,以验证数据读写的正确性. 在测试结束后,dt 报告的结果包括:读写是否正确,测试过 程持续的时间,平均数据传输速率等. 在以下4 种情况下分别运行dt 测试程序写入大小为 500MB 的文件. (1)路径IE (2)在RAID控制器中解除当前路径的 LUN 映射; (3)将主机和磁盘阵列之间的当前路径的光纤电缆拔F; (4)重新启动RAID 控制器. 第(2),(3)种情况足对一条路径故障的模拟;而第(4)种情 况是对两:条路径同时发生故障的模拟,在RAID 控制器最新 启动过程中,2 条路径均处于故障状态下,直到控制器启动 完成后才恢复正常. dt 运行时间如表 所示取各次测试得到的运行时间的平均值,将故障情况下dt 的运行时间减去正常运行时间,就 得到故障切换时闻. 故障韧换时问的测试结果(单位:s)测试项目正常取消映射拔F 光纤最新启动 次27.26287754l387.07平均269l282760.1O92.45 切换时问l3633.I965.54 不同故障条件下,故障切换所需的时间相差较大,主要 取决于I/O 请求在故障路径下的执行时问.取消LUN 的映射 时,路径的物理连接仍保持正常,LUN 返回的错误码能够到 达主机的HBA 及磁盘驱动程序,I/O 请求立即返同到E 由SPD驱动程序进行重试处理.而其它两种故障情况下,主 机的HBA 及磁盘驱动程序不能及时获得 LUN 的状态,直到 请求超时后才向上返回到SPD驱动程序,凶此故障切换 时间较长.在所有的测试巾,dt 测试程序都报告数据枝验正 常,SPD 驱动程序在路径故障发生后通过存正常路径上重试 请求,保证了数据访问的连续怵.3.2 负羲均衡测试 对顺序读,顺序i,随机读,随机写4 种访问模式,分 别选取12 块长(从512B一直到1MB),在不加载SPD 驱动程序条件下直接对sd 设备读写,测得1 条路径的吞吐能 力;之后再加载SPD 驱动程序直接对spd 设备读写,得出使 条路径进行负载均衡后的吞吐能力.最后取测试结果的平均值,如表2 所示,其中吞吐能力的单位为MB/s. 负载均衡的测试结果测试项口l 条路径2 蕞路径提高比例 顺序读106288I9799586.28% 顺序写73.6l997.7773282% 随机读59.95870573l7+70% 随机写68.47878.3I5I437% 结果显示,负载均衡功能提高了主机的吞叶能力,分别 提高了86.28%,32.82%,17.70%,14.37%,随着吞吐能力的 提高,I/O 请求的平均响应时间也相麻缩短. 结论本文设计的多路径驱动程序在路径故障时能将I/O 请求 切换到正常路径,提高了系统的日J 用性.基于HBA 负载的 路径选择算法将生机的I/O 请求动态地分配到各HBA 高了系统的I/O处理能力.同时,由于采取了过滤驱动程序 的设计方式,此具有较好的通用性,易于移植到不同的 Linux 内核版本甚至其它操作系统k 在测试中,在随机读 的访问模式下负载均衡对1/0 处理能力的提高幅度不明 显,需要进一步研究解决. 参考文献 1AndersonM.MansfieldRSCSIMidlevelMultipathlCIProceedings oftheLinuxSymposium,Canada2003:27—37. 2UnderstandingFailoverl_Z].http://www.qlogiccorn/documents/datash eets/knowledge_ data/whitepapers/tbraikwer.pdf,2005. 3RubiniA,CorbetJ.L,inu~I)eviceDrivers[MJSebastopol,USA: O'Reilly&Associates.Inc.,2(/05. 几姐试验参考文献 1TsengBL,LinChingYun,SmithJR.Real—timeVideoSurveillance forTrafficMonitoringUsingVirtualLineAnalysis[C1.Proceedings of2002IEEEInternationalConfeFenceonMultimediaand Expo,2002. 2SotoA,CiprianoA.ImageProcessingAppliedtoRealTime Measurement0rTramcFlow[C1.IEEE,ProceedingsoftheTwentyeighthOutheasternSymposil' mOHSystemTheory.1996. 朱汀,官国荣,郑振东.基于视频动态投影的实时车辆流量检测系统【川.计算机_L 程,200l,27(11):25—27 王琳,冯海军,卢朝阳.一种基于聚类分析的实时=变通流量监测系统….电视技术,2004,(1):82—84. 5FungGSK.YungNHC.PangGKH,eta1.FowardsDetectionof MovingCastShadowsfi)rVisualTrafficSurveillance[e1.200lIEEE InternationalConfeFenceonSystems,Man.andCybernetics.2001. 6RojasJc.CrismanJD.VehicleDetectioninCokn'Images[C]. ITSC'97.IEEEConferenceooIntelligentTransportationSystem, l997:4(B.408 7CucchiaraR.GralIaC,PiccardiM,eta1.hnprovingShadow SuppressioninMovingObjectDetectionwithHSVColorInfornla— tion[C]Proceedingsof2001IEEEIntelligentTransportationSystems ConreFoRce0akland,CAUSA,200I:334.339. 8PratiAMikicI-MohanM.TrivediandRitaCucchiaraDetecting MovingShadows:AlgorithmsandEvaluation[JlIEEETransactions onPatternAnalysisandMachineIntelligence,2003,25(7):9l8-923