00:01
那个。简单的介绍一下那个就是。呃,14年多的一个马龙,以前是做那个网络安全的。那个做了三年。主要的就是做。DCPIP网络协议站B、网卡驱动。在这里面就是有这个。以前画了一些图,这个是少量的,以前画了很多图,呃。这个研究那些内核啊,或者。网卡驱动啊之类的。有一些资料是放在那个上的。然后后面这个11年多,就是主要是。那个虚拟化内核和存储三个方向。目前还在这个研发一线。然后我做一个那个版权声明,我这个工具。
01:02
先先先说一下这个吧,就是。呃,为了不必要的那个麻烦,就是我在会议中尽量不提,不提那个具体的公司名称,防止侵权。啊,那个会议录屏方便,以后非常差。我是在零九年入职这个。SF科技的,在那个公司公司工作13年,去年离职的。这个工具是,呃,在在这个PPT里有介绍啊,它的原创就是一开始的时候写的这个图形不是我是。这个SF5科技的这个前CTO,现在这个。科利为科技的创始人,这个庄勇,呃,以前我跟他同事的时候。我,我坐在他座位的前面,在那个南山科技园。张勇是给东瓜哥这个大话计算机写过序的,就是这个序列这部分。
02:05
就是这个原型,就是这个代码,是他写了一个1000行左右的这个C代码的一个Windows程序就是。这个同事。2015年离职了之后,这个代码就是没人维护了,就是工具已经没人使用。然后我是在2016年的时候开始,就是借鉴于这位前同事的这个。程序的实验原理,因为我对这个东西感兴趣。然后就研究它的代码,读了很多遍那个。逻辑非常复杂的。它的一些核心的代码,虽然这个代码量不多,就是特别复杂后就在它的基础上。写了这个两个工具,这个是配合着使用的。然后。
03:01
先写的是Linux版本的,后来就把我写的Linux版本的那个代码,然后移植成Windows,所以现在就会有三个版本,Linux版本它是支持叉六和二,而Windows版本是一个单独的。我要介绍一下它的这个这个这个历史关系。这个这个工具是2016年开始开发的,就是这个是基于前面的那个雏形开发,但是。是我工作之余啊,或者就是个人兴趣之外开始开发的这个工具,不是那个工作的工作的内容。然后就是改了很多很多版本,你看着他这个版本号就是一直是很小,没有去更改它的,但其实它的这个代码改了几百遍。就是那个不断的优化,因为那个。
04:01
在测试过程中出现各种各样的奇怪的这种数据问题。然后有这些。案例就是你不断的总结,然后就是一直在改进这个工具。啊,我2022年4月从这个SF自己离职的,当时的版本就是呃,V0.09版本,代码是有4000行左右。呃,我不知道现在这个这个会议上是不是否有那个前同事啊,因为我看他扫描进入这个群,我不知道他有没有加入这个会议。他这个代码是在公司的那个存储部门有一个那个仓库的,就是是其他部门的仓库啊,就是这个0.09的版本的代码是上传的话那个仓库。我离开的时候,这个代码是。全部代码是给到公司的。这个工具的每一行代码都是我写的,就是没有别人添加一行代码,全部是我一个人写的。
05:02
然后,但是虽然是我工作之外,呃,也全部是我自己写的。但是毕竟是在这个这个SF科技。工作期间开发的,所以。这个V0.09版本的这个工具的代码,它的版权是属于S性的,这个没有。没有异议啊,这我我也认同,这个虽然是。全部是我写的,但他是工作期间,而且是参考前人,所以这个版权是属于那个SF科技的。我离职后之后啊,用那个就比如年假或者休息的时间这种,然后就是要重新造轮子,又把之前那个工具的。核心代码全部给它重新实现了,就给它换掉了。然后就是在今年四暂的发布的是。LBA工具的V1.0版本就是它的这个代码,扩充了很多功能。
06:04
而且把核心的代码给换掉了,目前最新的版本是4.0版本,就是七月份发布发布的。大代码函数就是已经。8K多了,就是是以前的这个两倍多了,就是它功能会多了很多,而且这个就是核心代码也全部实现了,现在就是。这个V0.9版本的这个代码和我的这个最新的4.0的关,这个代码,它的重合率应该就是不到20%了,所以而且是非核心的代码。所以当前的这个工具的版权属于我本人。这个应该也没有问题。呃,另外讲一点呢,就是那个这个工具在那个SF科技,它是内部使用的。就是没有对外,对外就是发布或者。或者提供给其他友商或者什么的,它就是内部使用的,然我做一个比喻的话,就是它是一个普通的轮胎,装在焊上,可以可以跑市区或跑高速。
07:11
最新的这个V4.0的版本,就是增加了很多功能,所以我就是从就七月份开始。啊,开始对外推广,就是把它这个二进制文件。放到那个get上面,嗯。我打个比喻的话,就是一个防爆轮胎,装在那个仰望U8上,因为它的功能增加了很多。就可以。跑市区、跑高速之外,还可以跑越野。呃,另外一点的话就是。呃,这个工具对个人的话,就个人使用就是有兴趣的就或者嗯,想试用一下的就是。它的这个工具里面的所有功能都是开放的,就是没有做限制,就是任意功能都可以用,就是这个工具所具有的所有功能都都没有做限制,都可以使用。
08:07
而且全部免费。但是只提供。六个自动化测试的ISO。就是这是一个叉八六的这个的话,它就有17个。如果加上M的话,就是我们的信创啊,就是在M的话,它也会有17个Windows,会是15个,它没有下面这两个,因为它这个是测试内存的,在Windows里面搞那个内存盘比较复杂,我没搞了,所以它只有把这两个Windows的不支持这两个,它有15个。总共的ISO有这么多。如果是To B的话,就是。试用期是一年的,就是这个发布的东西能够对外,就是可以一年的免费试用。就是如果试用效果好的话,对公司的研发能够起到降本增效的作用的话。
09:03
如果还希望继续使用的话,就是要商业使用,就要授权啊,而而且我会提供全面技术支持。提供的这个自动化系统就会是17乘以二加S5的这个15个是Windows的,这个是按按和超六的。会有这么多这个这么画的。嗯,这个。测试的工具。这个就是嗯,一些题外话,那我们总共只有一小时,那我们就加紧。进入正题。要讲原理。那个工具,它的核心思想就是构造那个数据。数据结构,它其实就是这个强双向链表数组和队列的混合体,把这个数构造了这个这个。这个数据写到这个磁盘里去,我随时可以对这个数据进行校验。
10:02
能发现他数据有没有损坏,有没有丢失。那从一开始的话就是来,就是一简单的概念就是磁盘,这个是个磁盘,然后触就是固定大小的,就是一处带,呃包括了多个扇区,我现在就是把它一个磁盘分成一个数组一样的,就是按处分就分了这么多处。一个处里面就有多个扇区。嗯。然后。就是我写数据的时候就是按处进行。构造,就刚才说的那个强双线链表那个队列数据构造了,这个数据写到磁盘里之后,我再进行校验。他有没有出错,他的这个等会那个具体的怎么构造的话,就在后面讲。然后就是如果我这个磁盘。或者文件啊,那这个合同文件也是支持的,等会儿后面进行演示。
11:04
如果我是一个线程写的话,就不不需要进行复制,不需要这个变。如果我是十个线程同时在写的话,因为他们在这个这个磁盘里哪些地方写了,哪些地方没有写,你不知道的话,就没办法进行分配这个这个数据库,所以用了一个全局的b map来记录,然后十个线程进行这个。这个临界资源竞争,就是在这里找没有分配的数,找到了之后,然后就这个线程这个数据。数据处分给了这个线程,这个线程的把它这个数据写到对应的地方,就是这个处是记录在某个线程上面写的,就是一个处只属于一个线程。不会,他我们十个线程之间写数据,不会出现那个冲突,不会就是相互覆盖这种。
12:00
然后我们来讲一下它怎么构造这个数据,就是这个是。因为你可以刚才啊,就可以看到这个这个这个数据布局,它这个就是这这是512个之间,这个就是一个扇区,就是其实就是这一部分的数据,就是如果多个数据的话,就假设1024扇区组成一个处,这一处一处的就组成一个磁盘。他建立这个。这个。扇区里面的数据就是假设这是一个处啊,就是一个处。我先建立第一个扇区数据建立好了之后,然后把它复制复制复制复制这么多扇区,只有这一个字节的数据是不一样的,因为这个字节是表示序号,就是这个处里面总共是1024扇区,我这个就是第零,第零个那个序号的上去,第一,第二,第二,一直到1023。
13:03
这个其他的数据就是一样的,我进行校验的时候,就把这一部分的就是在处内。一个处之内的数据进行校验的时候,我只要妹妹compare就就可以了,就把这个数据读上来,我妹妹compare就是这个第一上区的跟定零的,第二上去的跟定零的,就这样比较就发,看看它这个数据有没有发生。嗯,变化就是有不同的,不同的就表示这个数据出错了,有有地方出错了,而这里面最后一个直接我就校验它的序号,就是我我读一个数出来,这个第一个上去的这个序号是不是零,第二个上去的是不是就是这样检检测就可以把这一处之内的数据进行校验。而还有处与处之间的数据进行校验。就是这种,就我现在写数据就是假设是零化线层,他写了这一处,然后再写了这一处,然后写了一次,这个是随机的啊,写写写写了就构造的一条链,就我这个只是形象比较好,嗯,那个说明。
14:08
它不是这样的双控链啊,它是强控控电,等会我讲一下这个。最重要的这个结构就是强双向链。有十个线程写数据就相当于构造十条链条,这个链条在这里,然后我去检测的时候,它数据有没有发生错误或发生。丢失,我就是在这个链条的第一个,就是这是第零个线程写的,这它的起始位置,这个是固定的十个线程。这个是第一个线程写的这个固定的,然后后面这个十个十个处之外的这些处都是随机分配的,就是通过加锁啊,找刚才那个全局对map,就是这个map,找到它未分配的地方,就分配给一个线程,就是这个加锁,就他们相互竞争的就是在这里,然后写数据之后。
15:00
在这里是随机的,就是每一次写都不一样,我第一次写这个磁盘的数据。写的时候构造的这个链条是这样一条链条,我我这个数据给它清掉,我在第二次写它还是构造一个链条,就是构造十个线程的话,就是构造十条链条。但是这次的链条跟上一次的链条就不一样的,因为它每次分配这个数据库的时候都是随机的,但是它这个随机的数据都是有先后有列双强冲线列表练起来的。是一整条的链条。这个这个能听懂吗。哎,你好,我我我听得见吗?啊可以听到,呃,我这么理解,就是说有十个线程,每个先线程就是负责一个处对吧,这个处写完之后他才可以写下,写下一处它是同步direct写等后面讲到的,我等会会演示的。
16:02
对,它是我这个这个线程,假设这个线程啊,写链条的时候,就这第一个链条,链条头我写上了,我写完了之后,我在随机在这里面分了一一个一个空闲的处啊,假设是分到这个,然后我就把这一个的数据写了,等会为啥它怎么构成链条的,我等会要详细讲的那个是最重要,最重要的那会覆盖写吗?比如说一完之后会写11,但我一又会覆盖写吗?不是这这这里面的每一处都只会写一次的。哦,明白了,因为他用bit map记录了,我现在这个被分配出去了之后,就是有就假设这个这个bit map分给第五个线程,五个线程在这里写一次,其他线程不会在这里写,写了一次之后,他这已经做了记录了,后面就不会再写了,他只是等这整个磁盘写完了之后,我进行校验,校验这个数据没有问题了,那才又从开始覆盖写。
17:00
如果他校验出错了,这个这个程序就会。会那个。停在这里的,我讲我就先给你看一下。我先不看太多花时间,就是他这样去构造,每一次构造的都是随机链条,就是就只有十机十条链条,就是,然后我们构造好的那个链条就是都是同步的,就每一个L都是同步,L写下去,然后都是direct l就也可以支持配看器,但是我们测试的时候一般都是用DVL测,然后把这个数据全部写完了,这个磁盘写完了,我就会从头在这个链条图,每一个线程从这个链条开头开始来进行校验这个数据,这个链条有没有断,然后。一个就是这个链条有没有断,第二个就是这个链条每一个一个节点之间,它的数据就是这个每个扇区之间数据有没有发生变化,如果发生变化,它就会爆出来,可以看到。
18:07
哦哦,这个是。是这这种就是我去校验数据,发现这里的数据出错了,然后那前和后的数据没有错,然后他就会报你这个BUG00几,然后这这这种BUG00几其实就表示一种错误类型。然后就告诉你这这里有有多少数据,他是告诉你在。在这个位置开始的。1024扇区这个就是总数,这是偏移,就是这是这个是这1024扇区的第零个扇区,这个后面第一第二第二一直第1023,他告诉你这个就是第946个扇区,就是这102444扇区的第900。46扇区。的数据开始出错,连续出错47个三区告诉你。
19:01
这个是测试文件,不是设置盘,我可以这个工具是可以支持磁盘,我盘所有的盘都行。就是路NBD,嗯,那些DM杠零就这种的C的,只要是快设备全部都支持。就是普通文件,我们这种文件系统的文件支持。那后续就是在这个后面轮换演示的时候。就是的话就会演示这。我们现在在第三部分讲啊,然后这个在这里就是演示这个O那个中文化数据。然后我们呢。讲构造这个。构造这个双向链条。是怎么构造的?就是前面这个,呃,应该大家了解了吧,就是我写数据其实就是。构造这个长双向链表。然后这个就每一处数据,它有向前的,有向后的。
20:03
在这里呢,就是。我我我这个实验是哪一扇区来讲,然后就像这样的,就我只要构造了一个处里面第一个扇区构造完了,我这个处的数据我就全部知道了是什么样的,就是把它复制复制复制复制N份,然后只要把最后一个一个字段,这个字段是两个字节啊,就把这两个字节的数据改成它的序号,其他的都一样。这个是高级功能,这个为啥是零,这个后面讲这个高级功能,以前是没有这个功能,这个是2021年开发的。这个功能很有用。我来讲就构造这个这个强双线电表是怎么构造的,就是在前面的这个这个这个这个磁盘被被画成一个数组,这这个数组每一个一个节点的话,就是一处就就是一个数组了,然后这个变map是。
21:01
全部零的嘛,因为还没有使用,然后这前十个十个处是固定的,我。我现在是讲十个线程啊,就是其实是一个线程也支持,就是我就我只用一个线程写,用两个线程写也可以,用一到十个线程也写也可以,还有一个更高级的功能叫随机线程,它的线程是一直在变化的,就是它的工作线程,一会五个线程在工作,一会儿两个线程在工作,那个高级功能我们可能就没有时间再来讲了。就是大家可以试用,到时我讲的时候就是以最简单的或者最比较固定的一个方式讲,就是十个线程,我们就就就这样简的讲的就简单一些,你其实你用一个线程讲,其实更简单,但是他没有那种就是加锁这个病动曼谷就是个临界资源竞争的这种分配的这种,就就就一个线程,就没有这个东西了,就。就就这个内容就缺失了,所以我就以十个线程都固定的来讲,就一开始十个线程的这十个病脉被置上了,就是分出去了,因为它是固定的,分在每一个线程上,就是零,我是从零开始的啊,零到九号线程就是对应的这个每一个处。
22:16
然后我这个线程要构造它的下一个L,就是这个这个数据里面这些是嗯,叫flag,就是就比如编码呀,或者或者随机数呀。或者魔术啊这些东西或者时间呢,这个是这个总数,就是这个number,就是表示我这一个处里面包括了多少个省区,这一个index就表示它的这个偏移,就是第几个扇区。就是这距零第一第二这是这里固定值是10244,或者202048,这个就是你到时候通过参数控制的,你你输入一个参数的时候。是吧,就是就是这个杠杠这个S,你输入杠1024,这个S就是表示一处数据包括了1024上区,你把它换成别的,也可以换成512,或者最大是支持。
23:14
2048。啊,就是。这个值的这个默认值是八,就是它已经这个工具你帮你一初始化的时候,就是初始八,然后你可以更改,就是最大,但是只支持2048,这个可以是有一个宏控制的,你如果要更大的话也可以改,但是这个没必要了,因我们的磁盘L1兆一个L就已经很大了。然后就是它的这个强冲线电表,就是它有十个指针,就是这里从零到九,它是向前指的,这个就是有100个指针。是第零个指针指向自己,就是比如这是我第零个那个处,它的那个IBA的意思就是逻辑快递值,其实就是扇区号啊,就如果你要算成它的真实偏移的话,就是这个扇区号乘以512就是乘以一个扇区的字节数,它就是具体的这个这个偏在这个磁盘或者这个文件的具体偏移了,我用的是用ABAA话就是用逻辑快递值,其实用的扇区号。
24:24
就是这个零的这个位置是指向他自己的。然后这个12341直到99是往后指的就是。指向它下一个L。就是这指向下一个L,这指向下下一个L,这个就是指向就是第它后面第三个L,第四个D一直指向99个L,就我要创建我要写一个L。就是我这里要写一个IO处,假设这个D零号线程,就是DD零号线程,我要写这个IO的时候,我要构构造的这个数据,其实是把后面的99个L的都已经决定了,但但是。
25:07
决定是他在这个bit map里面,就是未分配的地方去分配99个随机的分配,找那个没有分配的地方。它是随机的,但是它是确定的,我只要把这个L写下去了之后,这99个在这里面随机已经分配好了,我把这个L写下去了之后。写下去了之后,其实是我下一个L,就是把这个这个它指向自己的这个L推出去了,就是那个队列推出去了,我在后面的把这个一到99往前挪一个位置,就把一到99挪到零到98,这个位置就是向上挪,就其实就是就是这个就是。这个一到99,我把它。这个白线你看到没有。这个这个假设这是对对DM个L,这个就是DML,这是一个扇区啊,你假设把这个有多个扇区,我我只画一个扇区出来。
26:09
你如果有1024个三区,这里其实是包括了10243菌,然后这个index的是01234~1111023,然后其他的数据都是一样的,那我下一个L的数据是什么样的呢?它这个这个很多的这个flag都是一样的。它这个粉红色的部分,就是这个红色的部分,这个L写完了之后,它这个这个地址它是四字节的,它就推出去了,就出对了,出对了这个一到99他就往前挪,挪到。这个这个是在八核里面啊,往往前挪一个这个位置,然后在这里再插一个99进来,这个就插的这个99,其实是是在这个bit map里面,在在这个你去找未分配的,随机找一个未分配的。
27:00
分分了之后插进来,那我第二个L就已经构造好了,是不是就构造好了一扇区,然后也是复制复制复制复制很多份,就如果是1024的话,我就复制1023份,然后组成一个数据错,然后把这个处写到假设这个是在。就是这个写的一,然后我第二个是写到23了,分到23,我这个这个位置就是23。就是刚才这个粉红色的这个。其实在第一个L的这个就是LBA1里面这个,这里面这个值截止是23,然后在这个新数据里面,它把它往前推了,其实是在这个2BA0里面是23。然后这个第二个L就已经写下去了,写下去了之后又是一样的操作,就是这个假设是第二个,我第二个这个。这个2BA0,它其实指向了自己的偏移,就是23,我把这个已经写完了,又推出去,就是出对,出对了之后。
28:06
就又把这个一到99往前推一个到零到98,然后我再去找一个未分配的空间,就是又在这个这这个bit map的这里。找这个没有没有被置一的位置,就是这个未分配的位置,再找一个又进对,那就是下一个L了,那就是第三个L了,假设第三个L就是。到23了之后。嗯。啊,这里面没有数字,假设这里是100,这这里就是100 100就写下去了,那就每次就是。这就形成了一张链条,这是向后的链条是吧,就是我第一个写的时候,我后面的99个已经已经知道了,我就是一个写完了之后,我就往前推一个那个第101个的那个位置,就是其实用这里可能更更容易,我这是第第一个L,这是第二个L,第三个第四个第五个L,我已经把这个就是这个数据,其实就是刚才那个粉红色的这部分啊。
29:11
这个就是100,就是我写第一个L的时候,你看这个就是这个right,就是第一轮写就是第一个L,第一个L就是我已经把后面的100,就是除了第一个L是自己之外,这个第二到100个L其实都已经决定了,这里都是随机数。找那个未分配的地方,分配了的199个这个。数据库的那个偏移地址已经写到这里,就把这个L写下去了,写下去了之后,我写第二个L的时候,就把这个推出去,就是出对,然后就把这个第二个,这个这个第二个往前挪,就挪成这样了。你看这个数据,就是你看粉这个粉色的就到这里,然后这个第100个位置就到到这边的这个。这个这个这个位置,这个99的位置,我又加一个新的L出来,这个就第101个就是一直是做做个重复的操作,就是这样挪挪挪挪挪,就是这个这个后向列表就练起来了,就就这就就是一个后向列表,这个IE指向。
30:17
第二个L这个是指向第三个L这个第四个L,第五个一直指向第第那个就是100个L,就是第100,这这个这就是向后的,就我一个节点指向后面的一。99个L,另另外一个是指向自己,这个是后项的,这个链表就是构建的好了嘛,是吧,还有前一项的。前向的就是我第一个L写完了之后,我写第二个L的时候,第二的这个P的这个地方就指向前面这个L。然后我写第三个L的时候,这个第一个指向这个PI是指向它,然后这个pre pre1就是指向它,那如果我写了十个L的时候,就是这个PRE9又指向这个就是零到九,总共十个,就是指向前面十,十个IO。
31:13
它就会构成一张很大的一个这个强双向链表,就是我把这个这个数据这样一直这样写下去,就是把这个这个这个出数据一个一直这刚才是讲一个线程的写,如果十个线程就十条链,就是就是这里它就会形成十条链,那我这个数据写好了,就就在这放在这里了,我随时都可以进行校验,你比如就是我现在这里的这个,这里面的这个。这这里的这个文件就是是是六暂七暂7月12号写的,我现在还得可以去检查了啊,我现在去检查他的。这个图的这个工具是只读的,就是它不会写数据,它是一直是逐步。读的,我就告诉他说我要检检查零号线程写的数据。
32:06
就是这个数据就这里面已经写写了,写了数据就是7月12号已经写了数据一直就留在这里了。那我这个工具当工具是就专门用来校验的,我就现在告诉他这个杠C就是彩色,就表示是彩色的意思显示,你看它是有红和黄啊绿啊,这。然后杠低就是表示direct,我们不用配,你不杠低的话就是配。然后这个T。加数字就是告诉你,你要校验第几号线程,写的数据就是这个D0到九。我现在说要检测第零号数据写的所有数据,嗯,看看有没有出错,就是这样。这里就是输出这个磁盘的信息或者文件的信息,然后他就这验交完了它,它就是就走刚才那个链条,从这个这个位置往找下一个L,再找下一个。
33:03
第一个就是这个节点与节点之间,就是处与处之间校验就叫叫触间校验,这个触间校验的数据主要是。校验刚才形成的这个链条,我我向前向后,它这个这个链条的关系有没有破破坏,就是我这个是指向。我这个一指向它的下一个节点,这个二指向了下下一个节点,这这个就是它的这个这个这个链条关系有没有被打打破,就是主要校验。对。这个别list的这个就是个。你你说它是数组也行,你说它是链表也行,你说它是队列也行,这个就这它是一个混合体,所以。这个数据结构很复杂,这个就是向前的,这个也是数组链那个链表那个队列啊。他现在我刚才敲的那个命令,就让他去校验这条链条,然后他就去校验出来了,它就会提示你。
34:04
这个链条的这个是正确的数据,下一个数据就出错了,这个又是一个正确的,这个表示这个链条里面中间的某一某一环就是。就是我我从这链条从前从前往后的一直加建,加建加在中间的这个链条这个地方发现它出问题啊,数据就构成构不成一条链条了。断了。然后就是它这个这个是第零个,嗯,这个就是这个是。第一轮写的数据,他写的数据的这个时间就是2023年7月,呃,12号下午03:37过四秒写的他的这个L,就是刚才我们写链条写第一个,第二个写它是第几个L,他告诉你这个是第614第14个L。这个这个L里面,它现在这个校验其实不是这个链条与链条之间出问题,它是。
35:05
他在校验料链条,链条这个之间,处与处之间的时候,发现这个一个处之内的数据发生变化,就是这种是这就是。它链条与链条之间没有出那个那个关系还是正常的,但是如果我检查一个链条之内的数据。就是刚才那一个链条节点之内的数据,就是我零号扇区,一号扇区,二号扇区,他发现的是第946个扇区,这个扇区假设它跟前面这个顺序的数据出不一样了,它这个其实就告诉你。告诉你这个这个这个就是不一致,这个数据就不完整。这里面告诉你的是,在他本来是有。1024扇区的这个是它的地零扇区,它作为标准来,后面的扇区都来跟它进行对比对比对比就一号一号扇区跟零号山区对比,二号上区跟那零号都对比,101直到1023号上区跟零号对比。
36:10
就是。刚才说的这个它的数据这一部分的是全相同的,只有它后面的序号不相同。他现在就这个校验出问题了,他就告诉你说第946个扇区的数据,连续47个扇区数据不对。他就告诉你,你看这个数据它是在这一闪一闪的,他本来这里的数据是全零的,就是前后的数据都是正确的,只是中间的这个数据,我这个是故意制造的啊,这个这个数据是我故意制造出来的。这个通过那个命令,就是有这个命令故意制造出来的。就是用这个就是输入这个错误,它输出很多种错误,这个就是为了方便演示,以前的那个版本是没有这个功能的。他就会这样提醒你,这个这里的数据出错了,而且是连续47上去出错。
37:04
这个是告诉你的偏移,它是这个偏移是在这个的基础上啊,这个是。这个。就是这就是这里面一个处就包括了1024扇区,然后它是告诉你最开始的这个位置。最最开始的位置是这个D方,它的实际偏移,你把这个16进制的数乘以512,就是把它换成这个字节的偏移,这个是扇区啊,区号,这个iba的的的的意思就是log block address就是逻辑快递,它是你区号技数的,它不是直接的,你乘以512,它是具体的真实的偏移。他就是说在这个位置开始的一一个处数据出错了,而且在这个偏移扇区偏移偏移,然后连续47个扇区出错了。告诉你是这样。
38:01
然后这个现在。这个就是核心的部分,呃,不知道大家有没有听明白,就主要就是构,构造这个链条,就我十个线程的话,就是构造十条链条。这个链条的话,嗯,不是,就我们普通的双向链表,就一个向前一个,它是99个向后一个指向自己,还有十个指向前面,就是一个这样复杂的一个链,一个链条,我我数据写完它就是。把整个磁盘写完,它就是十条这种链条了。就是这样的,这个这这个只是形象啊。真实的不是这样的,就是这样十条链条,然后这个数据随时放在这里,你关机,你开机,你重启啥时候,嗯,就是说你断网,它的数据都是写在这里,你什么时候去校验都行。的数据,就是我们等会用那个ISO这个进行演示的,我说好就是我跑到跑到我估计给它关电。
39:02
我再重启的时候,这个工具一开始的时候,它是先校验数据的,发现数据没有问题了,它才开始进行测试,就是写数据,就构造这个链条,如果它一启动,他发现这个数据是这个IB工具写的这个数据它校验出了问题。他就停在那里,他就不会再写了,他一开始的时候是只读的这个,如果已这个磁盘或者文件已经有数据了,他一开始是只读这些数据来进行一次校验,如果发现这个数据没有问题,那他才就开始就从头覆盖写了,写写写写写写,他写完一轮了之后,他会进行。整个一轮一一那个就是全盘的数据,整盘的数据进行校验。就。校验完又没有问题,又重新覆盖起就是。就是这个是一个。
40:03
就是它是一个循环的过程,就是一直不停的在做这个操作。就是这个这个是第一次写,写了之后,嗯,然后校验完了,校验完了没有问题,这个就上面就是校验没有完了之后,他就第样门水,如果它这个这个上面再进行校验的时候出问题了,它就会停在这里程序,这个程序整个冻结对吧,就是进入一个。那个利普循环斯利普循环的一个过程了,他不会再有IO提交下来了,他就一直停着,你就是说等着你去排查问题了。但是如果这一轮。对啊,假设是定义M能,他对M能。都没有校验出问题,那它就是执行M加一轮的测试了,又是从头个排,就是前面那个又去构,构造那个链条,那个墙上线链表,然后构造构造一直把这个盘写完,写完了之后又开始校验,就是一直来回来回来回做这个操作。
41:11
等会我讲这个操作怎么在那个应用场景,就是在存储OS的OS指那个。呃,内核存储协议站,文件系统啊之类的,还有那个计算,还有那个备份容灾,在这些场景里面怎么去应用。它的主主体思想是这样的,就是刚才讲的这个核心就是构造数据,写到磁盘,然后这个磁盘是一个。就是。嗯。就是嗯,非常强的那个双向链表的这个这种数据,就是你只要错一个字节,它都它都能够检测出来,就是嗯,不管是有断电的情况还是。鸡蛋里有一个裂缝,它它只要戳一个字节都会都会被检测出来,这个上面这这个前面就有例子,这个这个是就错了,两个字节的就是这里,本来这个是零零,这个是八,这个应该是八这。
42:10
然后这里是12,这里12这个地方,这个这个就错了,两个之间。的数据。然后前面还有一个,嗯,这个数据。这是数据错位了一个字节,它这个数据本来应该是跟这个数据是一样的。就是跟这个数据是一样的意思,就是我们刚才那个。进行上去复制,复制复制它,它应该是复制成一样的这种数据的。但是他这个数据出错位了。这里的数据错来了,你看它这个这个RC在最前面,这个RC他在前面多了零零,它多了一个字节,这个数据这种奇怪的形象,然后只是今年引导。然后这个工具。这里也有这个,这个是2016~20193年时间测出来的这个问题有400多个,嗯。
43:01
就是一直到现在的话,我见到过的这数据错误啊,丢失啊,这种成千成千个就肯定上千个肯定是有的,所以这个这个工具就是。其实不是说你算法一开始开发有多多么完善,或者你的校验,或者那个算法,或者是校验的方法怎么先进,它不是的,主要其实是有这些错误的案例,一直就是出过出一个奇怪的问题,然后就是。对这个问题进行总结,然后这个工具的算法进行调整,就是一直都是这样的,通过这个案例来来这个优化,看你那个算法,就是其实我告诉你这个算法,你。就就是不一定能够,嗯,比较简单的写出这样的工具出来,就是,呃,我以前的同事就是有他现在不是刚才说的那个V0.09的那个代码吗,就是你看的那个代码。
44:00
都都不一定能够想象到,就是他的那个。出错的场景,你你你没有遇到过这个出错场景,你看那个代码可能不一定能够理解,这为啥要这样写,就主要就是这样,就是他是有这些案例,不断的有这个经验了之后,不断的去完善他的那个算法,然后才就是经过这这么多年,他就不断的完善,不断的完善就是它的功能所以就越来越强大,他测这个问题就就越越越来。测这些数据丢失啊,损坏的问题,就越来越高效,就是检测的那个效率越高,就是检测的那个那个越来越微小,以前你错一个字也可能漏掉了,就是没检测出来,现在可能就不会出现这种问题了。就是你只要出一个字节,它都能检测出来。啊,这个我刚才是讲的这个全盘的校验,就是构造全盘的数据十条链条,然后对这个十条链条就是全盘的校验,这检测那个是全局的。
45:06
全盘的这个叫整体校验,那我们还有这个,就当时这样,它写出来的这个链条就是这样的,一一直这样下去,就形成了上面这种随机的这种链条,每次运行都不一样,它链条每次都不一样,但是每一次都是这样的十条链条,那数据在这里,你你只要这个向后的这个箭头断掉了,那我就可以知道你这个链断了,如果就是这个。错里面的,呃,1024扇区或者2048扇区,只要其中的一个扇区的数据出错了,我也可以校验出来,因为我在跟他前后的扇区就会进行对比的,你的数据出现了不一致,两个扇区或三个扇区之间那数据不一致了,那我就知道你这个是叫错内。就是它的数据是有触间校验,触间校验就是这个链条与链条之间,就这样这样的节点之间,主要是看它的这个向前向后的这个这个指针的这个关系,如果我的是出内校验的话,就指我在这一个处之内,就多个扇区之内的数据是否出现了一个位置。
46:11
然后这个线程数据的话,就是一个线程,就是一整条链条,触间可以是它的其中一部分,我触间校验是这个线程数据校验的一部分,就是我假设写一个现成的数据,写满它有1万个处,假设它有1万个处。那我进行线程校验的话,它就是校验这1万个处的这个这个链表啊,从头一直校验到到尾,这是线程校验处间校验就是。我我选择其中,我指定一个位置,我假设只校验它100处,这总共有1万处,我只校验它其中的一百一一一百处,那这个就叫验,这个验也可以是线程验,那如果我从零到末尾,那它就等于这个线程校验。触内校验,就是我在进行触间校验的过程中,还要进行这个触内校验,就是我这个链条,链条我的这个关系我要校验,然后链条内每一个节点我上区,上区之间的数据我也要检验,这样整个校验出来了,那它就是。
47:19
数据不会不会漏了,就是你只要哪里出了一点错,他的数据。错的位置我都给你报出来,就是告,报出来的就是LBA,就是告,告诉你是哪一个扇区出错了,而且可以告诉你那个在在哪个。偏移,我等话演示的时候用另外的这是这是注入的一个扇区,整个一个扇区的数据去做,我的话可以给注只注入两个字节或者四个字节出做,然后他会就是。在就假设这个字节,这这四个字节出错了,它在进行显示的时候,就会这四个字节在一闪一闪,其他的数据都是不动的,就是这种黑白的,到时候我等会给你演示一下。
48:05
它的错误类型有很多种,就是这种注入的,这这种可以注入很多种类型,我一般演示的时候就用这种,或者用这种或用这种,嗯,其他的这种也可以演示。那个那个那个就是我们下后面的那个错误类型里面就是这些就是用这个刚才那个构造出来的啊,我我我做一个举个例子吧,嗯,这里就刚好有。找一个。这个是注入的啊。就是租上去的。Flag。
49:05
啊对,这种这种就是我只是错了几个字节在这里看,本来他这个数据应该是全零的,我就故意给他注入四个字节在这里,非全年的数据,他就这这里就是注入一个list,我把那个个东西给它改了,故意给他弄错了。这个等化演可以演示的,这个也是出一个字节就错了,它本来的这个就是处与处之间,这是处之间的校验,这个字82 83,这是八写的第82个啊,这个83个L他们。其实的数据应该就是一个错位的,就是就这个第二个L,就是是他的第一个L,就刚才我们那个出队的那个过程,就是那99个,那刚好就在这里出一个跟本来是应该的数据,是这样的数据,他现在变成这样的数据了,这个就是只只出出错了四个字节,故意出错了四个字节,就把它的刚才那个向后的那个链然断。
50:05
有个地方有一条向后指向的指针给他,给他改了,他就检测出来就是这里,它就会告诉你是BUG003,然后告诉你是哪里的数据出错,然后一般出错的数据给你显示红色。这里就是一个扇区丢失了,这他这是第五轮写的L,这是286个L,这里应该写了是一个第一个第五轮的L287,然后这里应该是嗯,第五轮288,它就是这个中间的这个L,就是那个链条。本来有几几几千个这个链的节点,然后他的第287个这个链就断掉了。就是这就告诉你,你看它的这个IO的时间都不一样,他这个11:20,这个11:20,这中间是一个旧数据,是第四个人写的旧数据。
51:01
他就会告诉你这个这个数据也丢失。就是带上。啊,我们那个继续回到它的这个原理讲。那刚才只是最讲最基本的,就写全盘构造全链,然后然后每一条链进行检检测,这是全盘的检测,还有另外的检测,这这个叫。叫批量的检测,其实是我在写这个数据的构造这个链条的时候,就这就是构造链条啊,就这里面的都是随机的,这都是一个一个的处。写了,写了这过程中,假设我第一次写了50个50个IO,那我在是一批写了一批IO,然后我再写下一批L之前,我就从把这一批的L校验一次,然后然后就写下一批L,我再写这一批L,写完了我再写下一批L的时候,那我不就把上一篇的lo校验,这个叫批量校验。
52:00
有了这个功能的话,我的这个数据在写入。IO附近这个数据出错了,那就很快就会检测出来,因为我这假设我这次写的是50个IO,这里下假设就写十个L,在下一轮它是写五个L,它这个一直在这个这个这个这个批量的这个L,它它是随机的一直在变量变。就是一批批的L写的时候,我再写下一批L的时候,就把上一批L的进行一次校验。看看数据有没有出错,那如果我刚好把这一批L写了,在准备写这一批L的时候,假设这个L的数据出错了,那他就进行批量校验的时候,马上很快的时间他就会发现这个数据出错了,就是校验链条还是那才一样的校验链条和就是这个链条里面每个节点的这个上去。只要数据发现出错了,那他很快就是立即就会发现,就是他在数据出错和发现之间,它的这个时间很短很短,就是也许就是几十秒钟就会发现,所以它这个校验。
53:12
发现问题的很高效,你的数据一出错误,我马上就在很短的时间,假设一分钟之内我就发现了你这个这个数据出错了,那就是为了方便查问题,不管我是以这个时间去查这个这个存储的日志,还是去查什么东西,就是我我出问题的这个。这个问题现场你我发现的那个时间就很短,然后比如日志不会冲掉啊什么之类的,就非常及时,你就很非常方便去排查问题。这个就是批量的校验,就我写一部分数据和校验,我再写一批部分数据校验,这个一轮写完了,我这一轮也校验完了,这是一轮,然后上面那个是一轮整个写完了,我这个时候就是整轮的,他是从头到尾一直在读,一直叫校验,这个就是整盘校验。
54:06
这是两种检验方式了,还有第三种方方式,就是我一零号线程写的数据和一号线程写的数据,它是不会重叠的,因为他们各自有一个全局的bit map。来来进行分配数据的,然后每一个线程它自己有一个bit map的这个数据,就是他写的这个数据,我这个我零号线程写的数据,我写了这个数据,我记这个变map,我写了这个数据,它对应的变M对吧,我就把这个线程写的数据,它哪些位置写了,我用一个编map记录下来了。那我就有一个随机校验数据。随机校验的数据就是我去找这些这个线程,就我零号线程去找我的零号线程已经写了一些数据,我把它已经写了一个数据在。读上来进行校验,这个随机校验。他这个IO和我校验的时间可能相差很远的时间了,这个就是,呃,这个就是它的效率就会比刚才那个效率低,但是。
55:10
如果这个有一个地方叫这个L写下去了,他这个数据隔了很久。才出问题,那就有可能被这种方式给校验出来,但是这种校验的这个。这个频就是它的那个就是概率,能够校验成功的那种概率就比较低,因为我每次只选择一部分的L进行校验,而且是在这整个线程的所有编派之间随机选的,所以它的命中率没有那么高。但是它是可以校验隔了一段时间之后出错的,不像那个刚才那就是在实这个L时间附近出错的L。然后由这三种L方式。整个校验我磁盘其实只写满一一遍,其实我是校验了2.5倍的数据,所以你哪怕只是错误一个字节。这三种方式,它随。
56:11
总有一种方式会把这个I校验出来,特别是这种你我全局校验,我肯定会发现你的错误的,这个的话是主要是校验的,是在我IO写下去附近。时间出现的这个错误,我在附近能够进行校验,而且它的效率很高。这种的话就是在我写了一段时间之内。数据出错,就假设我这个写了一段,十分钟之后,这个数据出错了。那它有可能被校验到,但是它这个是有一定的概率的,就是不一定能够真每次的出错的那个IO能够校验出来。有这三种方式的校验方式的话,你这个数据,数据不管哪里错都要校验出来,然后我现在这个。
57:03
放时间太久了,我就现在演示一下吧,这个就就不再详细讲了,这个这些很多都是高级功能,我讲一下这个。这个应用场景。这个就简单讲一下啊,我存储的话,假设我是一个存储。我我我就是对对这个存储,把它映射到虚拟机,我可以在主机上测的啊,用虚拟机就是因为有ISO,它可以完全自动化的话,就非常方便。我用一个O把这个S杠给拓展给虚拟机了,我就用这个工具进行校校验,一直写这个写和校验这个S杠,这个快存储。然后我对这个S这个网络进行注入故障,就是我们弄成它的网络这个状况不好的这种方式,我一会儿给它断掉,一会给它连上,然后我就在测,我去测它的这个数据,我写下去,然后去校验它这个数据有没有丢失,它在经过网络传输了之后,这个数据有没有传到这个。
58:05
这个S杠的target端,这个数据有没有出错,有没有丢失,都可以进行校验出来了,这是一个啊。嗯,这些快存储啊,这个这个内核存储协议这样都可以,那如果我用OS的话,我开发了一个文件系统,假设是一个分布式文件系统,这个就是多个主机节点都冒了这个分布式文件系统,那我在这个分布式文件系统里面,我。多个节点同时对这个分布式文件系统进行读写,我每个一个节点,就是我这个主机一我创建一个文件,我进行写写写写一段时间的时候把这个文件给删掉,如果校验没有出错,然后我主机按也在这个目录下也创建一个文件,也写写写,那我拨个主机对这个文件分布式文件系统里面的文件再进行创建,写数据校验,然后再删除。那我就可以把那个文件系统的所有的那个就是它的IO流那个流程,那个就是那个路径都走一遍,去校验他这个文件系统的这个IO的这个这个这个流程这这这这这存不存在逻辑关逻辑错误啊,或者存在不存在出现死锁啊,或者出会不会出现。
59:21
数据丢失啊,损坏啊,这些文的问题,所以这个工具就可以测这个OS啊,文件系统啊,就OS内核存储站啊,什么这个shift啊,Class f啊啊这些都可以测,就单独的文件,单独的这个快设备都可以测,然后这个是存储和S,然后我讲一下这个计算。把这个存储这些都支持啊。我讲一下计算,那么计算里面我虚拟机热迁移,我怎么保证。我虚拟机的内存迁移到这个目的端的时候,内存没有出错呢,或者有没有丢失呢?那我其实就是。
60:00
挂一个so到这里,我把那个free内存,就是这个虚拟机里面的内存。挂一个temper FS temper f,我创一个文件,我用这个工具对这个temper f这个文件写数据也一样的是写刚才那个链条的数据,这个数据迁移到目的端了之后。就迁移的目的端这个工具还在对这个目地端的这个这个内存的这个文件进行校验,如果他迁移的时候这个数内存数据发生了变化,对,就刚才前面构造的这个链条就出数据出错了,那它马上就校验出来了,如果没出错,那我就可以证明你这个热线仪这个数据的这个内存数据没有出错,那存储也是一样的啊,我这进行磁磁盘。数据迁移,我从这个磁盘上的一个QQ镜像,我迁到这个磁盘上的一个QQ镜像,然后我在这个这个加载一个工具,对这个磁盘一直写数据,写数据,然后热线仪把这个磁盘的数据迁到这边呢,哦,我这个迅机还在运行中,然后写完了之后,那这个工具会对这个数据进行校验,校验那还是一样的,刚才那个链条。
61:07
教验那个链条的这个数据有没有出错,如果出错了,那说明我这个热迁移的过程中存在问题,所所以这个有案例,那个案例就是那个Q2.5.1,它是有这个问题,我们这个当时二零。啊,就是这个问题,就是我和另外一个同事花了三周查到的这个qmo2.5存在这个热线仪,就是就存在这个bug,但是要开启那个压缩功能,那个压缩线程它它解压的很慢,然后那个迁移完了之后,那个虚拟机已经在运行了,这个压缩线程的数据还在往那个数据里面覆盖。导致了就是这个这这这里面的这个内存。虚拟机在原端迁移到目的端的,这个目的端的内存的数据发生。变化就是因为这个压缩线程被被给给给篡改了数据,把一个旧数据篡改进去了,然后就导致了这个这个热迁移,这个数据就不对了,所以这个就是这个工具能应用于计算,那不止这一个啊,这个只是举一个例子。
62:13
因为如果写的话,这个PPT都写成写成几百页了,没没没办法写,就我就就举了四个例子。然后我现在讲这个备份洪灾。微容灾也是一样的,那我现在一个虚拟机,我进行加载这个工具,一直在对这个磁盘进行写,然后我把全背增背正背正真的,然后那我我怎么知道你这个写的这全被增倍的数据,它有没有丢,中间的数据有没有备份的时候把中间的一个IO给丢了呢?那我一样的就是我现在把这个这个备份的这个数据。这这个镜像拿来创建一个虚拟机,我加载这个工具,这个工具是只读的啊,它不像这个这个工具就是。
63:00
这两个是只读的。另外15个都是校验完了之后没问题,它就会覆盖写,只有这两个是只读它,你加载了之后,它只是有数据,它校验完它就退出了。他就告诉你这个数据有没有问题。就是我校验的时候就加载那两个工具。其中一个就是我现在以这个备份完的,这个增备的或者全备的,我用这个镜像去创建出一个虚拟机,不用创建虚拟机也可以的,你挂成NBD设快设备也可以,只不过用这个。讯机方便,因为我都不用用敲命令,我只要建一个机,把这个ISO挂载上,自动自动运行起来,它进行校验,然后这个数据有没有出问题,就是它,因为它这个备份的时候,那个L不是同步L,就是按顺序那个链条一个个写下去的,同步lo有先号顺序的,然后如果我中间的那个L给丢了,那这个L这个这个这个。工具就给校验出来了,所以它能够备份容灾CDP快照,这个你你我这里画的是一个备份啊,但是你把这个换成容灾也行,你把它换成快大也行,就是一样的,你这里用虚拟机也行,不用虚拟机也行,你只把这个NPD挂成一个N,嗯,把这个Q户度镜像换成一个NPD的快设备,我用的工具,我自己敲命令对这个工具进行校验也行的,就是用ISO的话更方便啊,这个就是场景,它时间不够了,来不及了,然后就演示这个这个so,我这里创建了一个虚拟机,这个就是还没有运行,就是挂两个磁盘,然后挂一个光驱,这个光驱之后。
64:40
14。就是这这个工具,这个就是既测内存又测试盘的,嗯。这个就是我写一轮那个数据校验没有问题,它会覆盖谁的,那我们现在运行看一下啊。
65:08
因为它这个分辨率设的比较大的话,它一屏这个这个显示。可能。这种愉快的,这个是我做的,So总共只有64兆。这个是基于主要内核是基于生态S的生态S8,然后一些工具链。做一个精简门。啊,这个就开始进行测试了啊,测试的过程中,就这这个是因为这个词盘没有写过。啊,我可以按P键,它暂停了,对不对,我我来讲一下,就是这这里。走最左侧车道。这里这个键P键就POSS键star这个Q键是退出,嗯,我现在按P键,它不不执行了,然后这上面就是我就是工这个脚本自动的运行调这个工具,然后他带了这些参数,这个就是限速,然后这个是两个磁盘同时写。
66:09
就是两个磁盘用了,为了测试那个,就是那个存储这个数据一致性的,就两两个多磁盘的这个情况。这是第一个磁盘的信息,第二个磁盘的信息都是每个5G,然后这个时候盘,因为他一开始没有写磁盘,嗯,他就没有校验,他只是打一个信息,然后他开始写磁盘了,这个就建这个十条链了,他一直在写,在一直在写,我先先暂停啊,这是在写磁盘。然后我按键按切这。这个是在测试内存。然后我也可以按P键暂停了,然后我就按at键加F3,那我们可以看到。你看这里有一个文件,然后。你看这是一个文件系统。
67:03
就是一个一个ta FS的一个文件系统。就是就就是这个temp一个一个文件系统,然后我嵌出了一个文件,这个一个内存文件,这个内存文件跟一个入库设备呃对应,然后我那个工具就对这个路设备进行测,它其实不用用路的也可以直接对这个文件测也可以,我是方便为了用这个l state来看这个L信息,所以用文件,现在它这个没有L是吧。那我就我到过去。那我把它拆开。然后开,然后我们现在看这边的L,现在它有L,其实是限速的,有读L有写L。姐,麻烦您按一下那个。这样。他这个这个录文件是测试内存,然后这个NV是测试磁盘,这个就是他一直在写,这个还在写的过程中。
68:08
这是十个线程啊,这个就是这个,你看这是十个线程,十十,这是零号,一号,一直到九号,这里面的数据就是这里right bm,这是read bm。这是就是146兆数据,这70兆数据。它的这个read就是比是表示是随机校验和刚才那个批量校验,那我们写一部分数据,我来读上来进行校验。这个right就是一直在构造刚才那个那个十条链条,就是各个这是第一条链条的第二条链条,实际上一直十条链条,这个这个就是十条链条的数据量再进行统计。然后等他写完了,他就会进行一次校验。嗯,全盘校验,它其其实现在正在校验,现在的是啊,批量校验和随机校验正在校验,这这有已经有两个数据在校验了,他一边写数据的时候,构造链条的时候,一一边有两两种校验数据的方式在校验数据。
69:08
那我们现在看内存的内存更快,这个是在进行全局校验,就是把这个数据已经写完了,这个刚才那个路虎这个3G,他把那个数据写完了,那他这个它一直在校验,如果出错了,这个就会停在这里不动了,他不会再写了。嗯,那个那个出错的那种情况,我等会用这个直接用。这个设备来进行建,这个是一个暗的环节,就是飞腾的设备。他现在校验完了,那这边校验完了,这个就是零号线程,一号线程,它都会提示你是哪个号线能。啊,这是零号线程,这是四号线程,这三号线程就等会调用完了之后,它就重新又来重新测试。啊,这是一号线程啊,这个开始了,这个新一轮它就一直在重复啊,这个就开始写新的数据,那我们看磁盘,磁盘还有一盘没写完,因为它是十级数据。
70:04
那我们就看这边的啊。还有一个我这个磁盘的这个。嗯。那我看那个内存的这个变张率,我看它的内存在变张,它每秒变张多少数据。就是刚才写那个内存的数据。他有这个统计。这是进行了控诉啊,如果我不控诉的话,它是几级几级每秒的。因为我加了参数是进行控控诉了。而且这个控诉的算法非常。非常准确。这个就是我的内存,就是这个杠L参数。就是就杠压参数,就杠压参数这个是加了那个就是条带,这个磁盘是用两个磁盘和,最多可以测64个磁盘。
71:00
可以加条带的,就这个可能没时间讲这个东西,然后这个是测内存的,你看这个内存就是测完一轮了,这个下面测完一轮再加加样。啊,这个又要新的一轮再测试,如果出问题的话,他他会。是类似于这种,我用那个。啊,这个磁盘磁盘测完了,就写完了那个链条,然后进行一个整盘测试校验,这个就相当于第三第三次校验了,因为他在。在写的过程中,已经有两层两次、两两两种校验方式,校验没有出问题,那他现在要进行一个整盘校验。就是我们的那个测试,如果出问题的话,它就会是。啊啊对对,你看这个数据如果是出现几个字节出错,它就会这样的。限制。找一个。
72:01
好的,如果就是,那它这个数据运行,运行在显示,然后在运行的过程中,就是,呃,这个是。校验出问题了。他这个就是随机校验,这个random校验就是用了第三方种方式校验出问题了。它调验的出问题的这个这个偏移地址在这里,就告诉你是这个地方,这个是correct,这个correct,然后这个读出来read就是error,就是说读出来的数据出错,然后这个就会停在这个程序就会停在这里。等你来排查问题了,然后你按Q键,这个进程就这个程序就退出了,那个数据还在那里,你下回还可以运行那个程序起来再进行校验,它还会到这个位置,因为这个程序一运行起来的时候。发现你有写了数据,它是先校验的,校验有问题了,他就停在这里,就用这个,如果没有出错,那他就是一直在那循环。
73:01
嗯。有这个还没校验完,那我们这个内存可以继续校验。那这个内存可以看这个变量的速度。能做。I就看到磁盘和内存。这个信息。这个就是一一直写的数据,你如果把这个虚拟机迁到对端,然后这个对端这个工具还在进行校验,如果这个迁移的过程中,数据内存出错了,磁盘出错了,它马上就校验出来了,那这个IO,呃,验证啊,这个就。就到这里,我我要不就把那个只读的那个加载一次,就是假设我现在做了备份,或者做了这个其他的这个数据已经写了一部分数据在这里了,那我现在关机,或者我假设这个断电了,就是我设备断电了。那我下次运行起来一个,就我做备份,就是假设这个是备份恢复出来的一个虚拟机,那我换一个,哎,我我就是用只读的方式。
74:08
换一个L。就是用这个,这个是切,我就换成这个的,他不会写的一次。没问题它就停了,有问题它就会提示你。嗯。那假设这是刚才那个备份。假设啊,这个虚拟机就就是在写数据,假设我是备份,备份这里产生了一个备份,用这个备份恢复了一个虚拟机,那我现在这个状态就是在这个地方,我加载了一个检查的这个ISO来对这个数据进行校验。啊,就开始来进行校验,它是一个线程一个线程的校验的,就是现在是零号线程验,然后一号线程验,二号线程校验。
75:00
啊,就这个现在一号线程也可以并发的,十个线程同时建验也可以,你只要把这个把这个数这个杠T这个一换成十,它就十个线程同时并发的这验,但是用一号线程的话,它是按顺序来了,这个看起来更更更方便,就是就跟就零号线程这样没那个链条这样没问题,那一号链条来这验没有问题,二号线程这验。那它一直检验完,然后十号线程,如果它其中出问题了,就是。跟刚才那样的,它就会停在那里不动了。如果校验完没问题,他也会退出,就进程就退出,就一直不运行了。因为这个。这个ISO只读的,它没有下is,那没有这个写ISO的就是不会对数据进行做破坏,所以你做这个备份的数据,你做备份用这个ISO的进行校验了之后,这个数据是没有变化的,这还是原来的数据。现在是六号线能在校验,总共零到十,零到90,十个线能在校验数据。
76:06
它这里校验结构是这个,就是这里四号线程写了923个L。这是第一轮写,然后他写的这个L的时间告诉你。就是啊,2023年8月5号就是这个。这这个时间不对啊,这个这个这个这个虚拟机的没调一下。这这个就是一个是那个。UTC的一个的这个这个相差八小时,嗯。就是它的时区没有换一下。嗯。啊,这个教研完。九号线成零到九号啊,交我们这个数据,就假设这是一个备份的数据,这个备份是没有出错的。好,这个我们就结束了,这ISO这总共有几十个is,就是。对外免费提供的就六个ISO,就是叉八六的,就是Linux的。
77:03
如果就是做新车需要按的话,我我这边也可以提供,但是这个收费了。嗯。就是原理,嗯,这个ISO演示,这个就是刚才讲的这个应用场景,然后我现在是用工具。那个工具颜色就直接用那个M的关键。就是你可以所所有的都用help。嗯。就告诉你黄色的不要用啊,这个黄色的过分就是用来构造,构造这种错误的,就是说一般的是用来注入故障的,故意注意一个错误,这个是为了用演示个问题就搞的,或者是用了一些特殊的高级功能,嗯,这里面叫测试那种Dis磁盘的discard功能,如果你那个磁盘不支持discard,或者不支持forlicate那个挖洞的这个。那种功能的话。
78:00
你测它就会出错的,所以这个文件系统或磁盘不支持特定的指令,这个黄色的部分就先不用不要用了。这个是就是这个杠I的就是猪故障的就更不要用了,你就别搞出乌龙了,这个是用来我刚才说的就是用来演示,用来构造。构造这些环境的,就故意故意构造一个错误的数据,黄色的不要用,然后这个help就是每一个这个内行参数,它的意思就是这个这个。关键信息信息输入到那个D里面去,就是内核里面,就是防止我测试的时候,这个前端的被关机被关掉了,或者什么样的这个这个是这个日志输出的关键信息给丢失了,防止这种我就把这个信息。对,给输入到那个D面的日志里面,就这台这台服务器的D面的日志,然后到时候可以在那里去查看。这些很多是高级功能,我就不讲了,然后我就是具体来演示是吧,一般就是这上面是进行检测的,是只读的这个。
79:06
只读的,它不测试,呃不不不不写数据的,它只是读数据进行校验的,真正的就是最常用的就是这条。嗯,那个命令,然后我们是测磁盘还是测文件,如果是测文件的话,用这种方式就是一个文件。再给个门店,我我现在是测门店啊,我没有磁盘。假设是用4G的一个磁盘就是。就是。那这是一个探索的一个文件。那我现在要用参数就是用这条,那他就把一些经典的需要用到的参数都已经用绿色的给它标出来了,那我就是把它复制过来。
80:03
进行测试。的这个文件啊,我现在是。十个十个十个胸成,我现在这样进行一个测试了。他告诉你的是彩色的显示direct IO一个处,1024。各扇区这个这个交易模式就是杠二的话就表示。表示。这三种全部。校验,一个是整盘校验,一个随机校验,一个这个批量校验,就刚才PPT里面讲的三种校验,然后这个就告诉你是十个线程。如果是以check的方式的话,它是只读的,这里默认你不输入这个这个杠V参数,它是默认是check,防止破坏数据,这个check就是只读交易数据。那我现在就已进开始了,对,因为一开始这个数据是空的,这个文件它没有校验,就他一发现空的,他立即返回了,那我们现在开始就写数据构造那个十条链了。
81:07
那个这就就是他在进行批量校验和随机验,因为这有图数据。读数据,继续校验,就是写了82兆,就是这个。一直在进行着,那过程中我可以暂停的,我现在暂停一下,不测它就没有IO了,那我现在按S键,就是这里S键。你如果按Q键就直接退出了。啊,我现在按Q键直接退出,那我下一次我还是以这条命令来,那他就不一样了,就刚才已经写了一次一部分数据,那它就会对它进行一个全盘校验,你看他进行校验,校验完了他再再开始来写。呃,就刚才这个零号线程,他写写第一轮写了185个L,这里写了176个L,他告诉你,然后这个每一个处一处数据的话都有是1024扇区,这是它的第零扇区就都是。
82:06
这个位置。报的这个。这个就是。你用这个吧,就是用的就是这就是1024扇区报的就是这这这个处的这个最开始的这个扇区就是这个I。A0记录的这个位置,然后你有1023区,你就它是连续的。就是那他他现在进行测试。这个读写。就是这个现在是读在校验,然后你把这个写完了,这个已经写了2G了,写了一半了,因为你这个平均的话200兆就十个线程,就像两级已经写了两级数据了。嗯,这总共这个文件是四级就写了一半了。嗯,这个校验的话就是280G,呃,不不两两点八G,呃,就像像那些校验了3G。
83:01
因为它有批量验和随机校验,所以它的校验的数据的数据比写的数据更多。这个还是是这个测试工具,我们还有个辅助工具。就是那个上图工具。这个已经是叫啊,那我现在这个当图工具,我是可以随随时这个工具是只读的,我随时可以进行校验,我现在说。说的是线程校验,我说校验零号线程的这个数据。这就就这那边在写,我这边在读进行校验,我对这边写的这个数据啊,他这个也在校验已经写完了。我在校验的过程中,我也可以暂停。
84:00
就是4G数据嘛,这个暂停我现在。这个是并发的十个线程一起在进行校验,那我还可以单独单独的线程经验你看。这这种黄色的是没问题的啊,不不是有数数据问题,只有是这种。红色的BUG00只有是。只有是这种的红色BUG00几有这个关键字的才是数据出问题了,这个是没问题的,校验完了。就是这个零号线程的校验完了,那我校验一号线程的,校验二号线程的。三二号成本啊,做校验就是一个线程一条链的整个调研码,那我可以选择啊,它就是写了715个L,就是第一轮L写的715个L校验完了,那我可以,这是线程校验,我可以进行。叫触间校验,我在这个线程里面写一段出来,假设这是。
85:01
七百七百一十五个L,那我现在选择这里一个L。就选这个啊,选我只校验一段位置。那它的就是LBA这个这输入地址,然后告诉我校验几上几处,我现在校验时处这个就是开始位置,然后校验实处这个就是触间校验,只校验这个链条里面的一部分就是。哦。这里有个旧数据哦哦。我知道了。他都不够实。这个这是最后一个还这个。这个715LLL旧数据。那我校验它的前面的数据从这里。
86:06
这个这个是715,这个是714 713 713 711,这就是往前,这个是向前的这个数据。这个是数据。这个就是我们当前的刚才,刚才就是。这个。啊,这个715的,这个就是715的,这这是最后一个IO了,这里面的这个IO是。是是旧数据,这为啥呢?因为我每写一个L,它后面的99个L就决定了这个位置被分配了是吧,就是随机分配的,但是我这个存储已经写到这个,最后一个空间写到这里面了。这后面我要写下一个IO的时候,我是不是要在这里入对一个新的IO,但是那个磁盘没空间了,已经已经分完了,就没有IO再可以分进来了,那这些里面的这个位置的数据都是旧数据。
87:12
这个理解吗?那我写到这个L的后面的这些L已经分布出去了,那我要写这个L的时候,我要我要把这个就是往外出对,然后把这个L。加后面这些L,然后在这里入对一个。对对。就是这个我要入对一个新的来,入对完了我才会写进去,但是这个入对因为这个B麦给耗尽了,就是这个磁盘满了没有,没得再分了。没空间了,所以这个入对的这个L没得入,然后这个L就没办法下,这个就716个L就没,因为没有存储空间了,就最后剩下一点点,它没办法写,就会存掉的,但是你如果测三遍五遍这个这个地方就会被覆盖起。
88:08
下一次这个地方就可能就会被写了。那那我们现在是这个是最后一个L,就是这个线程写的,最后来我往前找这个是714 713,那我找到这个最前面的这个,十个L的最前面的这个。然后我们来进行检测。检测这个这个L,然后我只检测一部分那个线条,那个链条里面检测一部分你看。这个是705,这个是七七百一十四,就是往前走,刚才那个715的往前走。这是链条的前面的那个数据,然后你这个这个是。714这个就是715那个57BC,你就去看刚才那个武器。715的那个位置。
89:02
调的至少5C5GBC,嗯,对,你你看这个数据。就可以把它是想象的,因为它一条链条,它不是这个16定制随机的没有意义的数据,你就填一个链条,这个链条只这个链条下一个L,下一个还下一个个,这是前一个L,前一个L,前一个L,然后这里就是一个强双向链表,然后也是一个队列,也是一个数组。它数组就是零到90到零到99,然后这个零到九,这这是系数,又是队列,又是强双向链表。然后这个构造的这个数据一直写一直写,然后一直校验,一直校验,就是我现在写的这个数据随时的进行,因为这个是暂停了,我现在就看。刚才是看了一号线成的,我看可以。可以用这个工具平头。那我这个工具,刚才那个工具是只能一条链条,一两两链条的进行校验,而且可以你选择细节的,而且可以当图这个一个指定的位置,这个数据,把数据读出来看。
90:06
但是这个工具它能也能校验,它校验只有一种,就是只能全局校验它,它怎么校验,它都是把整盘的数据校验一次。调验值,但是它可以选择的方式是你是一个线程顺序的检验还是并发的检验,这是顺序的检验,一个线程这边是并发的检验,通它十个线程一起开始检验,而且它有现成泡告诉你。那它这个啊,这个零号零号线程校验完了,一号线程校验完,像二号线程,就十号线一直校验完,这个整盘校验一次,这个工具校验,它是整盘校验,它输出没有那么详细。刚才那个工具。就是它很很详细,可以看任意的地方,你看一下第二步。这个就是。
91:02
这更T的就是叫线程校验,而且可以校验线程的一部分。这个是校验的话,就是触间校验,就是在县城里选择一部分,选这个开始的位置,我校验100处。这个像这个是。处内就是这,这是一个处,我在这一处之内,他们的各个扇区之间的数据有没有出现,这个叫处内校验,这个就是当铺当孔。嗯,文件来看,我就我觉得我要随便。指定一个位置了,我要看一下它的数据是啥样的,你就指定一个地址,就假设指指定这个8000这个位置的数据,我只嗯你默认你不输入的话,它就是一扇区,也可以看两扇区的,可以看三扇区的,也可以看1024扇区的,我我现在看一扇区的。然后test那边我看一上去的,它就是一上去的数据给你看,然后我现在看两上去的。
92:04
啊数据如果他跟上区之间出问题了,它就会红色的显示,这个就没有没有数据出错,他们讲数据是一致的,你看这个八八千八千这29340,这个这数据,它这里的数据,那这里的数据也是一样的,这里的数据跟这个数据它全部是一样的,它就没有没有那种一闪一闪的就显示的。不然的话,他就会出错的话就是。像刚才这个啊,这个十个线程就全部交完,如果他发现出错,就是这样一闪一闪。能够告诉你这个数据出错了,那我现在是两个线两个扇区,就一个处之间两个扇区,我现在看三个扇区也可以啊。33区的数据。你现在看10243区OK。这就一个处总共只有1020上去,你看这里总共1020,那我们就看1020上去,全部的数据给你出来。
93:02
这个是一个高级功能,这个零在显示这个没有出错啊,这个是我们一个高级功能,用来测试一些特殊的情况,比如热迁移。或者那个。磁盘的空洞。看可以看到1024上去的数据都给你出来,这个你可以从立项的一个文件,嗯。嗯。点。嗯,这V压区你可以看到前面的数据都是。等于一百四五。后面。呃,这个就是往前走。我找他的那个分界的地方,就是我有10243区,我一部分啊选择是写的,写的刚才那个链表,我另那个那个墙川相链稿,我另外一部分,我就让他写全林,这个全林我我刚举例意子,他为啥要做这个跑步。
94:12
为为啥要用这个高级功能,这个它其实功能还很强大。嗯。算了,谢谢。可以看到这个。743加这个。2280这个就是等于1023嘛。1023因为是从零开始的,就是从零开始的,就是这个就是第一轮写的L,写了242个L。这个743就是它的这个零,这个就是。它这个在扇区零在这个处里面的扇区的这个扇区的这个序号就是从零到2.723。
95:07
下山,然后后面的280扇区是全零,你看就是这样的,这个为啥要做这个的话,可以稍微讲一下。它是一个高级功能。这个高级热迁移的时候,我们那个那个内存页是分为全年数据和非全年数据的,这个就是如果全年数据它只是签一个标记,它不签签全零数据,把整个零的一一整页的数据签,他只签这个标记。我这个全年数据为了。写内存的时候就测这个功能,第一个这个日迁移的时候全年。数据热线页,请第二个就是那个磁盘的时候,比如QQ two里面。我迁移的时候,如果q two的L表,它是有一个这个zero标记的,如果我签的全零数据,那我也只就一大块数据是全名,他不把这个一大块的数据迁过去,他用一个标记这个block,这个zero block他签了个标记这个也可以测这个磁盘的。
96:11
还可以测这个Q的这个L表表象里面这个这个标记,这个标记就是这个这个标记,看它有有这个东西,这里它有真实的这个这个数据库的偏移,这个QQ two的数据库啊,然后这个是全零数据,它没有分配它的这个偏移,它就是一个标记。这个就是可以测它的Q的镜像。镜像里面的这个AR表表象的功能还可以测这个稀疏文件拷贝,如果是一个稀疏文件,它是全零的还是一个空洞的?经过了这个远程拷贝或者普通的拷贝,拷贝它数据会不会是正确的,那个空洞里面会不会是一个随机数据。经过这个功能也可以测,所以这一项功能它可以测好多功能。测测,嗯,计算的测这个这个算。
97:04
你可以算存储,也可以算成计算,就是一个镜像格式,然后这里面就是文件的话,就算存储或者文件系统,那就可以测很多个,就这一个功能,一个这个全零全零数据的这个数据写。然后我刚才这个已经演示了这个校验啊。然后我们现在来构造几个。构造几个那个。故意构造几个错误的数据。嗯,我就故意构造一个假的,我我让他。
98:00
一个区,我他。的数据出错。在一分钟之后就。真的对他进行这个。这里就表示注入扇区错误,这个表示这个处是1.24扇区的这种促大小那架验的话,只进行整盘加验。整成这样的话,它可能太慢了,这样出出问题了。校验出来的这个速度太慢了,它就我用批量的快速的发现它的这个错误,然后这个杠K就是把这个关键的数据输入到里面去,我。有一分钟就会出错。我们可以跟面。
99:00
转发信息。你看我刚才把他的这个惯性信息输出到D的日志里面了。如果他这个出错的信息,那我在这里还有一份日志,如果假设我这这里面这个这个窗口被关了,这个数据出错的那个现场没有。现场没有了。然后我可以在。在这个里面。等一分钟。嗯。我现在那个。就是这个用命令的方式,都是用文件啊,用那个快速备用路文件,或用NBD文件,要不这个是磁盘,NBD磁盘或者那个路,呃,路虎是盘,你看马上就出来,它就会停在这里不动了。他就会告诉你,呃,BUG002。啊,然后这个中号三,他的告诉你是批量校验数据,这个扇区在。
100:07
310这个位置连续错了11扇去,那就是你可以看到这个是最后一次写的数据是在这个位置,那我们出错的位置是在这个位置,出错的这个偏移位置就是从在这个位置偏移。310扇区,然后连续11扇区出错啊,它出错的只输出一一扇区的类出错的啊,连续的出错,它你你的话用当幅工具可以看详细的看。它就这个停在这里了,就不动了,而且我们可以看到这里面有有一个叫bit map的功能,这里面区分是runtime和切的,这个就是表示我在测试过程中没退,没有退出校验出来的。就没有退出,就你写数据,然后校验马上就出错了,这个时候就是是在运行过程中,就在测试过程中。
101:03
就是。嗯。发现的这个数据错误,这个数据变成这样的,本来这个数据应该是类似于这种数据的,那现在变成全090909了,那他现在停在这不动了,就是它没有L了,你按一个Q可以退出,然后你可以。就退出了,好,那我我还可以继续执行这个。他因为我一执行的时候,他先进行check。他是切马上发现出错,他还是不会写。就是只要这个数据出错了,你看它又停在这里了。他不会有,有写L,就是那个数据已经写过了的,它一运行的时候,它是先校验你的数据有没有出错,嗯,有出错他就不不会进行写覆盖破坏数据,它不会破坏数据,它就校验出错了,它就停止了。
102:03
不动了。如果校验这个数据没有出错。他就会。覆盖写了,那他你每次再执行,他还是在这还是会。还是还是会。校验出来就是你那个数据你写在那里,你断电了,断网了,你这个那个数,那个进程退出了,你再去校验,它还是在这里就是。这个这个每次报出的这个不一样,是因为。它的不一样啊,因为有十个线,每个线上都有错。但是我们这个线程运行的那个读的这个IO的速度快慢不一样,我第一次报的是零号线程先校验出来,因为它是十个线程并发的进行,这样我第二次可能就是现在是第三号线程交验出来,这是三号线程报的错,它这个数据一三号线程的数据一直是这个错啊,但每次报出来的不不一样,这这这个还是三号线程报出,但是第一次报出来不是三号线程,它是。
103:04
它是零号线程,因为我们每次读的时候都十个线程,它IO的速度,读IO的速度快慢不一样,所以有的时候是一号线程先报出来了,它其实是零号线程到九号线程,每个线程都有错啊,就故意注入的每个线程都故故意的错,只不过我在校验的时候,他的的快慢不一样,一会儿是十号线程先报出来,一会儿是。就是三号线程先报出来,但是我用到当铺工具,每次去当铺他这个。每次去校验的时候。就是我现在用云化线程。去检测。像教练零号线成我校验第一次还是这个数校验你看还是零九。我再去校验,每次校验他都是报这个错的。
104:03
那一样的就是这个090909S这个错误,就是310号这个偏移,然后它,那它这个是扇区偏移啊,它具体的位置是这个位置。他会告诉你。啊,告诉你是这个位置,从这个位置。这这这。他的那个那个就是真实的偏移,就是这个位置,这个位置已经把这个。这个处的这个310个扇区已经算到这里面去了啊。算的这个是321,你看三百一三幺零和321这中间差着11个。一个扇区就是这下面321后面的数据是又正确了,然后这个。那个310的数据,这个位置连续11上去是错出来这个零到309,零到309的之间数据是正确的,那每次当不少算,那我去当出那三号线程的数据。
105:07
刚才三号线也报错了。你看是全机跟这边的。就也也是一样的,它这个数据一直在这里设置,不会破坏,它一直在这里了,你你现在把这个机器重启啊,你在这这它还是这样的数据,所以我这个。这个校验就是你随时校验,你的数据在这里呢,随时校验。只要出错了,它的这个数据就一直是这个状态,不会被破坏,我我我用这个写的工具来进行校验的话,它也是先。他先校验出错了,它就停在这里,它也不会去破坏数据,是这个工工具,只要这个数据出错了,这两个工具都不会破坏这个数据,你什么时候校验都行,你断电断网,你输入故障能。
106:01
这个数据还是在这里,就是一直在这里。就是它校验这个数据就没有限制,如果你用FIO或者用VDB办起的话,它的那个就是它的功能很弱,就是跟这个iba工具的这个家用功能完全没法比它的功能。比他弱很多,它还有很多这个,比如说校验文件系统啊。他可能有一个模板之类的,这个输入的用模板,它你用模板丢了,你可能让他用模板件,我这个工具是无状态的。就是我的工具又没有其他的配置文件什么东西的,我就是你有数据,我有工具,你这个数据里面我就去。就去读他的那个,就是前面这个。就是读你这里面的第零处,就是这十处固定的,然后我们数据读出来了,就校验你这个链条数据。是不是这个强项,强双向链表有没有被破坏,然后每一个节点里面的各个山区之间的数据有没有被破坏,这个一校验完,就相当于这个磁盘的每一个字字节都校验了,有没有出错就就马上出来了,它无状态就是你这个数据你在。
107:19
你在?这个。这这个文件或者这个磁盘是在A的主机上,嗯的数据,我把这个磁盘拔了,放在B1的磁盘上去,让我这个工具在B磁盘还能还能。一样的车,就是完完全没限限制。所以它的那个这个校验功能很强的,嗯,目前这个讲的这个PPT里面还是涉及的非常非常少的一部分,本来这个PPT写的这个内容就没有特别写的多,就是你比如说他的那个这个应用场景呢,就只是4534页是吧,就四页四五页几页,一页两页,三页四页。
108:02
总共只是写四页,就没办法深入的这个讲写下去,一写就太多了,就本来就90个页。然后这个就是各种错误类型,就是嗯,这个错误类型在上前面就有介绍,就就是这个啊,各种介绍就有,嗯,初间校验还是随机校验,就是里面整体整这种校验的方式有三种,就是整体校验的有这么多,然后批量检验的这这些,然后随机校验就是前面这三个图。对应这三个图就是全。全全盘校验。批量键,随机键这个。就跟他一一对应,然后它这个校验,根据它的出错的数据的位置不一样。他就会有。各种类型就是这个bug 001002003,什么007这个,然后这是它的校验的这个模式,你输入参数的时候就是。
109:01
有如果or的话,就是对他所有这三个同时生效。嗯。然后这个输出的这个。这个这个就是标识,这说明这里有大家可以看一下,这刚才已经演示了,就是这个磁盘规格信息这个文件的。这是参数的解析,然后生效的参数,然后这个就是校验,如果没有数据的话,它就不校验,一启动的时候,就刚才出错的时候,就是因为这里一开始有一个校验的工作。如果出错了,他就停在这里,没有出错,他就开始来。写数据了,来构造那个链条了,然后呢,如果。写完了,那它就会进行一个整体校验。就是这个那整体键没没问题,那他继续覆盖写,如果有问题就停在那里,就刚才这个演示的,你要按那个Q键。退出。所以说他始终不会破坏数据。
110:00
嗯。然后另外一个我们用ISO或者用这个工具测这个磁盘的话,我们测那个存储。主要测的是要测它存储的那些流程啊分支是吧,那我一个磁盘写了一遍,再写一遍,再写一遍,这个磁盘的数据写了一遍,这个磁盘已经整个。就是数据已经全部分配了。我如果是文件的话,那文件系统里面已经分配了,我再覆盖写的时候,这个数据块就没有再分配的这个过程了,所以后面你测三到五遍了之后,就没有必要再一直再写,写100遍就是测100遍,因为覆盖写。他只是把数据写到对应的位置,它没有有那个分配呀,加锁呀,这个释放啊,那个过程了,那个数据那个那个数据块已经固定了,你只是覆盖写它的那个IO流啊,那个IO站,它这固定的走那个流程,所以你不容易测出什么问题。
111:05
那我用分布复分布式文件系统啊,或者是S啊这种在服务端我先用一个精简的,精简制备的这种方式。那我测,我测的时候我写了三遍。或者五遍。没出问题,那我就这个工具退出,我把这个文件或这个磁盘给它删掉,我再分配一个新的,我这个这样测的话,主要就是要你这个存储要走那个。多并发。有分配有释放的那些流程,让你走文件系统的话,有加锁,有解锁,有那个就是原数据更新,就是那个安诺的节点嘛,我写一块数据,你分配一块数据出来,就那个安诺的节点,就这些原数据会有更新嘛,对吧,我要测的就是你的整个文件系统的整个的这个I流程。
112:00
所以我测几测测,测了三轮之后,五轮之后没出问题,你就删掉重新再来,就要这这样测效果才好。还有一个就是我测的时候。还要有那个那那个故障注入,就我这个存储一直是正常运行状态,就比如说S,我这个网络一直是正常的,那也不容易测出问题,那我在测一个S这个磁盘的时候,我故意用那个IP table设一个规则,我一会儿给它一个网通一下,一会断一下网,我用这种方式来进行测就容易。测出问题,测出我这个S这个数据通过网络。这个网络出故障的时候,数据有没有丢失,那我这样测,还有一种是。我。测的话,我断一下电,断一下网,呃,网已经是了,断一下电,重启一下这个虚拟机,或重启一下这个主机,我用弄这种故障的时候,它有没有配开之类的,嗯,这种会配置开的数据丢失啊什么这种的话,我就用这种故障的方式。
113:15
来测也容易测一些问题出来,就比如我这里面的这个例子里面。就是这个它有数据重建嘛,就是什么算法这个这个数据重构丢失,你看这个就是就跟我刚才说的那些,我故意构造一些这个。呃,是这个构造一些这个故障出来,你看这个原数据丢失,这个就是弄出这个重启啊,断电啊,断网啊,这些东西弄出来的,我测完了之后,就是我测几遍了之后删除啊,然后再再分配一个新的来测呀,就是这种这些场景下就更容易测出问题。嗯。嗯。
114:02
哪些可以讲?这个这个这个稍微可以讲一下,就是我们可能就是有这种需求,就我比如有一个数据库,我加载了16块磁盘,有一些磁盘是放数据的,有一些磁盘是放blog的,有一些磁盘是放其他的,那我这个磁盘进行进行备份的时候,就我对这个磁盘进行备份。我需要一个磁盘组,这整个磁盘你16块磁盘的数据是一致的,在同一个时间点的IO都有或者都没有。如果就是我在这个时间点呢,A磁盘这个数据有,B磁盘的数据丢了,那就会对这个磁盘组的数据一致性有有影响,就会可能影响那个Oracle数据库,假设影响数据库的一致性。那我要测这种磁盘组的情况,就有有策略,一种策略就叫这个。Round round Robin就是类似于就是就第一个L写在第一个磁盘,第二个L写在第二个磁盘,第三个就是这个就是轮巡的那种方式。
115:11
啊,这个根据你的这个偏移,就是我这个磁盘组把它看成一个虚拟磁盘,它是由这四个磁盘组成的一个虚拟磁盘,就你把它看成那个IVM。组组织组磁盘一样的,就是组一个大的磁盘组,然后我这个iba工具对这个大的这个虚拟磁盘进行写,写的时候它根据这个策略,它分配这个L落到哪个真正的物理盘上。嗯,就是有这个策略,就是这个round Robin的策略,然后。啊,写到这个落盘的上,然后。我对这个磁盘的数据,我现在关机了,或者断电了之后,这个磁盘里的数据,我用这个工具在进行校验,我看看这个是磁盘组里面的数据是否一致的这个磁盘组。
116:00
构造的这个虚拟磁盘,它还是跟这个上面是一样的,是一条链,还是同步L还是DL,那我对这个虚拟磁盘进行校验,就是对这个磁盘组进行的这个lo进行校验,同一个时间里面的lo,它有没有丢失一个,丢失一个这个。虚拟磁盘的磁盘组这个链断了,或者这个扇区之间数据不一致了,那一样的就校验了这个磁盘组的数据不是否一致。那这是一种策略,是的,还有一种叫。啊。就假设我这一个磁盘,并且1024上区,我四个磁盘,每个磁盘的这个数据都落数据,我一个一个数落下来,我把它平均分成四份,这一份落到这个一盘,这一份落到二二盘,这一份落到三盘,那落到四,本来是一个处的,把它分成四份,落到四个盘里面,然后我还是一样的用刚才那个方式测测写了这个链条。
117:02
那我现在关机或者断电了之后,然后我再起来这个工具,对这个磁盘组。这个磁盘进行一次校验,看看这个磁盘的一致性发生错误没有,就假设这一个错误里面。这个盘落盘了,这个盘落盘,这个盘没有落盘,这个盘也落盘,那它就会报这个盘的数据出错了,那你这个磁盘组的数据一致性就出问题了,我这里有一个例子,就就在这里建了,我这是用的四个四个文件啊。
118:01
那这四个盘就你把这其实四个文件啊,跟盘是一样的效果,那四盘的方式来验它的数据,看看它你就就是一一次是一个线程,从连号线程就是按顺序的来,可以你弄十也可以十可能更快一点。但是它是这个乱序的随机的,我现在用一个性能。啊。嗯。有人在访问这个城。这是文件。打不开。哦哦。你输错了。对,马上就出错了,这个是我故意构造的,就是就是十号十号线在他出错的话,哪个线文件里告诉你出错在这个文件里面。
119:10
它其实是。这里面的数据都不是真实的偏移啊,这是那个虚拟盘的偏移。就是。是这个大的磁盘的这个偏移,它到真实的磁盘里面,就假设在有这这个文件里面,它的偏移是由后面的这个信息来。它出现这个个条代码是有四条零到三码,它现在出出出出零条的这个这个这个是哪个呢?就是这个按E文件,然后它的真实偏移是在这个位置,那我们就可以看一下这个位置。嗯嗯。藏族。杠C、杠D。刚才啊,在这个位置,你看一上去。然后就是2B一点啊,它其实这个数据。
120:03
这个就是。就是它真实的这个数据就是0008。0008这个数据它不是在这个虚拟磁盘的这个位置。这这这里面现在这个数据不是真实的偏移,这个是这个。这大这里面的这个整个就把这四个盘组成一个虚拟的盘。有有这个有这个。组成一个虚拟盘。这个虚拟盘的虚拟偏移。在这个偏移上,那它具体的这个数据落到哪个盘的这个。盘的偏移,我们是看下面这个会告诉你是在哪个位置。就是第五轮的第一个L里面,他告诉你是在这个去。去过,这叫条条大林。如果是。然后它这个是真实的这个偏移,这这个盘的。
121:03
可以看到80080。821780。它是在这个盘上。这是条带的,这个为了测磁盘组,这里也有演示,嗯。啊,这个这这这个就是这个。刚才我们那个。一样的弄四个环境来测,四个文件来测。这里就是输出。这是值班组。这个合并的这个。看看这个也跟讲。这个其实这个精准限速,其实呃,这个作用也也很大。这算法。你如果十个线程随机的写数据,你要控制它的速度是很难很难的,这个算法想了好多天。能够精准的看,你可以看到精准的控制到这个速度,在这个左右,那个波动很小,这个算法都可以是去申请。
122:08
新成专利。我估计没有,我在那个开源工具里面那个什么R啊,或者呃,SCP啊,这这些网络传输的或者磁盘的测试工具能精准控制这个速度的,好像还没怎么发现,我这这证明这个算法是。把那个A的一个控诉的那个算法拿来了,进行优化改造,就是加了加了一些代码,然后能够就进融控制了。这个功能可以做什么作用呢?就比如我们跨存储热迁移,我们可以。加负载的时候,我们我们用一般的业务加负载,我们控制不了它的负载大小,那我这个瞬机进行热迁移的时候就迁移不完,那多大的负载会导致它迁移不完,我就可以用这个工具,不管是加磁盘的还是加内存的这个负载,我通过这个限速和。
123:03
可以调整,那我可以测试出来这个虚拟机多大的负载会导致它。签不完,比如用二分法这种我加一个。四四百兆,然后200兆,100兆要五百一三。就就是就这样,就是运用这个二分法的方式,我可以能够测试一个精准的这个负载,知道这个瞬机迁迁移不完,是在多大的一个负载可以迁移不完,这个这个可以用于计算,嗯。还在其他的一些情况下可以用啊,这个工具也可以用来抹抹除数据,比如我要删除一个磁盘,一个磁盘有敏感数据,我对它进行一次就用这个参数。它的这个这个测试里面有一个万。那个check是只读的,就是刚才每次运行起来它都check。
124:02
有杠。你不输那个杠V参数默认就是切。你用如果忘的话,它就是对这个文件写一遍就退出,就覆盖一遍,那如果我有一个磁盘有敏感数据。我我要希望把这个磁盘的数据给给给给抹去,抹去,我用这个工具十个线程对它进行万次的测试,就抹写写一遍,那它就是构造一个那个双向列表一样的,就是那个那个强项的那个,把它数据给它,给它覆盖过去那个敏敏感的数据,就比如我创建一个虚拟机。你要敏感数据就写一遍了,之后就抹去,抹去了,这个有个通知功能,这个不讲了。这个还有一个这个虚拟内存和物理内存,那个映射的这个代码是参考那个DVDK。这个也可以讲一下它这个作用在什么,另外我在读写那个。
125:02
这个磁盘的数据的时候建的一个一个。建的那个就是那个促大小的buff,有几个buffer,那个读这个数据或写那个数据都是放在了buffer里面,用DYL方式写进去的,然后那个B大小就是杠S的那个参数,就是你一个处包含多少的共区。它的大小就是在这里,那我这个buff分配了之后,有个虚拟地址,那然后我要希望之后把它的物理地址啊,他在这个map文件里把那个物理地址都记录下来了。那如果出错的时候,我要看这个buff的地址啊,很方便,嗯,我不用GDB去看这个进程里面的虚拟地址的内存呢,然后我知道了它物理地址,我可以通过。那个qmo就我们运行Q嘛,有个p memory save的,我就可以把这个物理地址的那个内存给downmp出来,我直接可以downmp来,就可以看这个虚拟机里面的这个内存的数据了,我当不出来,我直接看这个buff分里的数据,我都不用GDP对这个工具进行调试了。
126:18
等了两个多小时。控制不住了。啊,这个就是每一个。Windows。然后呃,免费你提供的就是那个get汉上放了的就是1234,然后再加这个一兆总共六个,因为放的太多的话,这个这整个有1G多。第一个是演艺居多。你的占用太大了,另外一个就是嗯,这六个已经是最常用的了,就是所以给大家联合使用,如果就是呃,有信创的这种需求的,你需要用暗的可以联系我,可以提供一些免费的可以提供给大家用。
127:08
但是商用的话这个嗯。不不提供啊,就是商用的话就是要收费的,就是如果就是大家。的公司啊,或者在试用过程中有存储啊或OS啊,开发的人力系统啊,或者。开发的是这个云计算里面的,就是我们的那个虚拟机啊,然后或者那个备份容灾啊,你有这个稳定性的需求,然后用它试用过程中测试了不少问题,嗯,有觉得它的功能还是满足自己有公司的需求,嗯,如果公司有这方面的需求的话,可以联系我,就是我可以提供整套的这个种,而且可以提供那个就是周末的时候啊,嗯,可以提供技术支持,但是这是收费的。嗯,我花了这么大的力气,用了七年时间写了这个工具,不断的更新那个这两奶粉钱应该也是合理的是吧。
128:09
这这这这个就是一些演示,我就不不再重新演示啊,因刚才跑那个论的虚拟机已经给大家演示过。大家可以看一下,简单点个录屏。聊天这些,如果大家有那个啊,就是下步的展望。呃,我这个工具有提供给一些就是。嗯,比如那个SDK那边的,我往那个李刘长鹏那边那个团队里提供了一份。根录PPT,然后那个O在电话上面,我不知道他们试用结果,他们有给我反馈,还有一个那个刘爱贵博士,那个他们公司做存储了吗?那个有加了他的好友的话,他以前那个是。嗯,对那个GAFS很熟悉嘛,呃,看到发的那些文章,然后他是做这个存储公司的啊,可能对这个这个存储稳定性或数据致新有这方面需求啊,我也跟。
129:08
提交了一份。他们说在研究看看试用啊,目前还没有得到我的反馈啊,就所以下一步会向那个太原市去提交,嗯,然后也可能会向国内的一些应用厂商。给他们试用,如果大家用的效果好的话,有这方面的需求,想购买的话就是,或者想需要技术支持的话就是可以找我。嗯嗯,如果就是你试用的话,你就是一直自己的个人试用的话,你就一直免费试用,所有的功能都开放了。我我在那个代码里面没有做那个功能的限制,就是所有功能都可以用。但是做了一个时间的限制,就是可能你用一年之后它可能失效。你可以再联系我,也不能用,我再提供给大家,或者我再提供到那个给他发布上去。
130:05
嗯,那个工具你看起来很小,只有那个。就只有30多K,它其实不止30多K啊,这个是因为经过了那个。经过了那个就是加壳软那个软件的压缩,然后它其实是有有有有100多K就。然后经过了那个。经过了那个加壳之外,还加了一些加密啊,嗯,也没算加密,就是做了一些限制,嗯,然后加壳之后把一些关键信息给去掉了,所以大家解密不了的就是然后那个调试的信息全部给去掉了,所以反馈别的话,你就反馈别人想研究的话可能。
131:03
嗯,需要高手,比如说那看雪论坛的话,那些高手可能可以的,那普通的话,嗯,大家可能可能不一定能够拿到有效信息,那外是。伊利的2D是经过加密的,它是在内核里进行解密的,所以大家也肯定没办法进行那个那个就是。普通的那个I,就是这个OS的那个修改可能做了限制啊,就是说如果是一个高手可能可以或。破解,但是普通的话可能就解压不了这个东西,因为是加密在内核里面文件那那个科的那里面进行解密的,所以不一定大家不一定能解密啊,就做一些显简单的限制,那不影响使用,就是这个只是为了商业的做做一些保护而已。其他的看大家有没有什么问题,有问题的话我就统一给大家解答一下。
132:05
啊,张老师那个那个聊天框里,然后大家,嗯,就是问了问了一些问题,然后麻烦您给解答一下,不是那个,嗯。核心问题啊,就我没在网上,这个刚才应该讲了啊,就是那个应用场景已经讲了,就是核心就是解决一个存储的稳定性,我进行。刚才就是说的那种,嗯,分布式存储啊,或者S啊,或者其他的一些存储,或者内核的存储协议站,他们有没有bug,那些流程里面有没有bug,我写数据的时候,我再去校验他在这个走这些IO流程的时候。这个分支的时候会不会出错,导致数据出错。如果出错的话,就是你这个存储稳定性存在问题,你要去考虑进行加固去解决出现bug。
133:01
呃,就是这个PPT的这个题目,它要解决的问题就是验证你这个存储的稳定性,然后你做备份啊,什么那些的那过程中的那数据一致性,就是你做备啊,做容灾,你数据有没有丢,或者有没有出错,这个就是两个问题啊,就是存储的稳定性,数据的一致性。解决这个问题。呃,坏道,你一个磁盘坏道了,也会可以检测发现出来,但是他没有那个专业的那个工具好啊,就是那个你用那个black black box black block black box,就是那个ET4那个那个什么那1T4A1那个是有有一个组件的那个那个是什么。有个组件,它里面有个。Bad,呃,就是这个这个组件里面,它有一个b block那个工具,它更专业啊,它它可以校验出所有上去的那个坏道,我这个只是能够明确告诉你有没有坏道,然后检测的第一个坏道能够告诉你,然后其他的就不行了。
134:16
啊,他不是用来来。就发现所有坏道,但是能够发现坏道,但是不会发现所有坏道,因为我这里的这个工具一测出第一个出错,它就停住了,他不会继续检测后面的数据有没有错了。嗯。啊,我们这个不是只检测系统盘的,我主要是对数据盘,就是存储的数据盘,呃呃,来进行写数据,然后校验,然后判断这个存储或者是磁盘或者是文件系统文件。嗯,有没有出错,这个就相当于我那个汽车啊,我现在开发了一个汽车,假设是特斯拉,那个特斯拉我现在要上市要难卖了,那我要进行碰撞测试,就是拿那个这个车去撞啊,各种撞就相当于我这个磁盘,就用这个工具各种写各各种注入故障或者什么之类的,我再去校验这个数据有没有出错,然后就确定这个存储你是否稳定,就相当于这个汽车,比如那些稳定系统啊,或者那个轮胎啊,或者那个控制系统啊。
135:28
或者那些安全系统啊,就是那个你发现障碍物,它停车的那些,它有没有问题,就这这个就相当于这个步骤。这个碰撞,那个汽车的碰撞,发布之前进行这个碰撞的测试。就是来确定你这个存储,或者你这个备份啊,或者你这个虚拟机的热线一。他有没有隐藏的bug,我们在发布这些产品之前,我先把这个问题给找出来检,检测出来了之后我解决掉,使我的产品更稳定,我的产品更更更更更,呃,就更不容易出问题,在各种异常环境下不容易出问题,就是为了这个。
136:17
就是你测那个磁盘肯定会有损耗,我我测的磁也不会测很多遍,就是一轮一轮的,你写三轮就是这样的,这个损耗也不会太多。嗯,就刚才讲了,就是你可以对比一下这个FL和这个。嗯,跟我这个工具对比,它哪个更友好使用,就刚才我简单演示了一部分,还有很多功能啊,这有好多参数。大家可以去探索啊,就您私下可以也可以问一问,就是通过网络给我发消息,我可以有空的时候给大家回复一下。
137:00
那个FL和LD被办起,他做校验工作的时候,他就有很多限制的,这个PPT里面也有啊,就是我之前跟跟这个。跟他聊天。他也说了,这个检查功能太弱啊。就是。然后以前那个同事,我对我对这个工具用的不多啊,我可能。可能那个。对比它的那个。到底谁优谁劣就有大家评判就是,但是你可以有有一个就是那个IBA工具能够检检测,呃,不不,那个FIO和VDB起能够测试出来问题,我这个工具也能测出来,就刚才那原理你就知道,你只要错一个字己时可以检测出来,就我这里测能测试出来的问题,那个工具就不一定能测出来,因为我这个是无状态的,我写上面之后,后面随随时都可以校验,但是这个FL和VD被办起它不行。
138:05
还有限制,就是比如这个同事。嗯,也显示它连续运行,然后测试的时候要把存全部的存储挂掉,然后再重启呢,它就使用有很多限制,你如果要对比他们的优劣的话,你可以两个工具都各用一些,用熟了对比一下,看看到底谁的那个用的更方便。那实际盘不是一个L大小不是512字节四。这个参数里面就是这个参数,这个参数控制的这个参数,我输入的是1024上去这个从二到2048都可以啊,就是这个是上区数,表示我一个处包含了这么多上区,我就是在这个里。这个磁盘分分处的时候。画画画出它的大小的时候,固定画大小,我如果是一点那个杠S1.24,那就是这一个每一处就是512K 512K分,如果我这个参数输入的二,那这个这个每一处就是1K1K1K1K1K,那它它是变化的。
139:17
所以我问一下这个,呃,这个A的这个也可以测,这个就是我现现在把用这个工具写了一个文件出来之后,写了有零数据,有空洞有有非零数据,就是刚才那个有我现在通过奥传的目的端了之后。我用这个工具在对这个这个文件进行在目的端进行校验,然后如果没有提示它那个BUG00几,它就是说明他这个数据是传过去是准确的,就是没有丢,数据没有错,错误数据没有传错。这个就是不管是传输数据还是备份,这个都是一样的原理。就是这是一样的,就是我有一部分原数据,我有一个副本,然后这个原数据,这个副本是有这个原数据来的,我的目的是这个副本的数据应该跟原数据是一样的,那。
140:16
我用过工具来进行校验,就是因为这个原数据是用这个工具写进去的,我的副本的数据我用这个工具再校验。他有没有出错就出来。哎,那个刚才有一个。我我我问一下,就是说你最后落盘的时候是以醋为单位落盘的是吧?对对以盘的就是我被被上圈,所以你会先把那些处里面的每个LB的数据先准备好啊对对对就就就刚才这个这个这里面就是。讲准备好啊,这里是在八分里面的,这个这里我现在。一个buff就是这么大,就是1.24上区的一个buff大,然后构造了第一处的数据,然后把它空配空配空妹妹空配空配,把它数据全部准备好,这是一处512K一次写下去。
141:13
然后我写下一处的时候,就是把这个数据这一个上区里面的这个就出对,然后弄一个新的出来,然后这些数据没改,这个数据也是出对,然后进去这前面后面的这个,然后这个这个这个碳会变啊,就是这个这个碳记录每一次IO落盘的那个时间。然后这个其他的这个这个魔术啊,这些不会变,然后这个会变。嗯,就是我这复制的这个数据,这个这个这个数据都不会变,然后这再写下,就第二个L,第三个第四个L一起写写,就全部是一条链。就是一处一处的这个呃落盘,但是它有一个功能,就由随机拆分的那个功能,它会随机的白棋IO进行拆分,这个是一个高级功能,这个就是如果我们把这个功能关掉了,那它就是一处一处的一个落盘的,就512K 512K,或者你输入一个杠S2,那就是1K1K的磨盘。
142:12
你就杠S2048,那就是一兆一兆的落盘,就是根据你这个参数大小,它的这个处。就是一处一处的落盘,如果没有开启这个功能的话,如果开启的功能,它有25%的概率会把一个L拆分成两个L落盘,这个就为了测这个存储形在里面的这个IO合并功能。就是我们的。这个合并的。我为了测这个功能就是开发啊,这个功能就这这这是Q2.0的这个代码,这个就是这个外头2K。你一批一批的息发那个lo嘛,它lo发现相邻的lo能够合并的话,它就会进行合并,它会把合并的lo一次提交就多个O合并成一个L提交,但是它这个合并算法有bug,我那个功能就为了测这个bug,嗯,这能够测类似的这种情况。
143:08
你你去可以看这个2.0的这个代码和2.1的这个代码里面,它这里这个这里会有一个bug修改的,你可以看它可以测试这里面的这个。这个合并IO合并功能存在bug,为什么用来拆IO?25%的概率来就是因为类似于测试。存储协议站里面的这些功能就是IO合并功能。还有其他问题。嗯。啊,张老师你好,我我有一个问题。嗯。就是那个数据校验这块我没有太听懂,能再讲一下吗?就是啊,到到时候我把这个视频发出来,那个另外录了频,把视频发出来。
144:02
就是那么主体思想就是我写数据的时候构造这个链。校验的时候,对你校验的时候。这个链就是有向前向后。校验的时候是读这个数据,对一处一处的,我我比如我现在这个数据是嗯,我第一处读出来了这个数据,嗯,我把这一处里面的这每一扇区就假设1024扇区,我把这1024扇区的数据读出来了。然后我第二处它的不是有那个LBA1指向下一个L嘛,是吧,就指向一处,对把下一处的L。嗯,那个读出来了,那它上一处和下一处的之间,它哪些数据是应该相同的,是不是这一部分数据,这两个箭头之间的数据是不是应该相同。是吧,那我就把这一部分的数据会没compare,嗯,这一部分的数据也没compare,这里的数据它都是相同的,这个是魔术,这个相同这个F,这个这个time的时间是不不相同的,因为这是前一个L,这后一个L和time的数据不一样的,这这很多数据都是相同的,我我可以。
145:16
检测前后,还有后后后后就是后面99个L这种。这构造这个链条都都可以进行。进行自动检测,这是两个IO之间的自动校验,一个IO之间的扇区,那就是面面空片,然后再加上它的序号。做校验,嗯呃,那我们每次校验,每次校验的时候,比如我取出来DM跟IO了,我会把DM和M加一个验,我然后然后再读一个M加二的就会是,如果它两个验没问题了,那就M加一和M加校验。
146:01
就是两个相邻L一直在校验。哦,只是两对,正是校验。嗯。这个是。这个是触间校验,就是这个链条里面就是上面的。是这个链条,一个链条,链条与链条之间就一个处,一个处间的校验,还有处内校验。然后这个所有处整个组组成的这个链条,就是这个上升一直到末尾的就是一个现成的所有数据,就是线成交。嗯,这个这个整个现成的就是我从第一个开始一直一直下一个下一个下下下下下下,就是就是一直这样下去,就是是一个强双向面表,这个强项,双面表就是这个东西。这个指向下一个,这个指下两个,那指下三个这个,最后这个指向下99个,这个过的话,这个链条就不能断,你断掉了。
147:01
就就出问题了,就是数据出错了,因为我写下去就是这个规律,我读上来我再校验,应该也是这个规律,但是你这个数据只要错一个字节,就把这个规律打乱了。那那我们这个全局的bitma和每个县群的bit在哪呀?啊,这个是在内存里面,在内存里面的。就是那如果你你这个不是是无状态,那我下次只读校验的话,应该得读这个那个bit map是用于随机校验的。我下次起来的是进行全盘校验,它不需要那个map。那个是用于随机校验的时候要这个bma,你看随机校验的时候才要这个bma,我我这个。批量校验也不要这个。全盘校验不需要被卖,我只要读出第一个,哎,这个数据是我就以刚才那个列表的一直往下校验就行。那个那个是用随机校验,就是我现在说号线程我写了哪些数据,我号线把写的那些数据我随机挑几个上来中间。
148:14
根本没进。听不到吗?可以听到吗?喂。能听到。哦,那个我的耳机有问题,只是那个。用于随机校验的,就是我现在这个全局校验,不需要不我那个。我要批量这验不需要这样吗?我就我在写一批的数据的时候,我把投的这个这个IPA地址我记住,然后我在写下一批的候,我就把这个记住的地址往下校验,校验这一批它的个数我也记录记住,用变量记下来,然后我就的这个这iba地址把它记下来就。
149:04
在这个写50个。在这他写之前,我先把这个。这个记录的iba地址和它长度我交验一下就行了,不需要别人map货,就是全局的,也不需要卖随机的,那不那个批量的不必需要这卖,只有这个随机校验,它需要批量卖货,因为我随机校验。我这些地方哪些地方写的,哪些地方没写,我不知道哪些地方是我这个线程写的和是其他线程写的,我我也不知道,如果我不用map记录的话,我就不知道这信息,我要这个线程随机校验是我要检验我自己这个线程写的一些随随机数据。那我这个随机线程,就是我这个我这个线程我写了哪些数据,我写这个数据,那我机个变卖,我写这个数据,这我写了这个数据就能就能卖货,那我写了一些数据了,那我要随机校验,那我只校验我这个线程写的数据,哪些线程写了呢?就这些位置都是。
150:08
可能是别的线程写的,可能是还没有写的,那我读出来校验,那肯定会出错了是吧?那我只能校验我这个线程已经写入的数据,哦,那线程写的,我现在这个线程这个数据是我写的,那我把这个线程这个数据给它读出来,就是黄色的部分。我就把它黄色的这些部分给它读出来,进行校验一下,那就十之间。嗯。藏起来的,哎,我还有个问题,就是我们这个设计的时候,为什么前项的指针设计。定了十个后项的是99个,这个是根据什么定的吗?啊,这个前项校验的话没有这么重要,就是我只要知道我这个L的前几个是L,知道构造这个链表,你可以设计,你就比如这是110个,我55个向后,55个向前也可以,因为我主要的构造的是向后链表,就把这个磁盘给后写完,我主要的是要把后面的这个。
151:05
数据我要知道,我我知道第一个L,我要知道第二个L,我知道第三个,我要知道第1万个L,嗯,我后向后的更重要,我要把所有的磁盘数据写完嘛,是吧,那我这个数组分的更多,就是分100个,那我前一项的我知道的一个L,我前项的一个L是。我只分了十个这个那个字段来,就一个数组,十个字段,嗯,40个字节。来来记录这个信息,你可以用这个命令,可以看这个结构,就是这个杠子的这个杠L,它就会把这个。这个这个这个扇区这很多扇区这个点点点啊。组成的一个处,这很多处珍珠组成的一个磁盘就是这个,然后。
152:02
这个数据的这个布局,这个数据布局其实就是这一扇区的布局,这个HF它的偏移,它的长度偏移是零四个之间,然后这magic这个魔术偏移是四个字节,四第四个字节的位置以零开始计数啊。第四个字节的位置长度是四个字节,这个向前的只是十个,一个数组是十个元素,每个元素是四个字节,十个元素四四个字节,它的偏移是第八个字节。你就可以看,然后这100个就是在48的位置,总共有。嗯,400个字节,然后这个碳的这个是在这个片移个位置,有16个字节,然后这个四个字节,这两个字节,这两个字就是。这个其实就是这个扇区,这整个五百一十二五之间的数据。然后就你把它复制复制复制复制复制就组成了一个。处,然后这个处,这个处里面的所有扇区,只有这两个字节的数据不一样。
153:05
这个就是。第零上去这是零,这第一上去第一这是DN上去这那这第一零。二三个线圈就是那就1024个线圈组成一个处。然后我校验数据的时候就就。就是这个数据应该是一样的,你如果不一样了,这中间导致。第50个。这里面的数据跟前面的数据不一样,那这里的数据就可能就出错了,你难免习惯了,你要就查存储查的这个是,那就找原因了来查。嗯。谢谢。哎,还有其他问题吗?两个半小时。有问题你好,我有一个问题就是我想知道,就是当出现数据专员不一致的情况下,那都是你的问题,是磁盘的问题,还是OS的问题,还是对对就就是要查,我只是告诉你,我这个工具测出来,就是你这个存储或者你这个文件系统,或者这个已经出错了,数据出错了,而且我告诉你具体的位置。
154:16
那个位置就是比如我现在。就这这里。我现在出错,告诉你具体的位置,在这个位置。我一定告诉你,这个位置是一个逻辑快递址啊,是一个上区号,你要乘以512是它真正的偏移地址。我就告诉你具体位置,然后至于为啥这个数据,这个文件或者是要存储出错了,那就要在存储端去查了,因为你比如这里这么多问题,测出这么多问题,这个都是这个存储丢失啊,数据丢啊,损坏啊什么,那我现在测出了问题,那我就是那个存储的人就来让我协助他了,然后让我告诉他一些信息,他的数据应该是什么样的啊,他出错在哪里,然后我这个存储的人就去查日志,去查内核查什么的那个,然后去解决,去看代码,嗯,找逻辑是什么原因导致的这个数据损坏,这个数据丢失,然后找到了这个原因,然后他解决了,那我们就。
155:16
来下一轮我继续测,然后又测出了一个问题,然后继续来,就是一直这样,就比如这这个啊,就比如这个Windows的这个,这个是隐藏一个很深的,这个我都给出来,我估计这个Windows微软的还不知道有这个bug,这个bug就是已经在好多客户那里测试这个问题了。别的这个存储就其他的厂商没测出这个问题,就是这个微软的这个这个这个S杠他给的时候就测试出来问题,而且不止一次,你我这列了就三次了。它的这个你要去复现,它也容易就把一个S杠一个慢映射到两个主机上。用裸盘的方式,我在一个主机上用那个保留锁加锁解锁加锁解锁,你隔夜段是一定的频率加锁解锁,然后另外一个浪在还是同一个浪啊,映射到两个主机上,另外一个主机上就用这个iba工具。
156:15
你测试测试的块大小要大于256K,大于等于这个256K,而且要用这个工具,这个是要改造了一下,就是稍微改造了一点,比如这个。嗯,Re try,它是出IO,出现了EIO它会重置,因为你加锁了之后,我去访问它就会出现EIO嘛,那个程序就会退出了,那我这里改了一点点代码,就是那个I读写的这个地方,如果出错了,我让他重试,如果就是你去在那个主机A主机上加锁解锁,加速解锁,加保留锁,解锁就是发这个指令,我在另外一个主机上就是用这个工具在测试,然后测这个罗盘,嗯,很快的时间就是几分钟或几秒钟,嗯,马上这个bug就出现了,但是你普通的读写这个问题很难出现。
157:10
很难实现,这个是就是2019年出现了,应该还比他更早,就是这个已经有三个客户出现了,然后那我们出现了这个问题,我们分析啊,可能是什么原因呢?这就已经分析了,从这个bug表中看,猜测是这Windows存储端的这个分片处理啊,这个加锁解锁这个逻辑之间配合有问题。然后导致了这个数据出错了,嗯,你看它本来是第一轮写4639,然后这个下下下这个这是4639的下一个L和下下一个L,下下一个L是4641,然后这里应该是一个44640的这个L,而且这个时间应该是八点晚上八点多的,但是它这里是个旧数据,这个数据返回出错了,我读出来的数据不错。
158:01
错了,就是因为就可能这里面逻辑有问题,那那个存储的那个研发,那去分析这个逻辑,嗯,发现了这个逻辑有问题呢,把它解决了,那我们继续再测,嗯。就是这样,就是这个工具是发现问题,协助存储,协助文件系统,协调OS,或者协助云计算,就是那个计算,或者这个在背那里面去看他的逻辑,看看他那个代码,嗯,哪里有问题把它解决了,然后继续测,就是一步步的,就是一直在这迭代迭代迭代,那你这个存储越来越健壮,越来越稳定,一直能够达到发布的那个那个标准了,发布的标准我们。这个SF的这个标准是这样的啊。他要用这个工具。测这个存储,这个存储会进行跑断电断网,把物理盘在IO路径关键路径支入故障。在做这些测试。这个工具不。
159:03
测出那个数据损坏,数据丢失,而且这个这个要连续测两周不出问题,你这个这个服务器一直在做这个测试,两周不出问题,你就达到了发布标准,如果你没有达到,就是这个,你看这个计时。这A类问题,它这个是即实际了运行了六天就出问题了,又跑出跑出了一个问题文件,系统发现那个触触重用了,就是一个数据块,这个被两个文件同时用L的节点引用了,那我写A文件的时候,那数据写到那个数据块了,我用一个B写B文件的时候,又把那个数据块给覆盖了。就是这个测出了这个文件系统的问题了,这个就是只跑了六天的时候就出问题了。这个就问题是我查。就是这样,就是这么多。
160:02
就是测出了这么多,这个只是只是三年之间啊,就是从2020年到只是到到6月25号的。嗯,如果在这个时间后面还有一些问题,所以我经历了数据损坏,我们成千成千了,所以这个。这个算法可以告诉大家。但是。你你要有这个经验,就处理这个损坏的经验,各种奇奇怪怪的损坏,就刚才这个损坏就已经很奇怪了,还有这个这个错位一个字节的也很奇怪。嗯,然后各种各样的奇怪的,然后你对着你的代码的逻辑那个那个算法那不断的优化,所以他才会那个工具。能够越来越强大,你没有经历过这个这个。这么多这个事例,这个损坏的事例,你单单看就把那个代码,我我有同事可能在新行,就是以前的同事,他就单单去看那个代码,他一定他不一定能够理解,完全100%的理解,可能能理解20%为啥要这样写,那就就是因为有这个这样各种视力,这种损坏的视力,嗯,优化的结果。
161:11
就比如。这里面有两个,嗯,有个这个东西。你第一个就加锁复制,我测了第一次这个磁盘的,我运行这些文件,我在这里暂停状态,我再去运行它。他是不让我再运行的。但是加了之这个这个单立锁的,就这个,我现在测这个工具在暂停状态,这个文件被打开了是吧,那我我现在我再次来,他不让你打开了,看见没有,这就为了让你。为为为了防止你误操作,就是一个文件多个写啊,第一个是。加锁复制一个就是文件系统挂载我一个磁盘,就假设一个sda盘。
162:02
就是DVD。假设这里这里有个布载分区,这个SDR,这个分区已经有磁盘了,而且挂载了,我现在用这个工具去测这个SD是测不了的,它会提示错的。那我用这个来。做为了安全。现在。现在去测这个V啊,它会检测发现。发现挂载了,他不让你测听busy。这是第二个安全。第三个安全就是跨主机的,就是我一个浪弄给两个主机,两个主机对同一个。让进行写的话,这个没办法加锁嘛,是吧,因为他是,嗯,除非加那个保留锁,你如果不加那个保留锁的话。
163:02
我我在写这个磁盘,你不知道你写那个磁盘,我不知道,这两个工具同时在变工具同时对这个磁盘进行写的话,那就很可能产生乌龙,嗯,这个一个方法就是通过。通过一个这个就是唯一性标识加时间戳,因为唯一性标识就是这个。这个维维心标识,它是这个。这个维心标识我测的一轮里,这个维心标识一直不变的,但是这个是变的,这个是每一个线程的都不一样,它每测一轮它都都在变,都在变,这这个不会变,这个不会变,然后再加上时间戳我就知道,如果我一个工具。那就是一个一个,那被两个工具同时写了,我就知道它有两种数据。而且它的这个唯一性标识有两个,那我就知道有两个人在写啊,而且是画主基的写,因为你是同组级别,你是写不了的,我都已经做了限制了,就是刚才这样。
164:05
我都已经让你不能写了。因为他是在这个。这上面加了,你看加了这个水文性水。那到文件所要复制的,它是让你运行起来的。嗯,在同一台主机上对一个磁盘,对一个文件,你是没办法用两个同时写的,但是可以同时写的就是跨主机,那我们就用这个唯一性标识来进行区分,然后如果测试这种的话,发现你的数据损坏了,是因为这种原因。导致的,那我们也可以很很容易的区别区分出来。就分出是因为以前有有同事,就是搞出了好多这种人,花了好多力气就查查半天翻译。乌龙,所以这样了,这个功能就可以很快的识别出来。
165:02
哎,还要操你妈。那今天要不要,要不就到这快三小时了。这其实很多地方没有深入的地方,就就是这个举例子的话,也是举一些典型的例子,还有好多例子举。这个查了三周时间,为了这个事情,而且是两个最严,自身的研发刚好在新冠疫情期间。出现了,那个时候成天就查这个问题,两个人都在家,他打电话。就查到问题报好到一起发现是那个Q进。嗯。你本来就是这里面好多个经典例子,但是没有保留啊,就是这些信息。他已经离职了,已经反馈掉了信息,就只有这几张截图,嗯。
166:08
其实不止400多个,这个有上千个,那只那个这个数据只记录到。202209。所以这个存储开发,这个存储能够商用。用这个工具为了这个产品节约了多少钱?节约了多少人力?大家听。计算一下。嗯。那今天就先到这里,嗯,那个如果有问题的话,可以在那个群里。发一下,到时候有时间的时候我再回复一下好吧。如果就是大家觉得用的好的话,就帮忙啊,朋友啊,同事啊,就是可推广一下,如果你就是也不是说推广,就介绍一下,就说也可以,嗯。减少自己大家的这个。
167:01
嗯,这个这个工作效就是提高大家的工作效率也可以,嗯,尽快的发现这些应用场景的这个问题,节约成本。如果有厂商,有公司觉得这个好用,就是能够呃对公司的产品稳定性能起到很大的作用,能够降稳定效,节约研发成本啊,有需要也需要全套的这个这个这个工具,就刚才讲的那个O,那个全全套的O,比如那个信创的。有这种需求的可以联系我这个微信啊,或者其他的方式联系我。那个,但是这个就是如果是商用的话,这个。可能会收点收一些费用啊,但是如果特殊问题的话,我在周末或者这个。个人的工作非工作时间啊,可以提供支持,就帮这个你存储测试的问题啊,我就帮助给你帮你查这个存储的问题。你测出那个虚拟机,嗯,热线一出问题了,这个车就是帮着查那个问题,就是可以提供技术支持,但是那嗯有定限制,就次数限制或者这种不可能我工作之外就花太多精力可做这方面的继续支持,只能用一些周末时间之类可以提供,但是这这这种到是说都收点费用啊,这个就是。
168:27
重点。那就今天就先结束了啊,嗯,谢谢大家。
我来说两句