已阅读5页,还剩47页未读, 继续免费阅读
(计算机软件与理论专业论文)并行文件系统数据访问的负载平衡.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
i 摘 要 随着人们对高性能计算的需求越来越大,并行处理作为高性能计算的一种重要手 段,也越来越得到重视。然而,在很多应用中,并行处理的能力受到削弱,其原因之 一是因为负载不均衡,引起在某些部件上存在瓶颈,制约整个系统的吞吐量。为此, 负载平衡对维护系统的性能具有重要作用。为了有效地在并行文件系统中实现数据访 问的负载平衡,本文以 pvfs(parallel virtual file system)为例采用数据迁移与副本相 结合的机制。 该机制在 pvfs 中增加一些模块,在各个 iod(i/o 节点)上统计得到负载信息, mgr(管理节点)每隔一段时间向所有的 iod发请求,要求把负载信息传递上来。检测 哪些磁盘的热度比较高,找出这个磁盘上的热点。为提高迁移的收益,选择迁移的热 点应该是那些使迁移收益/代价最高的数据文件, 将这些热点迁移到热度比较低的磁盘 上去,使负载趋于平衡。系统实现的模块主要有:负载平衡的元数据管理,负载信息 的统计,负载信息的收集,负载平衡的计算,负载的迁移。通过对 pvfs 做负载平衡, 性能有一定的提高。 但是有些数据的热度很大,迁移到哪儿都会引起这个磁盘的热度上升很多,引起 新的负载不平衡的现象产生,这时,迁移机制就失效了。为解决这一问题,当这样的 高热点出现时可以采用副本的方法。选择当前经过统计为最冷的磁盘做副本。当读热 点文件时,由于热点文件已经做了几个副本,随机选择一个副本进行读操作。副本必 须维护一致性,使副本文件能并发读,串行写。 关键词:负载平衡,数据迁移,热度,副本 ii abstract with more and more high performance computing are needed ,parallel transaction is regardeg as a important method in high performance computing,also become important.in many cases,parallel processing transaction ability is weaken because of load imbalance,there are bottleneck in some action,and lower it s thoughput.so load balancing is important for maintain system performance.in order to carry out data accessing load balancing in parallel transaction,data migration and duplicate are used. some model are added in pvfs,the load information are collected in every iod,mgr sends request to iods periodicity for load information.if detecting the heat of some disk high,finding the heat pot on the disk. considering migrating those heat pot, the benefit/cost must be considered in migrition ,migrating the heat pot to the coldest disk,balancing the load.migrating is migrating the heat pot from the hottest disk to the coldest disk. the system s module include:load balancing meta data management,load information s static,collection,load balancing computing,load migrition. after load balancing in pvfs,the performance has some rising. some data s heat is so high that the disk s heat become very high when the data is migrated in,a new load imbalance appear.duplicate can solve this problem,when the heat file is accessed,the heat file already has several duplicate,randomly selecting a duplicate to read.duplicate can solve all load imbalance,but the duplicate s consistency must be kept,the duplicate must be read in parallel and write in chain. key words: load balancing, data migrition, heat, duplicate 1 1 绪论 本章主要介绍课题的背景,国内外的研究概况,课题的主要研究工作。 1.1 课题的背景 随着科学技术和社会的发展,人们对高性能计算的要求越来越高,但是大、中型 计算机比较昂贵,而工作站和 pc 机的处理能力不断增强1,并且工作站和 pc 机以及 快速网络已经商品化, 特别是一些公用的免费软件的出现, 如 linux 操作系统, gnu 的编译器,mpi 和 pvm 消息传递库,提供了独立于硬件的软件。运用如 hpcc 之类 的编程方法已经有了多年的并行算法的编程经验,使得廉价的 pc 机或工作站组成的 集群系统具有良好的性能2。经验告诉我们,要获得高性能的并行计算的平台,是一 个需要我们付出努力的工作。并行计算的平台的发展是随着计算机科学的发展和高性 能计算的需求的增长而发展的。 我们经常说性能由处理机而提高,但对于 beowulf(linux集群的一种)来说,性能/ 价格的提高主要取决于网络技术的提高。为了市场的开拓,就必须要使用商用的或某 种为大众所广泛使用的编程工具。第一个 beowulf 采用的是 dx4 处理机和 10mbit/s 的以太网。处理机对于一个以太网来说太快,而且以太网交换机太贵。为了平衡这个 beowulf 集群系统,don becker 重新写了 linux 的驱动程序,建立了一个“通道绑 定”的以太网,网络的流量通过两个或多个以太网来分担。在 100mbit/s 的以太网和 以太网交换机比较便宜时,通道绑定就消失了。在 1997 年一个由 16 个节点,由快速 以太网和快速以太网交换机连接的 200mhz p6 处理机出现了。平衡的集群系统的网 络构成不断变化,而且独立于集群的规模。beowulf 集群的一个重要的特征是不管处 理机的类型和速度,网络技术,以及其它部件如何变化,编程模式都不变化。因此我 们可以有更多的经验积累。 为了利用多个节点同时进行 i/o,缓解磁盘和网络及处理机的带宽,利用快速网 络,一种有效的方式是运用并行文件系统,这种文件系统在各种商业的并行机上广泛 使用。pvfs 是一种并行文件系统,不但用于并行的研究,也广泛地用于集群。数据 在集群上是分片存放的,当数据对各个节点的访问比较均衡时,效果比较好,但是访 问的数据局限于某个或少数几个节点时,系统并行处理的能力就削弱。这时,有的节 2 点处于繁忙的状态,有的节点则比较空闲,浪费了有限的网络和 cpu 等资源,对数 据的放置进行重新安排能有效地克服这些缺点,使系统能发挥最大的优势。 为此需要对负载平衡问题进行研究,提高系统并行处理的能力。 1.2 国内外概况 随着微电子技术的发展,集群的性能不断提高,但是性能离人们的要求还有一定 的差距,并行文件系统发展相对不足也是制约性能提高的因素之一。下面介绍几种主 要的并行文件系统发展概况。 1.2.1 并行文件系统研究概况 gpfs3是 ibm 公司开发的用于集群的并行共享磁盘文件系统,用在 rs/6000 sp 并行超级计算机和 linux集群中。普通的文件操作用户可继续使用普通的 unix命令。 gpfs 允许共享访问跨多 sp 节点的多个磁盘驱动器的文件。gpfs 文件系统并行存放 在多个存储节点的多个盘上,单个文件作为“ 块” 分散存放在不同存储节点的盘上。通 过在一个 sp 系统不同节点上运行多个进程, gpfs 可支持对同一文件的不重迭区域 的同时读/写,如图 1- 1 所示。 文件系统节 点 交换机 共享磁盘 图 1- 1 gpfs 系统结构图 加州大学伯克利分校实现的 xfs6是一种无集中式服务器(serverless)的系统, 系统中所有工作站在提供文件服务方面的地位是均等的,任何一台机器都能够存取、 缓存及控制任意的数据块。该方法利用位置独立性(location independence) ,并结合 3 快速局域网,比传统的网络文件系统能提供更好的性能和可扩展性。另外,由于这种 无集中式服务器的任一台工作站可以承担出现故障部件的责任,因此可以采用冗余数 据存储以提供高可用性。xfs 它主要完成了下列功能:并行协调式的元数据管理、合 作式缓存、并行 i/o 支持(即类似于软件 raid5的实现) 、日志式存储管理,解决在 实现 raid 的校验功能产生的大量小块写问题。 但 xfs 还没有实现其它的一些重要功 能,如:系统崩溃后的恢复和垃圾清扫,没有实现管理器状态的检查点和“向前滚” 功能,也没有实现管理器映射图和磁盘分组映射图。xfs 的系统结构如图 1- 2 所示。 存储服务 器 客户端 垃圾清 扫器 管理器 存储服务 器 客户端 垃圾清 扫器 管理器 存储服务 器 客户端 垃圾清 扫器 管理器 网络 图 1- 2 xfs 系统结构图 sistina 推出的 gfs4(全局文件系统)是一种面向 linux操作系统的集群文件系 统,允许位于一个存储区网络(storage area network: san)中的多个服务器可以对一 个共享的 san 设备中的文件进行读写。gfs 支持客户机故障时的日志和恢复。gfs 集群器节点通过 fibre channel或共享的 scsi 设备物理共享共同的存储器。看起来, 文件系统在每个节点上都像是本地机上的, gfs使文件访问在集群器中保持同步。 gfs 是完全对称的,也就是说,所有节点都是均等的,没有哪个服务器会是瓶颈或出现任 何故障。gfs 在维护所有 unix 文件系统时使用读/写缓冲。但是,gfs 也存在着一个 缺点,它只能运行在较新的 scsi 控制器上,而不能在以前的产品上运行。不过对于 使用集群并且装备了新设备的用户来说,gfs 是非常好的解决方案。gfs 的系统结构 如图 1- 3 所示。 4 图 1- 3 gps 系统结构 trucluster7 最显著的特色表现在独特的集群文件系统上。这个基于根目录的集 群文件系统的显著特征表现在:用户完全不需要考虑文件是存储在与所有集群成员相 连接的设备上,还是存储在单个集群成员专有的设备上,每个文件系统都由单个集群 成员负责,其他成员均统一按照集群文件系统客户机的身份访问该文件系统。集群文 件系统保留了文件系统访问所涉及的全部 x/open和 posix 语义, 并使整个集群成员 的高速缓存内容保持一致,这对那些希望使用标准 unix 文件锁定应用程序以确保同 步访问共享文件的客户来说至关重要。在文件系统的访问路径出现故障的情况下,集 群文件系统将会自动启用另一条访问路径;如果支持文件系统的硬件设备出现故障, 集群文件系统则会自动选择集群中的另一台设备接替出错的环节,在最短时间内实现 故障切换。 pvfs 是 clemson university的并行结构研究室的一个项目。pvfs 的设计目的是 为 linux 机群系统提供一个产品级的高性能的并行文件系统。 pvfs 采用 client/server的模式,在系统中有多个服务器,它们被称为i/o 守护进 程。和 galley、armada一样,pvfs 使用了 i/o 结点机(i/o 守护进程就在其上运行) , 以及计算结点,这些计算结点通过客户端程序库来访问 i/o 结点机。 5 1.2.2 负载平衡的研究概况 负载平衡的研究领域很广,有任务的负载平衡和数据访问的负载平衡,任务迁移 的很多思想对数据迁移有借鉴意义,比如迁移的触发机制,负载信息的统计,迁移对 象的选取,阈值的确定等。虽然本文研究的是数据访问的负载平衡,也有必要介绍任 务的负载平衡。还要介绍数据放置的动态负载平衡。 在并行分布式动态负载平衡算法中,有集中式策略与分布式策略8 。集中式管理 有一个全局的管理机制。而分布式策略是由若干个场点的计算机共同参与来完成负载 平衡的。根据由谁触发负载平衡这一过程,分布式算法分为两类:一类是原发者主动 (source initiative)策略,另一类是服务者主动(server iniatiative)策略9 10。在原发者主 动算法中,当某个场点的负载超过设定的负载阈值之后,就要开始查询系统中的轻负 载点。负载阈值将分布式系统中的计算机分成轻载与重载两类。当负载阈值采用静态 的方法确定时,其算法称为非适应性算法。如果采用动态的方法确定负载阈值,则称 为自适应算法。 过去的研究人员认为原发者主动算法11 12适用于平均负载处于轻载或中等负载 的系统。当系统的平均负载超过了这一程度时,应采取服务主动策略。得出这种结论 是出于这样一种考虑,当整个分布式系统的平均负载处于轻载或中等负载时,就有若 干个轻载的节点。因此处于重载状态的计算机会很容易地查询到某个轻载场点,以便 将部分负载迁移。另外,当系统的平均负载超过一定值之后,系统接近于饱和状态。 这样就有极少的计算机能为其他计算机提供资源,因此采取服务者主动策略。不过一 个真正的分布式系统要比这种直觉复杂得多。有的研究人员的研究结果表明:原发者 主动策略在大多数情况下比服务者主动策略要好13。在原发者主动策略中,典型的算 法是 bidding 算法14,而以服务者主动方式进行负载平衡的典型算法,包括时间驱动 法(tds) 15等。 分布式计算机系统的负载平衡算法,可以按平衡的决策与系统的状态是否相关, 分为状态无关平衡(静态平衡)和状态相关平衡(动态平衡)两大类16 17。状态无 关平衡,就是根据以往的经验或系统的经验或系统本身信息的收集,把外来的任务分 配给各个节点,或对某些节点的任务进行重新分配。例如随机平衡,把第 i 个任务分 配给第 i mod n 个节点(n 为系统的节点总数) ;概率平衡,按照概率 pi (由任务的平 均到达速率和节点的运行速率确定)把任务分配给第 i 个节点。由于这样一来的平衡 决策与系统当前状态无关,带有一定的盲目性,因而,决策的准确性是很低的。常用 6 的有静态平衡法18、图论法19、枚举搜索法20、排队法21、启发法22等。 状态相关平衡23,其决策取决于系统当前的状态,也就是说,系统可以根据当前 的负载分布情况,对各个节点上的负载进行动态的调整,使已经分配给重载节点上的 任务,通过通讯设备,迁移到轻载的节点上去,从而达到提高系统资源利用率,减小 任务的平均响应时间的目的。通常,动态平衡法应包含以下三个步骤:各个节点间负 载信息的收集;根据所收集的负载信息进行决策;实现负载在各个节点之间的迁移。 这样的附加处理给系统增加了一定的开销。但是这种开销是值得的。目前,大多数系 统都采用动态平衡法。负载平衡要解决的核心问题有两个:一是何时进行任务迁移; 另一个是怎样进行任务的迁移。换句话说,就是如何确定发生迁移的节点对。我们把 要求发出任务的节点称为发送节点,而迁入任务的节点称为接收节点,为了确定某个 时刻,一个节点是否为发送节点或接收节点,必须对系统的负载情况进行评价19。通 常,判断节点某个时刻是否为发送或接收节点方法有两种,一种称为门坎法20:当节 点的负载低于某一门坎 t1 时,为接收节点;而高于某一门坎 t2 时;则认为是发送节 点;介于门坎 t1 和 t2 之间,则认为该节点工作正常(其中 tdsize; 接着分两步来发出,首先发请求,然后发文件的名字。 mgr 收到客户端的请求后,首先解析文件的名字,确认文件的名字,确认正确 后,就要找出 fs_p 的内容,是通过 quickmoun来实现的。在 quickmount()中,先获 取 dir 的元数据内容,然后在 fslist_p 中检索 dir.fs_ino,获取 fs_p 的值。如果这次不成 功,可以通过伪请求的方式来实现.先在 fslist_p 中找,如果找不到就增加一项 fs_p, 初试化 fs_p,插入到 fslist_p,下面再次查找 fslist_p,然后返回 fs_p。接着在找出文件 元数据的 inode号,如果找不到就建立一个新的。然后 mgr就向 iod发 open 请求, 如果发现元数据有迁移标志,则在向 iod 发请求时要注意重定位 iod。先连接各个 27 iod,然后查看文件的旗标,如果不是非阻塞状态,要设置非阻塞状态,然后发送请 求。向 iod发送内容有两次,一次是发请求,另一次是发送文件的名字。 迁入数据的 iod 收到 mgr 发来的请求后首先解析文件名。iod 上的文件名与 mgr 上的文件元数据 inode 号不同,但有联系。文件的元数据 inode 号和 iod的文件 的名字有一个转换关系。iod首先打开这个元数据文件对应的文件。接着进入打开函 数 int open(const char *pathname,int flags,mode_t mode );参数 pathname 指向 欲打开的文件路径字符串,参数 flags 代表所能使用的旗标。打开文件之后,要返回 一个文件描述符 fd。要把打开的文件放在打开文件列表中。然后把 fd 和请求来的一 些数据返回给 mgr。mgr再给客户端返回内容有迁移数据后的元数据和迁入数据的 iod的 inode 的文件名,文件的读写权限等。如果mgr发送到 iod的请求失败,要 给客户端发出请求失败的通知,如果是新建的元数据,要把这个元数据删除。 然后客户端直接与 iod通信,向 iod发送 noop 请求,建立一个简单作业,检 验 iod是否能有效地完成任务。 除了在打开文件的过程中管理元数据外,系统在迁移完数据后,mgr 会修改元 数据。指出哪些段需要迁移,从哪个热磁盘迁移到哪个冷磁盘。 3.3 负载信息的参数 负载信息在各个 iod读写的过程中统计的,或者负载平衡的计算中得到的。各个 段的负载信息按照一定的顺序排列。 负载平衡中所用到参数如下: (1)heat :一段时间内访问段内字节的总数。 (2)temperature:heat/size。size 为迁移部分的大小,这里是段的长度。因为 heat 正比于迁移的收益 benefit,因为迁移的代价正比于迁移段的大小,段越大花费的网络 传输时间和读写时间也越大,所以 temperature 就可代表性能/价格 benefit/cost。 (3)hj:pvfs 段 j 的 heat。 (4)d:磁盘的数目。 (5)hi*:磁盘 i的 heat。 (6)hav:磁盘的平均 heat。 (7)ei:磁盘 i上所有访问的段按 temperature 的降序排列的链表。 (8)di:所有的磁盘按 heat 升序排列的链表。 28 (9)fi:所有的磁盘按 heat 降序排列的链表。 (10)d:迁移的阈值。 (11)副本元数据表。保存需要做副本的段的元数据。 (12)活动副本元数据队列。正在执行 i/o 的副本的元数据。在 pvfs 中没有对 副本的管理,活动副本队列的引入主要是为了维护副的一致性。即允许并发读,但对 于并发多个写或多个读写请求要串行化。 (13)等待副本元数据队列。标识不能执行 i/o,必须等待其他副本执行完才能 执行的副本的元数据。 3.4 负载平衡作业及其负载统计算法 为了统计各个访问段的访问数据量和各个磁盘的热度,找出热点,有必要收集负 载信息。负载信息统计的是各个段的访问情况,其它信息可以由负载信息间接获得。 由两个参数可以唯一标识一个段,它们是段所在的文件元数据 inode 号和段首地 址。统计访问的该段字节总数是计算负载的基础。获取段大小用于计算温度。读访问 的该段字节总数和写访问的该段字节总数是做热点的副本的依据。温度标识迁移的代 价,参数里已有描述。 struct heatqun int32_t f_ino; /*段所在的文件元数据 inode 号*/ int32_t offset; /*段首地址*/ int32_t heat; /*访问的该段字节总数*/ int32_t size; /*段大小*/ int32_t heatr; /*读访问的该段字节总数*/ int32_t heatw; /*写访问的该段字节总数*/ float tempreture; /*值为 heat/size*/ heatqun *next; ; 负载信息的统计主要在 iod读和写过程中实现的, 下面描述读写的通讯协议和负 载信息的统计过程,在读写过程中描绘负载平衡作业的主要数据结构的内容。图 3- 3 描述了读操作过程中负载的统计。这里以读为例分析负载信息的统计过程。客户端要 读数据,首先检查文件描述符,文件描述符的标识如表 3- 1 所示。 29 client iod mgr r e a d : n b r e c v ( s o c k , l o c , s i z e ) (负载信息的统计) c o n n e c t ( ) a c c e p t ( ) r e a d : a _ a c k s i z e , i r e q a _ r e q s i z e , i r e q 文件大小是否有偏差 是: m r e q ( m e t a ) t y p e = m g r _ f s t a t m a c k 图 3- 3 pvfs 的读操作过程中的负载统计 表 3- 1 文件描述符标识 文件的偏移量 文件的元数据 文件的权限 文件的引用次数 i/o 的组号 打开文件的标志 io d 的信息数组 文件的查找是以偏移量为基准的,文件的偏移量记录的是逻辑的地址在整个文件 系统中离首部的距离,在 iod接受到请求后还要翻译成物理的地址。文件在接收到请 求后,还要看是否能满足用户的请求。在文件共享时,如果引用的次数没有变化到 0, 是不能断开这个 socket 连接的。文件的存放是以组为单位进行存放的,不同的节点组 成的组是不一样的。打开文件后,如果下一次还有别的文件对同一个文件有请求,就 不用再发伪请求对 mgr 读取元数据了。iod 的信息开始是空的,在 mgr 建立一个 组后,随着不同的节点的加入,数组记录不同节点的信息,主要内容是 iod的地址和 30 端口号。 接着客户端就要向 iod 建立读请求和作业队列。 建立作业队列的过程也是把数据 分片的过程,即指定下一片放在哪儿或从哪儿读取。如果发生迁移之后,要在建立作 业时解析元数据,重新定位文件的分片节点。在 add_accesses(fdesc_p f_p, int64_t rl, int64_t rs, char *buf_p, int type)中实现。 iod接收到客户端的的读请求后, 先要查找文件打开表中关于该 inode 号的文件, 看该文件是否被打开(前面说过在文件 open 时已经加进去) 。如果找不到,就返回 错误。找到之后,检查文件的 sock 是否标记为- 1,如果是这样,则把这个 sock 设置 为当前的 socket。文件 i/o 要保证文件大小的正确性。在 iod工作过程中定义了一个 结构体描述文件的状态,主要有以下内容:文件的设备编号,文件的 inode,文件的类 型和存取权限,连接到该文件的硬连接数,刚建立的文件值为 1,文件所有者的用户 识别码,文件所有者的组识别码,文件为装置设备文件,为其设备编号,文件的大小, 以字节计算,文件系统的 i/o 缓冲区大小,占用文件区块的个数,每一区块大小为 512 字节,最近一次被存取或被执行的时间,一般只有在用 mknod,utime,read,write, truncate时改变,文件最后一次被修改的时间,一般只有用在 mknod,utime,write 时 才会改变,最近一次被更改的时间,此参数会在文件所有者、组的权限被更改时更新。 接着把文件描述符所指的文件的状态,复制到文件状态所指的结构中。 图 3- 4 描述了写操作过程中负载信息的统计: client iod w r i t e : n b s e n d ( s o c k , l o c , s i z e ) (负载信息的统计) c o n n e c t ( ) a c c e p t ( ) a _ r e q s i z e , i r e q i a c k 图 3- 4 pvfs 的写操作过程中负载的统计 31 前面说过,客户端要建立请求队列,iod也要为读请求建立作业了。先检查文件 的 socket 号的数值是否大于作业的最大 socket号,如果大于最大 socket 号,则需要修 改作业的 socket 号。作业的指针要指向该打开的文件。 iod端作业的标识如表 3- 2 所示。 表 3- 2 iod 端作业标识 作业标识符 操作类型 空间标识 socket 列表 最大 socket 号 是否需截断的标识 作业移动的数据量 上次作业访问的字节 打开文件的信息 访问列表 如果在磁盘上写文件时已经没有空间,要继续写就要丢一些数据,要求作业做出 相应的调整, 重新申请空间来完成作业。 访问文件时, 不是每个作业都建立一个 socket, 而是很多作业共享, 这样可以减低会话建立的过程中的开销。 如果新建立了一个文件, socket 号大于以前最大的号,必须更新这个最大 socket号。在传输的过程中,如果数 据量过大,那么发送可能会出错,这时候要把数据分成几段来传。作业完成后,还可 以返回本次请求的总共传输的数据量。在访问过程中,为了方便起见,对逻辑上连 续的数据,下一次访问要接着上次数据的末尾进行。 负载信息的统计要在数据访问的过程中进行。数据的访问是以段为单位,在完成 了作业的建立以后, 要执行建立的作业队列, 而作业的执行主要是在 do_access()里进行。 在 inline int do_access(jinfo_p j_p, ainfo_p a_p, int8_t *nospc)中 a_p 是访问列表的 指针。一个段的读或写将要执行。在执行完操作后要把这个段的访问作业从列表中删 除。段的作业的内容主要有:作业类型(表示文件是读还是写) 、作业所在的 socket 号、段离逻辑文件的首部的距离、请求的总的尺寸、打开文件的指针。 文件只有在打开之后,才处于活动状态。在客户端向 mgr 发出请求,要求访问 某个文件,mgr 检索自己的文件索引,如果找不到该文件,就创建一个,如果找到 了,就访问文件所在的几个 iod节点,通知它们有客户访问它们,让它们做好准备, 32 同时获取 iod上该文件的信息,iod接收到 mgr 的通知,把这些文件的目录信息写 到内存的一个链表中,该文件的变为活动状态,这个文件叫打开文件。打开文件的标 识如表 3- 3 所示。 表 3- 3 打开文件的标识 元数据的 inode 号 打开文件的权限 文件描述符 元数据的地址 文件的大小 分区号 交换分区描述符 组描述符 文件的元数据是以 inode 来标识的,在 iod上也有一套检索机制机制,把 iod通 过一个函数把该文件的元数据的 inode 数值转换成另外一个数,把这个数作为本文件 的标识,因此,只要给出元数据的 inode 就可以知道本文件在 iod上的文件名称。但 是,有时,转换出来的名字可能会和以前的名字发生冲突,这时候要对该文件重新进 行命名了。文件在比较大时,可能会用到交换分区,把一部分暂时不用的数据放到上 面。文件打开时,对于组访问的打开设置成- 1,不是组打开时设置成文件的 socket 号。 因为 pvfs 文件是按照 round robin的方式存放的,不同的节点属于同一文件的不同分 区,以便于客户端发送建立作业请求时知道该连到哪个节点上去。对于不同的组也应 该标识出来,以便于文件的访问。 发出读写请求后,在打开文件之后,iod端建立读写作业,客户端也要建立读写 作业队列。客户端作业的标识如图 3- 4 所示。 表 3- 4 客户端作业标识 文件的访问类型 socket 总数 最大 socket 号 请求的数据大小 段作业队列指针 iod 组的大小 客户的作业的数据大小是本次的请求大小,因此数据最大也只能是整个段。当作 业执行完毕后,要把本次作业从作业队列中删除。由于 iod的组在初始化之后是 1, 33 随着访问的进行,不断地检测到新的节点,iod组的大小也不断地变化。 处理过程中首先检查要访问的类型,然后决定到不同的流程。以读为例来说, 要与最大值进行比较,选取读写的尺寸和它比较的较小值作为参考的标准。还要比 较文件的偏移量与读写的尺寸之和是否大于最大值,如果大于则报错。然后进行读 操作,读操作完后总共需要的读写量减去本次读的数据。如果本次的操作完后结果 为 0,说明该作业已经完成,就删除在作业队列的对应的表项,然后返回 1。如果作 业没有完成,用偏移量加上本次读取的数据量,同时删除作业列表中的对应项,然 后返回 0。如果偏移量小于最大值,就发送文件。描述一下此函数的功能。首先获 取这个文件的锁定状态,如果不是非阻塞状态,则要把这个文件设置成非阻塞状态。 然后发送文件。发送的过程是分段发送的即每次发送一小块。每次发送完后都要修 改剩余的发送量和下一次的文件的起始偏移量。在循环结束后要返回总的发送的数 据量。 负载信息的收集是在每个 iod 节点上收集的,当某个 iod 为客户端传送完数据 后,就把这次传送的负载信息收集起来。 一段时间后,mgr 发请求给各个 iod,要 求传来各自的访问信息。 各个 iod负载信息的统计算法为: 入口:负载信息; 出口:ei链表的头指针; 初始化 ei链表为 null。 while(到达一个负载信息) 查找 ei链表中有无 f_ino 和 offset 相同的段 if(无相同的 f_ino 和 offset 的段) 把该负载信息按 temperature 的降序排列插入 ei; else 该信息节点脱离链表,加上本次访问的 heat; if (是读访问) heatr 加上本次访问的 heat; else 34 heatw 加上本次访问的 heat; 重新计算 tempreture; 按 temperature 的降序排列插入 ei; 负载信息的统计模块在文件 jobs.c 里实现。 3.5 负载信息的收集 各个 iod负载信息统计后要发送到 mgr,mgr 定时收集信息并处理。 mgr 定时启动设置在 int startup(int argc,char *argv)里。在这个函数里,先建立一个 socket 通信端口,然后设置 socket的状态,允许在 bind( )过程中本地地址可以重复使 用。得到套接字描述符以后,就把套接口和机器上的端口绑定在一起,然后在给定的 地址和端口上监听。然后把该进程变成守护进程。接着,就是定时启动程序了,下面 给出描述。 sigemptyset( act.sa_handler =(void *) transreq; act.sa_flags = 0; if(sigaction(sigalrm, perror(pvfsiodalrm:sigaction); return(- 1); signal(sigalrm ,transreq); alarm(3600); iod 收到请求后,就要整理负载信息发到 mgr,负载的信息是以链表的方式存 储的,因为链表便于插入,删除等操作,而链表不便于发送数据,这里就把链表整理 成数组的形式,然后传输。发送的时候要分两次发,一次是发 ack,另一次才是数据。 下面是 ack 的内容。 struct iack 35 struct int smallsize; int seg; transload; ; 本文选择每一个小时启动一次负载收集的处理。启动后向各个 iod 发收集信息 的请求。iod向 mgr 发送请求的类型是 iod_transload,这是一个在 mgr上新 添的处理函数,处理负载信息的接收,计算哪些磁盘的访问过于频繁,哪些磁盘的访 问相对较少,在热度高的磁盘上又有哪些需要迁移和做副本。 iod收到请求后,就要整理负载信息,负载的信息是以链表的方式存储的,因为 链表便于插入,删除等操作,而链表不便于发送数据,这里就把链表整理成数组的形 式,然后传输。发送的时候要分两次发,一次是发 ack,另一次才是数据。 mgr 接着就接收 iod发送过来的数据,不过要把数组变成链表。数据的排序还 要维持原来的不变。先解析接收到 ack 包中的关于 inode 总数和读写数据的总量,然 后接收 iod发过来的负载信息,返回读写的数据总量 。比较返回的数据总量和解析到 的数据总量,看是否一致。在接收过程中还要汇总磁盘的读写总数,也就是所有 inode 的热度之和。iod传送的负载信息要按照倒序传送,也就是 temperature 递减的顺序, 而 mgr 接收后要转换成递增的顺序。 负载信息的收集模块在文件 iod.c 里实现。 3.6 负载平衡的算法 负载信息是一段一段地收集的,收集文件的 inode 号,读写段的 heat,一段时间内 的总的 temperature 等,在 mgr 端要统计哪些磁盘的访问量最大,哪些磁盘的访问量 最小,因此要记录磁盘号,该磁盘汇总的热度,是否有迁移的标志。 还要建立两个队列记录各个磁盘的热度,一个队列是按照磁盘热读由高到低的顺 序,另一个是按照磁盘热度由低到高的顺序。在统计完每个磁盘的热度之后,都要插 入到这两个队列中。 前面讲过建立两个不同排序的磁盘热度队列,这样是为了找出最热和最冷的磁 盘。取出按照磁盘热度逆序的队列的第一个磁盘则是最热的磁盘,反之,取出按照磁 36 盘热度顺序的队列的第一个磁盘则是最冷的磁盘。迁移前要计算磁盘的平均热度。同 时要提出一个阈值,这个阈值是依据统计结果得出的数据。如果最热的磁盘的热度超 出磁盘平均热度的阈值的倍数,就有必要迁移,否则,没必要迁移,因为迁移是要花 费代价的,小于一定的阈值,迁移得到的收益可能还会小于迁移付出的代价。选取迁 移的的磁盘时,首先从最热的第一个磁盘开始选取作为迁移出去的磁盘,然后选取最 冷的磁盘作为迁入的磁盘。这两个磁盘的数据结构都必须脱离原来的队列,等到迁移 过程完了后还重新计算它们的热度, 选取最热的磁盘中 temperarue 最高的 inode 迁移, 这样的收益/迁移代价是最大的。 计算完毕后重新把这两个磁盘的数据插入到这两个队 列。 如果在迁移的计算过程中发现最冷的磁盘迁移进来数据后,热度升高很大,超过 了阈值的规定,那么,这个迁移的数据热度很高,不能再继续迁移了,因为迁移到哪 儿都会引起别的磁盘的热度升高很多,又要继续迁移该块,这就是常说的抖动,这时 应采取制作副本的方式。 如果试迁移某一文件到最冷的磁盘上时,发现高于阈值,就要设置高热点标志。 下一次又碰到该文件时,也必须再次做副本。也就是说,某一文件的副本可以制作多 份,自动实现可扩展性。下面是负载平衡的算法。 loop1 选取 fi的第一个盘,即最热的盘 s。 if (hs* hav(1+) return ; else 选取 es 的第一个段 e; loop2 选取 di的第一个磁盘 t; /*heat 最低的磁盘*/ loop3 hs* = hs*- he; ht* =ht*+he; if(ht* heatw) /*做副本*/ hs* = hs*- he/2; ht* =ht*+he/2; es 中 e 段的 heat 减半并重新排序; et 中加入 e 段的负载信息,e 段的 heat 也减半; 重排 di,fi; 在磁盘 t 上做 e 段的副本; 元数据管理单元修改元数据,写入副本信息; 在副本元数据表中写入负载信息; else if (es 没遍历完) /*对写引起的高热点的处理*/ 选 es 的下一个段; goto loop2; else if(fi的 heat 从高到低遍历没有完) 选取 fi的 heat 次高的下一个 s 磁盘; if (hs* hav(1+) return; else 选取 es 的第一个段 e; goto loop3; else return ; goto loop1 ; 负载平衡的算法模块在 mgr.c 里实现。 38 3.7 负载的迁移 负载信息处理完毕后, 就知道哪些磁盘要迁移出数据, 哪些磁盘要迁移进去数据, 热磁盘的哪些部分要迁移。mgr 要迁移哪些数据,首先修改该段所在的文件的元数 据,因为迁移过后,客户端打开这个文件时,mgr 不能把返回的地址信息还表示为 原来的内容,而应该指向迁移后的地址。mgr打开队列中 temperature值最高的段的 元数据文件,并设置 moveflag标志为迁移,写入迁移出去数据的磁盘号,迁移进数据 的磁盘号,修改完后,写入元数据文件。 然后 mgr 向 iod发出迁移的请求,请求的对象是迁移出数据的磁盘,并指出哪 些段需要迁移。 需要迁移出去数据的 iod收到 mgr发出的迁移请求后, 就着手迁移工作了。 iod 首先获取 mgr 发送过来的元数据的 inode 号,把它翻译成自己认识的文件名。每个 文件的元数据的 inode 号与文件在 iod上的文件有对应关系。然后打开这个文件。用 stat( )获取文件的大小。然后把该文件所在的 inode 读到缓冲区。建立一个套接字,然 后与要迁移进数据的磁盘建立连接,向这个磁盘发迁移数据的请求。请求中给出要迁 移的数据的大小和迁移文件的 inode。先发送请求,后发送数据。 iod收到 mgr 的迁移数据的请求,经过自己的处理,找到迁移的数据,然后向 最冷的磁盘发出迁移进数据的请求,接着发送数据。冷磁盘收到请求后,解析完毕, 然后先接收热磁盘发过来的数据,写的数据量的大小,接着打开以该迁移文件的元数 据所对应的文件,向该数据文件写入迁移数据。 负载的迁移在 iod.c 里实现。 3.8 数据副本的创建及其一致性的维护 为了完善系统,尝试在系统中做副本。当发现磁盘的热度超过阈值,在该磁盘上 选取收益/代价最高的段试迁移到最冷的磁盘上去, 如果计算出迁移到冷盘上后盘的热 度急剧上升,以至于超过了阈值,把热点迁移到任何地方都会引起新的负载不平衡的 现象产生,这时可以在最冷的磁盘上制作该段的副本,利用对副本的并发读访问来平 衡负载。所以统计时要记录访问的类型和相应的访问的总字节数,如果读的访问总量 大于写的访问总量,则可以用制作副本的方法。因为写不能并行地进行,如果写操作 次数比较多则不能考虑副本。 对热点做副本之后,多个客户端需要对同一热点的不同副本进行并发访问,要保 39 证客户端读取正确的数据,就要维护副本的一致性。只有当热点很大时才做副本,而 且只有很少量的段需要做副本,所以一致性维护开销比较小。 以下为副本一致性维护算法。 while(mgr 收到信息) if(是客户端的 i/o 请求) 检查副本元数据表是否包含该段; if(该段没有副本) 直接访问 i/o 结点; else 检测活动副本元数据队列中是否包含段; if(活动副本元数据队列中不否包含段) 该段插入活动副本元数据队列中; 访问 i/o 结点; else if(本次访问属性和活动副本元数据队列对该段访 均为读) /对该段访问读计数和写计数,即写记数为 0; 该段元数据插入活动副本元数据队列; /读(写)计数增加相应的值; 访问 i/o 结点; else 该段元数据插入等待副本元数据队列; if(接收到 i/o 节点对某段 i/o 结束的通知) 检查活动副本元数据表是否包含该段; if(活动副本元数据表包含该段) 40 从活动副本元数据队列中删除该段元数据;/即读(写)计数减 1 检查等待副本元数据队列是否有要求对同一段的副本访问的请求; if(有要求对同一段的副本访问的请求) if(本次访问属性和活动副本元数据队列对该段访问均为读) 把这些请求的元数据都插入活动副本元数据队列; 从等待副本元数据队列中删除这些请求的元数据; else 选取排在最前面的对于该段的请求,并将该段副本元数据插入活动副 本元数据队列; 从等待副本元数据队列中删除这个请求的元数据; 执行该段的 i/o ; 3.9 小结 本章主要介绍了 pvfs 文件系统负载平衡的整个过程和关键技
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年电工审证测试题及答案
- 2026年钢铁格斗碰撞测试题及答案
- 2026年财务公文筐测试题及答案
- 2026-2032年中国科技中介服务行业市场现状分析及投资前景研判报告
- 2026-2032年中国废金属行业市场发展态势及产业前景研判报告
- 新媒体动态设计中基于五感的交互设计03
- 模板工程质量常见问题防治措施
- 反垄断试题及答案
- 03APP交互页面的设计与制作-2
- 2025年茶叶购销合同书怎么写
- 制氧设备培训课件
- T/CBMCA 008-2019聚氯乙烯(PVC)瓦
- 《慢性阻塞性肺疾病诊疗策略》课件
- 人教版(2024)七年级下册生物期末复习重点知识点提纲
- 2024-2025学年人教版(2024)初中英语七年级下册(全册)知识点归纳
- 2020年WHO骨肿瘤分类
- 妇幼保健院患者投诉处理考核试卷
- 《液位传感器》课件
- 内科学(呼吸-循环-消化)知到智慧树章节测试课后答案2024年秋温州医科大学
- 《思想道德与法治》期末复习主要知识点
- 大部分分校:地域文化形考任务二-国开(CQ)-国开期末复习资料
评论
0/150
提交评论