RAID란 Redundant Array of Inexpensive Disks의 약자로,
상대적으로 저렴한 디스크 여러개를 사용하여 하나의 fake logical disk를 구성하는 방식이다.
RAID는 capacity, reliability, performance의 3가지 척도로 성능을 평가할 수 있다.
이때 capacity는 "응용이 얼마나 넓은 공간을 사용할 수 있는가?",
reliability는 "몇개의 disk의 데이터를 잃어도 문제없는가?",
performance는 "각각의 workload에 따른 속도가 어떠한가?"를 의미한다.
아래 예시에서 사용할 기호는 다음과 같다.
N = 디스크 개수
C = 디스크 1개의 용량
S = 디스크 1개가 sequential workload를 받을 때의 처리량 (MB/s)
R = 디스크 1개가 random workload를 받을 때의 처리량 (MB/s)
D = I/O 1번의 latency (왕복 시간)
RAID는 레벨에 따라 RAID - 0에서 RAID - 6까지 나뉜다.
▶ RAID - 0 (Striping)
logical block들을 2개의 디스크에 앞에서부터 번갈아 담는 방식이다.
예를 들어 logical block 0 ~ 7이 있다면,
0, 2, 4, 6번 block은 disk0에, 1, 3, 5, 6번 block은 disk1에 저장된다.
물론 block 1개를 기준으로 번갈아 저장할 수도 있지만,
일반적으로는 여러 blocks 단위로 하고, 이를 stripe unit size(= chunk size)라 한다.
stripe unit 하나를 하나의 disk에만 딱 저장하고 끝이기 때문에 그 disk가 고장나면 끝장이다.
disk들을 가로로 나열했을 때 chunk들 한 행을 stripe이라 한다.
disk 번호 = stripe 번호 % disk 개수
offset = stripe 번호 / disk 개수
| Capacity | N * C |
| Reliability (disk를 몇번 잃어도 되는지) | 0 |
| Latency | D |
| Sequential Throughput | N * S |
| Random Throughput | N * R |
throughput이 1초당 처리량이기 때문에 여러 디스크로 동시에 처리할 수 있는 RAID에서는
N * (1초당 처리량)의 계산식이 나오게 된다.
더 많은 디스크를 사용할 수록, 처리량은 증가하는 효과를 볼 수 있지만
latency는 변함없이 D의 값을 갖는다.
▶ RAID - 1 (Mirroring)
한 disk의 복사본을 다른 한 disk에 보관하는 방식이다.
예를 들어 0 ~ 7번 logical block이 있다면,
0, 2, 4, 6번 block을 disk0과 disk1에 동일하게 보관하고,
1, 3, 5, 7번 block을 disk2와 disk3에 동일하게 보관한다.
그럼 모든 logical block이 백업본을 하나씩 갖게 되는 셈이다.
| Capacity | N/2 * C |
| Reliability (disk를 몇번 잃어도 되는지) | 1 |
| Latency | D |
| Sequential Throughput - read | N/2 * S |
| Sequential Throughput - write | N/2 * S |
| Random Throughput - read | N * R |
| Random Throughput - write | N/2 * R |
Sequential Throughput - read 는 disk0의 입장이 되어보자.
순차적으로 0 ~ 7번 block을 읽는데, 각 block의 두 복사본을 번갈아 읽는 상황을 고려하면,
disk0은 0번과 4번 block에 대한 읽기 요청을 받게 된다.
0번과 4번 이 두 block은 disk 상에서 서로 떨어져 있기 때문에 disk0은 0번 block을 읽은 후 4번 block으로 가기 위해
회전해야한다.
그래서 disk0의 최대 처리량 N * S의 절반인 N/2 * S이 된다고 한다.
(이해가 안됨. 회전하는 시간을 고려하는게 /2로 표현되는게 납득이 안됨..)
Sequential Throughput - write 은 단순하게 하나의 block을 두 disk에 기록해야 하기 때문에 절반이 되었다. workload의 입장에서 생각해야 하는데, RAID - 0에서는 4명이 3의 속도로 일을 해주면 결과적으로 12의 속도로 쌓인 일들이 처리되던 것이,
RAID - 1로 와서 2명씩 같은 일을 잡고 있으니 절반으로 줄어든 것이다.
Random Throughput - read 의 경우 모든 disk에 다 읽기를 요청할 수 있기 때문에 최대 대역폭과 같은 값이다.
Random Throughput - write의 경우도 sequential과 마찬가지로 2명씩 짝지어 같은 일을 하고 있으니 1초당 해결되는 block read(or write) 양이 절반으로 줄었다고 이해하면 된다.
▶ RAID - 4 (Parity Disk 사용)
각 disk에서 block내 bit 단위로 XOR 연산을 해서 parity disk의 block 내에 bit 단위로 적어두는 방식이다.
데이터가 오염되었는지 판단이 가능하다.
| Capacity | (N - 1) * C |
| Reliability (disk를 몇번 잃어도 되는지) | 1 |
| Latency - read | D |
| Latency - write | 2 * D |
| Sequential Throughput - read | (N - 1) * S |
| Sequential Throughput - write | (N - 1) * S |
| Random Throughput - read | (N - 1) * R |
| Random Throughput - write | R / 2 |
Latency - write가 2배가 된 이유는 패리티 디스크와 데이터 디스크를 모두 읽어(병렬적으로), 모두 써야하기(병렬적으로) 때문이다. 두 디스크를 동시에 읽는데에 D, 동시에 쓰는데에 D로 총 2 * D다.
구체적으로는 아래와 같은 식에 의해 write에 대해 두 종류 디스크를 업데이트하게 된다.
Parity bit(new) = (Data bit(old) ^ Data bit(new)) ^ Parity bit(old)
Sequential Throughput - write의 경우, sequential workload는 크기가 큰 데이터기 때문에 stripe 하나를 이루는 각각의 disk들을 모두 write하는 상황을 고려하면 된다. 새로 쓰는 block에 맞추어 패리티디스크도 같이 write해주면 된다. throughput은 (N - 1)개의 disk가 일을 하기 때문에 (N - 1) * S가 된다.
Random Throughput - write는 subtractive parity 방식으로 쓰는 경우를 기준으로 하는데, 여러 데이터 디스크에 대한 write 요청이 RAID에 들어올 경우, 패리티 디스크에는 병목 현상이 생기게 된다. (이를 "small - write 문제" 라 한다.)
따라서 병목 현상이 생긴 패리티 디스크를 기준으로 throughput을 생각하면 되고, 위 식에 따라 read 와 write를 한번씩 수행하므로 R / 2가 된다.
▶ RAID - 5 (순환 Parity)
RAID - 4와 거의 동일하다.
다만 parity disk를 전체 disk가 돌아가면서 맡는 방식이다.
따라서 랜덤 쓰기, Random Throughput - write을 제외하고는 성능 변화가 미미하다.
랜덤 쓰기는 병목현상이 완화되기 때문에 성능이 훨씬 좋아져서 N/4 * R MB/s가 된다.
4로 나누는 이유는 어쨌든 각 write마다 데이터 디스크와 패리티 디스크에 각각 읽기와 쓰기가 생기기 때문이라고 한다.
(잘 이해가 안된다)
하.. 아무리 서치하고 ostep 교재를 읽어도 잘 이해가 안된다..ㅜㅜ
좀 더 공부해보고 빨간 부분은 다시 서술해봐야 겠다.
'시스템' 카테고리의 다른 글
| [OS] Page size <-> offset, page 개수 계산하기 (0) | 2023.09.20 |
|---|---|
| [시스템 프로그래밍] exit / fork / wait / execve (1) | 2023.03.22 |
| [시스템 프로그래밍] error handling wrapper / pid / process states (0) | 2023.03.15 |
| [시스템 프로그래밍] Process와 Context Switching (0) | 2023.03.14 |
| [시스템 프로그래밍] Exceptional control flow의 종류 (0) | 2023.03.09 |