본문 바로가기

시스템

RAID(Redundant Array of Inexpensive Disk) 평가하기

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 교재를 읽어도 잘 이해가 안된다..ㅜㅜ

좀 더 공부해보고 빨간 부분은 다시 서술해봐야 겠다.