51Testing软件测试论坛

标题: Cache简绍资料共享 [打印本页]

作者: yurong517    时间: 2010-10-5 09:51
标题: Cache简绍资料共享
继续学习,这段时间学下了cache一些理论,觉得计算机知识实在是博大,希望大家和我一起学习。
作者: yurong517    时间: 2010-10-5 12:43
关于 读流程:以下是根据cache一应用为例
在TGT中层接收到主机的读请求命令后,根据TGT后端的SCSI模块对收到的读命令进行解析产生一个读REQ请求,将产生的读REQ送HMP模块进行处理,HMP模块判断该读REQ是本控制器的还是对端控制器的,如果是对端控制器的REQ请求通过IBS传到对端控制器进行处理。该REQ请求是本端控制器的,先判断是否支持增值业务,若不支持增值业务直接送Cache模块处理,若支持增值业务则送增值模块处理,增值处理完后再送Cache模块处理。Cache模块接收REQ请求的总接口函数为CACHE_ReceiveReq()。
Cache模块通过CACHE_ReceiveReq函数接收到REQ请求,并将REQ请求加入g_pstReqWaitQueue读写全局链表中并触发ReadWrite线程去处理对应的REQ请求。在ReadWrite线程的主循环中处理流程如下:
1.        判断g_pstReqWaitQueue读写链表是否为空,如果读写全局链表是空的,则处理写冲突,写冲突分两种:一、写操作产生的冲突,二、读操作产生的冲突;
2.        如果读写全局链表不为空,则取出REQ节点并根据其操作类型进行分类处理;
3.        REQ操作类型为读完成操作,表示读到的数据已经传给Host,可以释放SGL和REQ资源了;
4.        REQ操作类型为读操作,首先先申请一个空的SGL悬挂在REQ上,并查看内存是否存在要读的数据:
1)        如果存在则认为读命中,并将数据串在SGL上,通知SCSI模块读到数据;同时根据智能预取策略进行预取;
2)        如果读不命中,则判断是否在预读队列s_astLargeReadPending中,若在预读队列中也算读命中;
3)        如果读不命中也不在预读队列中,根据Lun的预读策略(固定预读、倍数预读、智能预读)创建一个新的预读请求,挂载到预读队列s_astLargeReadPending中,并为预读请求的SGL申请4K页面资源,在申请到页面资源后,将预读请求挂载到g_pstReadReqWaitQueue链表上并触发Read线程通知块设备读取数据到预读请求的SGL中;
4)        将预读到的数据写入内存中,同时释放预取请求,预读完成后重新执行悬挂在预读请求上主机请求,若命中则通知SCSI模块读到数据,若不命中则释放SGL资源并通知SCSI读失败。
作者: yurong517    时间: 2010-10-7 16:14
关于写流程
写操作分为回写、透写和镜像写三种类型。回写是将REQ带的数据写入本地内存后就返回写成功;镜像写是将REQ带的数据先写入对端控制器的镜像内存区,再写入本地内存后才返回写成功;透写是将REQ带的数据先写入内存区,再写入磁盘后才返回写成功。不管是回写、透写还是镜像写其REQ都是在SCSI模块产生的,而SCSI模块在产生REQ时,也要同步申请SGL资源,并将要写的数据放入SGL指向的4K页面上。需要注意的写操作的类型不是在SCSI模块产生REQ时指定的,而是Lun的配置属性决定的,因此在改变Lun的配置属性时也会改变写REQ的类型。
回写流程:
在ReadWrite线程中获得REQ请求,根据REQ请求的类型判断是写操作,则调用WC_Write函数进行处理,从REQ请求中获得LunID值,获得Lun的配置属性为回写方式,则调用WC_WriteBack函数进行回写处理,首先为回写分配Chunk和Chunkunit资源:
1.如果要分配的Chunk在进行其它的写操作,则认为写冲突,则将写REQ加如g_astWriteConflictPending全局数组对应的LunID链表上,后续再通过WC_RetryConflictWrite函数对冲突的REQ进行处理;
2.分配到Chunk和Chunkunit资源,将REQ请求中SGL带的数据写入内存中,并释放SGL对应的资源,并通知SCSI写成功,同时触发Destage线程去写脏数据;
3.分配Chunk和Chunkunit资源失败,释放REQ请求中SGL对应的4K页面,并通知SCSI写失败;
目前没有处理从CM_ORG模块分不到Chunk和Chunkunit的错误,一切依赖与CM_ORG的算法来保证满足需求。

透写流程
在WC_Write函数中根据REQ请求中获得LunID值,然后获得Lun的配置属性为透写方式,则调用WC_WriteThroughDirty函数进行透写处理,首先为透写分配Chunk和Chunkunit资源:
1.如果要分配的Chunk在进行其它的写操作,则认为写冲突,则将写REQ加如g_astWriteConflictPending全局数组对应的LunID链表上,后续再通过WC_RetryConflictWrite函数对冲突的REQ进行处理;
2.分配到Chunk和Chunkunit资源,根据分配资源函数的返回类型不同做相应的处理:
1)从透写转回写,将REQ请求SGL带的数据写入内存中,释放SGL对应的资源,并将REQ加入g_stWBForWTReqList链表,同时触发WBForWT线程刷脏数据;只有在WBForWT线程将脏数据写入磁盘后,才会通知SCSI模块写成功;
2)还是透写,将REQ请求SGL带的数据写入内存,并通知块设备将REQ请求带的数据写入磁盘中;只有块设备将数据写入磁盘才通知SCSI模块写成功;
3.分配Chunk和Chunkunit资源失败,释放REQ请求中SGL对应的4K页面,并通知SCSI写失败;
作者: ritazenghehe    时间: 2010-10-14 21:55
谢谢分享
作者: Bapuka    时间: 2010-10-15 10:47
谢谢楼主
作者: 东方一辉    时间: 2010-10-15 11:12
分享就是有益  大家努力学习
作者: 神话东方    时间: 2010-10-15 11:49
很好的东西  这个网站不错
作者: cjp110212    时间: 2010-10-15 12:22
多谢分享!!
作者: peag    时间: 2010-10-17 16:44
thank you for share
作者: crazymartin    时间: 2010-10-18 09:39





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2