作业
本节引入 raid.py,这是一个简单的 RAID 模拟器,你可以使用它来增强你对 RAID 系统工作方式的了解。 详情请参阅 README 文件。
38.1
问题描述
使用模拟器执行一些基本的 RAID 映射测试。运行不同的级别(0、1、4、5),看看你是否可以找出一组请求的映射。 对于 RAID-5,看看你是否可以找出左对称(left- symmetric)和左不对称(left-asymmetric)布局之间的区别。 使用一些不同的随机种子,产生不同于上面的问题。
解答
RAID-0
运行指令:python2 raid.py -n 3 -L 1 -R 16 -s 1
...
LOGICAL READ from addr:13 size:4096
Physical reads/writes?
LOGICAL READ from addr:6 size:4096
Physical reads/writes?
LOGICAL READ from addr:8 size:4096
Physical reads/writes?
disk0 disk1 disk2 disk3
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:13 size:4096 read [disk 1, offset 3]
- LOGICAL READ from addr:6 size:4096 read [disk 2, offset 1]
- LOGICAL READ from addr:8 size:4096 read [disk 0, offset 2]
加-c标志后验证正确
RAID-1
运行命令:python2 raid.py -n 3 -L 1 -R 16 -s 1
...
LOGICAL READ from addr:2 size:4096
Physical reads/writes?
LOGICAL READ from addr:12 size:4096
Physical reads/writes?
LOGICAL READ from addr:7 size:4096
Physical reads/writes?
disk0 disk1 disk2 disk3
0 0 1 1
2 2 3 3
4 4 5 5
6 6 7 7
8 8 9 9
10 10 11 11
12 12 13 13
14 14 15 15
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:2 size:4096 read [disk 1, offset 1]
- LOGICAL READ from addr:12 size:4096 read [disk 0, offset 6]
- LOGICAL READ from addr:7 size:4096 read [disk 3, offset 3]
加-c标志后验证正确
RAID-4
运行命令:python2 raid.py -n 3 -L 4 -R 16 -s 2
...
LOGICAL READ from addr:15 size:4096
Physical reads/writes?
LOGICAL READ from addr:0 size:4096
Physical reads/writes?
LOGICAL READ from addr:13 size:4096
Physical reads/writes?
disk0 disk1 disk2 disk3
0 1 2 P
3 4 5 P
6 7 8 P
9 10 11 P
12 13 14 P
15 16 17 P
disk、offset均从0开始计数,disk3用作奇偶校验磁盘,查表不难得出
- LOGICAL READ from addr:15 size:4096 read [disk 0, offset 5]
- LOGICAL READ from addr:0 size:4096 read [disk 0, offset 0]
- LOGICAL READ from addr:13 size:4096 read [disk 1, offset 4]
加-c标志后验证正确
对于 RAID 5 我们采用顺序读的方式找出左对称(left- symmetric)和左不对称(left-asymmetric)布局之间的区别。
RAID-5
左对称
输入命令:python2 raid.py -n 18 -L 5 -5 LS -W seq -s 3 -c
...
LOGICAL READ from addr:0 size:4096
read [disk 0, offset 0]
LOGICAL READ from addr:1 size:4096
read [disk 1, offset 0]
LOGICAL READ from addr:2 size:4096
read [disk 2, offset 0]
LOGICAL READ from addr:3 size:4096
read [disk 3, offset 1]
LOGICAL READ from addr:4 size:4096
read [disk 0, offset 1]
LOGICAL READ from addr:5 size:4096
read [disk 1, offset 1]
LOGICAL READ from addr:6 size:4096
read [disk 2, offset 2]
LOGICAL READ from addr:7 size:4096
read [disk 3, offset 2]
LOGICAL READ from addr:8 size:4096
read [disk 0, offset 2]
LOGICAL READ from addr:9 size:4096
read [disk 1, offset 3]
LOGICAL READ from addr:10 size:4096
read [disk 2, offset 3]
LOGICAL READ from addr:11 size:4096
read [disk 3, offset 3]
LOGICAL READ from addr:12 size:4096
read [disk 0, offset 4]
LOGICAL READ from addr:13 size:4096
read [disk 1, offset 4]
LOGICAL READ from addr:14 size:4096
read [disk 2, offset 4]
LOGICAL READ from addr:15 size:4096
read [disk 3, offset 5]
LOGICAL READ from addr:16 size:4096
read [disk 0, offset 5]
LOGICAL READ from addr:17 size:4096
read [disk 1, offset 5]
易知左对称布局如下:
disk0 disk1 disk2 disk3
0 1 2 P
4 5 P 3
8 P 6 7
P 9 10 11
12 13 14 P
16 17 P 15
左不对称
左不对称参数 -5 LA
,输入命令:python2 raid.py -n 18 -L 5 -5 LA -W seq -s 3 -c
...
LOGICAL READ from addr:0 size:4096
read [disk 0, offset 0]
LOGICAL READ from addr:1 size:4096
read [disk 1, offset 0]
LOGICAL READ from addr:2 size:4096
read [disk 2, offset 0]
LOGICAL READ from addr:3 size:4096
read [disk 0, offset 1]
LOGICAL READ from addr:4 size:4096
read [disk 1, offset 1]
LOGICAL READ from addr:5 size:4096
read [disk 3, offset 1]
LOGICAL READ from addr:6 size:4096
read [disk 0, offset 2]
LOGICAL READ from addr:7 size:4096
read [disk 2, offset 2]
LOGICAL READ from addr:8 size:4096
read [disk 3, offset 2]
LOGICAL READ from addr:9 size:4096
read [disk 1, offset 3]
LOGICAL READ from addr:10 size:4096
read [disk 2, offset 3]
LOGICAL READ from addr:11 size:4096
read [disk 3, offset 3]
LOGICAL READ from addr:12 size:4096
read [disk 0, offset 4]
LOGICAL READ from addr:13 size:4096
read [disk 1, offset 4]
LOGICAL READ from addr:14 size:4096
read [disk 2, offset 4]
LOGICAL READ from addr:15 size:4096
read [disk 0, offset 5]
LOGICAL READ from addr:16 size:4096
read [disk 1, offset 5]
LOGICAL READ from addr:17 size:4096
read [disk 3, offset 5]
易知左不对称布局如下:
disk0 disk1 disk2 disk3
0 1 2 P
3 4 P 5
6 P 7 8
P 9 10 11
12 13 14 P
15 16 P 17
加-c标志验证后正确
38.2
问题描述
与第一个问题一样,但这次使用 -C 来改变块的大小。大块的大小如何改变映射?
解答
把大块的大小由原来的4096乘以2变成8192。
RAID-0
输入命令:python2 raid.py -n 3 -L 0 -R 16 -s 0 -C 8K
结果如下:
...
LOGICAL READ from addr:13 size:4096
Physical reads/writes?
LOGICAL READ from addr:6 size:4096
Physical reads/writes?
LOGICAL READ from addr:8 size:4096
Physical reads/writes?
disk0 disk1 disk2 disk3
0 2 4 6
1 3 5 7
8 10 12 14
9 11 13 15
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:13 size:4096 read [disk 2, offset 3]
- LOGICAL READ from addr:6 size:4096 read [disk 3, offset 0]
- LOGICAL READ from addr:8 size:4096 read [disk 0, offset 2]
RAID-1
输入命令:python2 raid.py -n 3 -L 1 -R 16 -s 1 -C 8K
...
LOGICAL READ from addr:2 size:4096
Physical reads/writes?
LOGICAL READ from addr:12 size:4096
Physical reads/writes?
LOGICAL READ from addr:7 size:4096
Physical reads/writes?
disk0 disk1 disk2 disk3
0 0 2 2
1 1 3 3
4 4 6 6
5 5 7 7
8 8 10 10
9 9 11 11
12 12 14 14
13 13 15 15
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:2 size:4096 read [disk 2, offset 0]
- LOGICAL READ from addr:12 size:4096 read [disk 0, offset 6]
- LOGICAL READ from addr:7 size:4096 read [disk 3, offset 3]
RAID-4
输入命令:python2 raid.py -n 3 -L 4 -R 16 -s 2 -C 8
...
LOGICAL READ from addr:15 size:4096
Physical reads/writes?
LOGICAL READ from addr:0 size:4096
Physical reads/writes?
LOGICAL READ from addr:13 size:4096
Physical reads/writes?
disk0 disk1 disk2 disk3
0 2 4 P
1 3 5 P
6 8 10 P
7 9 11 P
12 14 16 P
13 15 17 P
disk、offset均从0开始计数,disk3用作奇偶校验磁盘,查表不难得出
- LOGICAL READ from addr:15 size:4096 read [disk 1, offset 5]
- LOGICAL READ from addr:0 size:4096 read [disk 0, offset 0]
- LOGICAL READ from addr:13 size:4096 read [disk 0, offset 5]
RAID-5
输入命令:python2 raid.py -n 3 -L 5 -5 LS -R 16 -s 3 -C 8K
...
LOGICAL READ from addr:3 size:4096
Physical reads/writes?
LOGICAL READ from addr:5 size:4096
Physical reads/writes?
LOGICAL READ from addr:10 size:4096
Physical reads/writes?
disk0 disk1 disk2 disk3
0 2 4 P
1 3 5 P
8 10 P 6
9 11 P 7
16 P 12 14
17 P 13 15
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:3 size:4096 read [disk 1, offset 1]
- LOGICAL READ from addr:5 size:4096 read [disk 2, offset 1]
- LOGICAL READ from addr:10 size:4096 read [disk 1, offset 2]
RAID 5 LA
运行命令:python2 raid.py -n 3 -L 5 -5 LA -R 16 -s 3 -C 8K
...
LOGICAL READ from addr:3 size:4096
Physical reads/writes?
LOGICAL READ from addr:5 size:4096
Physical reads/writes?
LOGICAL READ from addr:10 size:4096
Physical reads/writes?
disk0 disk1 disk2 disk3
0 2 4 P
1 3 5 P
6 8 P 10
7 9 P 11
12 P 14 16
13 P 15 17
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:3 size:4096 read [disk 1, offset 1]
- LOGICAL READ from addr:5 size:4096 read [disk 2, offset 1]
- LOGICAL READ from addr:10 size:4096 read [disk 3, offset 2]
加-c标志经验证,答案都正确。
38.3
问题描述
执行上述测试,但使用 r 标志来反转每个问题的性质。
解答
就是说用-r标志,使得问题反转,之前是告诉逻辑地址,求物理地址;现在是告诉物理地址,求逻辑地址。
RAID0-0
输入命令:python2 raid.py -n 3 -L 0 -R 16 -s 0 -r
...
LOGICAL OPERATION is ?
read [disk 1, offset 3]
LOGICAL OPERATION is ?
read [disk 2, offset 1]
LOGICAL OPERATION is ?
read [disk 0, offset 2]
disk0 disk1 disk2 disk3
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:13 size:4096 read [disk 1, offset 3]
- LOGICAL READ from addr:6 size:4096 read [disk 2, offset 1]
- LOGICAL READ from addr:8 size:4096 read [disk 0, offset 2]
RAID-1
输入命令:python2 raid.py -n 3 -L 1 -R 16 -s 1 -r
...
LOGICAL OPERATION is ?
read [disk 1, offset 1]
LOGICAL OPERATION is ?
read [disk 0, offset 6]
LOGICAL OPERATION is ?
read [disk 3, offset 3]
disk0 disk1 disk2 disk3
0 0 1 1
2 2 3 3
4 4 5 5
6 6 7 7
8 8 9 9
10 10 11 11
12 12 13 13
14 14 15 15
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:2 size:4096 read [disk 1, offset 1]
- LOGICAL READ from addr:12 size:4096 read [disk 0, offset 6]
- LOGICAL READ from addr:7 size:4096 read [disk 3, offset 3]
RAID-4
输入命令:python2 raid.py -n 3 -L 4 -R 16 -s 2 -r
...
LOGICAL OPERATION is ?
read [disk 0, offset 5]
LOGICAL OPERATION is ?
read [disk 0, offset 0]
LOGICAL OPERATION is ?
read [disk 1, offset 4]
disk0 disk1 disk2 disk3
0 1 2 P
3 4 5 P
6 7 8 P
9 10 11 P
12 13 14 P
15 16 17 P
disk、offset均从0开始计数,disk3用作奇偶校验磁盘,查表不难得出
- LOGICAL READ from addr:15 size:4096 read [disk 0, offset 5]
- LOGICAL READ from addr:0 size:4096 read [disk 0, offset 0]
- LOGICAL READ from addr:13 size:4096 read [disk 1, offset 4]
RAID 5 LS
输入命令:python2 raid.py -n 3 -L 5 -5 LS -R 16 -s 3 -r
...
LOGICAL OPERATION is ?
read [disk 3, offset 1]
LOGICAL OPERATION is ?
read [disk 1, offset 1]
LOGICAL OPERATION is ?
read [disk 2, offset 3]
disk0 disk1 disk2 disk3
0 1 2 P
4 5 P 3
8 P 6 7
P 9 10 11
12 13 14 P
16 17 P 15
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:3 size:4096 read [disk 3, offset 1]
- LOGICAL READ from addr:5 size:4096 read [disk 1, offset 1]
- LOGICAL READ from addr:10 size:4096 read [disk 2, offset 3]
RAID 5 LA
输入命令:python2 raid.py -n 3 -L 5 -5 LA -R 16 -s 3 -r
...
LOGICAL OPERATION is ?
read [disk 0, offset 1]
LOGICAL OPERATION is ?
read [disk 3, offset 1]
LOGICAL OPERATION is ?
read [disk 2, offset 3]
disk0 disk1 disk2 disk3
0 1 2 P
3 4 P 5
6 P 7 8
P 9 10 11
12 13 14 P
15 16 P 17
disk、offset均从0开始计数,查表不难得出
- LOGICAL READ from addr:3 size:4096 read [disk 0, offset 1]
- LOGICAL READ from addr:5 size:4096 read [disk 3, offset 1]
- LOGICAL READ from addr:10 size:4096 read [disk 2, offset 3]
加-c标志经验证,答案都正确。
38.4
问题描述
现在使用反转标志,但用-S 标志增加每个请求的大小。尝试指定 8 KB、12 KB 和 16 KB 的大小,同时改变 RAID 级别。 当请求的大小增加时,底层 IO 模式会发生什么?请务必在顺序工作负载上尝试此操作(-W sequential)。 对于什么请求大小,RAID-4 和 RAID-5 的 I0 效率更高?
解答
用-S改变请求的大小,看看底层I/O模式会发生什么。
8k
8k的写请求,大块的大小是4k,所以会是连续写两个大块,相当于对地址和地址+1的请求。
RAID-0:python2 raid.py -R 30 -n 5 -L 0 -S 8k -w 100 -c
(-w 100是写请求)
显然,每次直接写入两个块,2次写操作。、
RAID-1:python2 raid.py -R 30 -n 5 -L 1 -S 8k -w 100 -c
可以看出,因为有镜像,每次写入两个块,以及它的镜像块,所以会有4次写操作。
RAID-4: python2 raid.py -R 30 -n 5 -L 4 -S 8k -w 100 -c
正常如果请求的大小跟块大小一样,应该要次先读地址对应的块,再读奇偶校验块,判断是否需要改变,然后再写入地址对应的块和校验块即可。但是请求大小为8k的话,其实是写入地址和地址+1的块,若两个块不连续,则需要两次上述的操作,需要8个I/O操作;若这两个块是连续的(偏移量一样),奇妙的事情发生了,例如第一个例子,要写25(还有26),如下图,只要读24即可,然后24跟需要写入的25、26进行异或运算可以算出奇偶校验块的值,就直接写入25、26和P,由原来的8个I/O操作减少到4个。
RAID-5: python2 raid.py -R 30 -n 5 -L 5 -S 8k -w 100 -c
12K
同理,RAID-0和RAID-1都是直接写入三个块,而RAID-4和RAID-5能用到上面说的连续块减少I/O操作的情况更频繁了。
python2 raid.py -R 30 -n 5 -L 0 -S 12k -w 100 -c
( -L 改变即可)
16K
与12K同理。
python2 raid.py -R 30 -n 5 -L 0 -S 16k -w 100 -c
( -L 改变即可)
结果类似,省略
当请求大小为16k时,RAID-4和RAID-5效率更高。因为连续的写入4个块,能更多地用到上述的连续块节省I/O的方法。
RAID比较
最后附上各级RAID在容量、可靠性和性能上的对比。
RAID 0是后面几种策略的基础,这里重点讨论RAID 1与RAID 4/5,当磁盘请求较少的情况下,这几种策略没有较大的差别,在请求数据量增大时,对于RAID 1考虑单个磁盘,它在接收一个请求之后,每个磁盘都会接收到每个其他块的请求。其在跳过的块上旋转时,不会为客户提供有用的带宽。因此,每个磁盘只能提供一半的峰值带宽;而相比RAID 1,RAID 4/5在请求较大时效率更高,一般超过一半峰值带宽。
38.5
问题描述
使用模拟器的定时模式(-t)来估计 100 次随机读取到 RAID 的性能,同时改变 RAID 级别,使用 4 个磁盘。
解答
RAID-0
输入命令:python2 raid.py -L 0 -t -n 100 -c -D 4
总时间为275.7
RAID-1
输入命令:python2 raid.py -n 100 -D 4 -t -L 1 -c
总时间为278.7
RAID-4
输入命令: python2 raid.py -n 100 -D 4 -t -L 4 -c
总时间为386.1
RAID-5
输入命令: python2 raid.py -n 100 -D 4 -t -L 5 -c
总时间为276.7
通过比较可以发现,RAID 0、RAID 1、RAID 5的耗时基本一致,而 RAID 4 耗时较长,约为前三者的1.38倍。又观察到 RAID 4 的disk3始终处于空闲状态,没有处理读取请求,这是因为disk3是奇偶校验磁盘。
我们知道RAID 0、RAID 1、RAID 5的随机读吞吐量均为N·R,而 RAID 4 的随机读吞吐量为(N-1)·R,本题中N=4,4/3=1.33,与实验数据基本相符。