티스토리 뷰
[OS] Redundant Arrays of Inexpensive Disks(RAID) 알아보기 - OS 공부 26
Dev_Pingu 2021. 1. 30. 17:27안녕하세요 Pingu입니다!🐧
지난 글에서는 하드 디스크를 잘 동작하도록 관리하는 Hard Disk Drive에 대해 알아봤었습니다. 이번 글에서는 비교적 느린 디스크를 더 빠르게, 크기도 더 크게, 데이터의 신뢰성도 유지할 수 있도록 만들어주는 Redundant Arrays of Inexpensive Disks(RAID)에 대해 알아보려고 합니다. 제가 공부할 때 참고하고 있는 책인 OSTEP책 에선 Chapter 38 - Redundant Arrays of Inexpensive Disks(RAID) 부분 입니다!
Redundant Arrays of Inexpensice Disks (RAID)
더 빠른 디스크, 더 큰 용량을 가진 디스크, 데이터 신뢰도가 높은 디스크가 있다면 그 디스크를 사용하지 않을 이유가 있을까요? 이러한 디스크가 RAID입니다. RAID는 여러 개의 디스크를 함께 사용하여 빠르고, 크고, 안정적인 디스크 시스템을 구축하는 기술입니다. RAID를 외부에서 봤을 땐 그냥 일반적인 디스크로 보이지만 내부적으로는 여러개의 디스크, 메모리, 시스템 관리를 위한 한 개 이상의 프로세서로 구성되어있습니다.
RAID는 여러 개의 디스크를 사용한다고 했는데요, 이렇게 여러개의 디스크를 사용하면 단일 디스크를 사용할 때 보다 더 빠르게 작동하며 용량은 당연하게도 더 커지며 안정성도 향상시킬 수 있습니다. 용량이 커지는 것은 쉽게 이해가 되는데 속도와 안정성은 어떻게 더 좋아지는지 이번글에서 한 번 살펴보도록 하겠습니다. 물론 용량도 알아보긴 할거에요! 간단하게 짚고 넘어가자면 속도는 I/O 작업을 병렬로 처리하여 향상시키며 안정성은 여러개의 디스크에 분산하여 데이터를 저장하기 때문에 하나의 디스크가 고장 나더라도 문제없이 작동할 수 있게 됩니다.
이러한 장점을 지닌 RAID는 이러한 장점들을 투명하게 제공합니다. 아까 말한 대로 밖에서 보면 그냥 하나의 디스크처럼 보이는 것이죠. 그렇기 때문에 RAID를 교체할 때 OS나 기타 프로그램들을 수정하지 않아도 호환성 문제없이 작동됩니다. 그럼 이제 성능, 크기, 안정성이라는 장점을 가진 RAID가 어떻게 작동하는지 알아보도록 하겠습니다.
Interface And RAID Internals
파일 시스템 입장에서 RAID를 보면 그냥 빠르고, 크고 안정적인 디스크로 보입니다. RAID는 단일 디스크와 마찬가지로 블록들의 선형 배열로 구성되며 각 블록은 파일 시스템에서 읽거나 쓸 수 있습니다. 파일 시스템이 RAID에게 논리적 I/O 작업을 요청하면 RAID는 이를 처리해서 물리적 I/O를 반환합니다.
RAID 시스템은 종종 호스트에 대한 표준 연결과 함께 별도의 하드웨어 박스로 구축됩니다. 하지만 내부적으로는 RAID는 펌웨어를 실행하여 RAID 작동을 지시하는 마이크로 컨트롤러, DRAM과 같은 휘발성 메모리가 읽고 쓸 때 데이터 블록을 버퍼링 하는데 이는 지연 쓰기를 위한 것입니다. 물론 일부 경우에는 이러한 작업을 비 휘발성 메모리로도 작동합니다.
Fault Model
RAID를 이해하고 접근 방식들을 비교하기 위해선 fault model이라는 것을 알아야 합니다. RAID는 특정 종류의 디스크 오류를 감지하고 복구하도록 설계되었는데요, 예측 가능한 오류를 정확히 아는 것은 작업을 설계할 때 중요합니다.
첫 번째 fault model은 fail-stop이라고 합니다. 이는 디스크에는 working, failed라는 두 가지 상태만을 가지며 반드시 특정 시점에는 두 상태 중 하나의 상태라는 것을 보장합니다. Working 디스크를 사용하면 모든 블록을 읽거나 쓸 수 있지만 failed 디스크가 되면 디스크가 영구적으로 손실되었다고 생각합니다.
Fail-stop 모델의 중요한 측면 중 하나는 오류 감지에 대한 가정입니다. 이는 디스크에 문제가 발생하면 이를 쉽게 감지할 수 있다고 가정하는 건데요, 예를 들어 RAID Array에서 RAID 컨트롤러가 디스크 오류를 즉시 알 수 있다고 가정합니다.
따라서 아직은 디스크 손상과 같은 아무도 모르게 발생하는 오류에 대해 걱정할 필요는 없습니다. 또한 latent sector error(잠재 섹터 오류)라고 하는 다른 작업 디스크에서 단일 블록에 접근할 수 없는 문제도 아직은 걱정할 필요가 없습니다. 물론 나중에는 이러한 복잡한 오류들을 알아봐야겠죠?
How To Evaluate A RAID
그럼 좋은 RAID는 어떤 것인지는 어떻게 평가할 수 있을까요? 일단 RAID의 세 가지 장점으로 이를 평가할 수 있습니다. 세 가지 장점은 용량, 속도, 안정성이었죠?
용량을 평가하는 예를 보며 이해해보겠습니다. 예를 들어 N개의 디스크에 B개의 블록들이 있다면 용량은 N * B입니다. 물론 RAID에는 중복 데이터가 존재할 수 있는데 이러한 경우엔 더 줄어들 수 있습니다. 중복 데이터란 데이터의 안정성을 위해 복사본을 만드는 것인데 예를 들어 복사본이 1개라면 용량은 (N * B) / 2 가 됩니다.
안정성은 허용되는 디스크 결함의 수로 평가할 수 있습니다. 아까 알아본 Fault Model에서 이를 알아볼 수 있는데요, 이후에 공부할 Data Integrity 단원에서 복잡한 오류들을 처리하는 방법에 대해 알아볼 예정입니다.
속도, 혹은 성능은 디스크 배열에 제공되는 워크로드에 의해 크게 달라지기 때문에 평가하기가 어려운데요, 성능을 평가하기 전에 워크로드에 대해 알아봐야 합니다. 일반적인 워크로드에는 RAID Level 0 (Striping), RAID Level 1 (Mirroring), RAID Level 4,5(Parity 기반 중복)이라는 세 가지가 있는데, 그럼 바로 이것들에 대해 알아보도록 할게요.
RAID Level 0: Striping
첫 번째 RAID Level은 중복성이 존재하지 않기 때문에 실제 RAID와는 많이 다르지만 striping은 성능, 용량에 대한 상한선 역할을 하기 때문에 이해하고 넘어가면 좋습니다! 즉 가장 성능이 좋은 RAID라는 것이죠! 참고로 striping을 해석하면 줄무늬입니다.
가장 간단한 형태의 striping은 아래 그림과 같이 시스템의 디스크에 블록을 striping 합니다.
즉 위와 같이 블록들을 하나씩 Round Robin 방식으로 디스크에 분산하는 아이디어가 striping입니다. 즉 어떤 파일을 블록 단위로 쪼개서 여러 개의 디스크에 골고루 저장시킨다는 말입니다. 위의 그림에서 동일한 행의 블록들을 stripe라고 하는데, 0,1,2,3 블록이 같은 stripe라고 할 수 있습니다. 위의 예에서는 디스크에 1개의 블록씩 분산했는데 아래와 같이 분산할 수도 있습니다. 여기서 Chunk라는 단위가 나오는데 이는 하나의 디스크에 분할한 데이터 크기입니다. 위의 예에서는 하나씩 분할했으니 블록 1개가 Chunk 크기입니다.
위의 그림처럼 각 디스크에 두 개의 블록을 배치할 수도 있습니다. 이 경우 하나의 블록 크기를 4KB라고 했을 때 RAID Array Chunk 크기가 8KB이므로 stripe는 32KB의 데이터로 구성되게 됩니다.
Chunk Sizes
Chunk 크기는 Array의 성능에 영향을 주는데, Chunk 크기가 작다면 많은 파일이 여러개의 디스크에 striping 되기 대문에 하나의 파일에 대한 읽고, 쓰기의 병렬 처리의 횟수가 증가한다는 것을 의미합니다. 병렬 처리가 증가하면 빨라질 것이라고 생각되지만 전체 요청에 대한 위치 지정 시간이 모든 드라이브에 대한 요청의 최대 위치 지정시간에 의해 결정되기 때문에 여러 디스크에서 블록에 접근하는데 필요한 위치 지정 시간이 늘어납니다.
Chunk 크기가 크다면 병렬 처리 횟수를 줄이기 때문에 성능을 올리기 위해 동시에 작업하려고 합니다. 병렬 처리 횟수가 적지만 위치 지정시간을 줄일 수 있습니다. 예를 들어 하나의 파일이 Chunk에 들어가서 단일 디스크에 배치되는 경우 접근하는 동안 발생하는 위치 지정 시간은 단일 디스크의 위치 지정 시간입니다.
따라서 Chunk 크기를 크게 할지 작게 할지에 대한 결정은 시스템에 제공되는 워크로드에 대한 많은 지식을 기반으로 정해야하기 때문에 어렵습니다. 실제로는 Chunk 크기로 64KB를 사용하지만 이번 글에서는 모든 예를 4KB의 Chunk 크기를 갖는다고 가정하고 진행하려고 합니다.
Back To RAID-0 Analysis
다시 RAID Level 0으로 돌아와서 Striping 방법의 용량, 안정성, 성능을 평가해보겠습니다. 용량은 디스크 N개가 주어졌을 때 블록이 B 개라면 N*B 블록을 제공합니다. 안정성을 평가해보면 복사본을 만들지 않기 때문에 문제가 발생하면 데이터 손실이 발생합니다. 모든 디스크가 I/O 요청을 처리하기 위해 병렬로 활용되기 때문에 성능은 우수하다고 할 수 있습니다.
Evaluating RAID Performance
RAID 성능을 분석할 때 두 가지 다른 기준으로 분석할 수 있는데요, 하나는 single request latency(단일 요청 대기 시간)입니다. RAID에 하나의 I/O 요청에 걸리는 시간을 알아내면 하나의 논리 I/O 작업 중에 얼마나 많은 병렬 처리가 존재하는지 알 수 있습니다. 두 번째 기준은 RAID의 처리량, 즉 쉽게 말해 대역폭입니다.
Throughput(처리량)에 대해 자세히 이해하려면 몇 가지 워크로드로 이해할 수 있어요. 저는 블록 배열에 대한 연속적인 접근과 랜덤 접근 워크로드에 대해 알아보려고 합니다. 연속적인 접근이란 블록들을 순서대로 접근하는 것인데요, 예를 들어 1MB의 데이터를 요청하면 블록 0번에서 시작했다면 블록 크기가 4KB라고 했을 때 0번부터 255번 블록까지 접근하는 것이죠. 동일한 작업을 랜덤 워크로드로 처리하면 0번 100번 10만 번 등 블록을 랜덤 하게 접근하게 됩니다.
연속 접근과 랜덤 접근의 디스크 성능 차이는 어떨까요? 동일한 디스크에서의 접근시간은 seek time + rotate time이 결정하게 될 텐데 순차 접근을 하면 블록을 처음 찾을 때 말고는 블록을 찾는데 걸리는 시간이 없습니다. 반대로 랜덤 접근에서는 블록에 접근할 때마다 seek time, rotate time이 발생하게 되고 때문에 당연하게도 연속 접근이 훨씬 빠릅니다.
Back To RAID-0 Analysis, Again
그럼 이제 striping을 사용할 때의 디스크 성능을 평가해보겠습니다. Striping은 RAID 중에서 가장 성능이 좋기 때문에 단일 블록 요청의 대기시간은 디스크 대기시간과 거의 동일합니다. 즉 디스크를 사용하는 시간이 곧 성능이란 말이죠. 따라서 throughput을 구해보면 디스크 수(N)에 단일 디스크의 연속 접근 대역폭(R)을 곱한 값과 같습니다. 즉 간단하게 N*R로 나타낼 수 있고 이는 RAID 중에서 가장 좋은 성능을 보여줍니다.
RAID Level 1: Mirroring
그럼 이제 striping이라는 가장 좋은 성능을 가진 RAID를 봤으니 RAID level 1인 Mirroring을 알아보도록 하겠습니다. 미러링이란 이름에 맞게 이 시스템을 사용하면 시스템의 각 블록에 대해 둘 이상의 복사본을 만들 수 있고 이는 하나의 디스크가 고장 났을 때에 대비한 것이기 때문에 동일한 디스크에 저장하는 것이 아니라 다른 디스크에 저장해야 합니다.
RAID 1은 위와 같이 데이터를 저장하게 되는데요, 동일한 디스크 블록을 서로 다른 디스크에 중복되게 저장합니다. 그리고 복사본들을 striping과 같이 배치할 수도 있습니다. 위의 그림처럼 말이에요.
미러링 된 배열에서 블록을 읽을 때 RAID는 동일한 블록이 2개 존재하니까 하나만 골라 읽어야 합니다. 예를 들어 논리 블록 5번을 읽어달라고 요청이 들어오면 디스크 2나 3에서 이를 읽을 수 있는 것이죠. 하지만 write작업을 수행할 때는 신뢰성을 유지하기 위해서 데이터를 병렬로 수행합니다. 예를 들어 블록 5번을 write 한다면 디스크 2,3에 동시에 쓰기 작업을 수행할 수 있습니다.
RAID-1 Analysis
그럼 RAID 1을 평가해볼까요? 데이터를 복사해야 하므로 용량은 많이 사용해야 합니다. 몇 개의 복사본을 갖는지에 따라 사용 가능한 용량을 알 수 있는데요, 아까 본 예처럼 2개의 복사본을 가진다면 최대 용량의 절반의 용량만 사용 가능하게 됩니다.
안정성의 관점에서 보면 하나의 블록에 대하여 여러 개의 디스크에 복사하여 저장하기 때문에 안정성은 좋다고 할 수 있습니다.
아까의 예를 다시 가져와서 보면, 예를 들어 디스크 1,2에서 손실이 발생했다고 하더라도 디스크 0, 3에 복사본이 있기 때문에 전혀 문제없이 작동할 수 있습니다.
마지막으로 성능을 평가해보겠습니다. 읽을 때는 복사본이 많더라도 실제로 읽는 블록은 하나이기 때문에 단일 블록 읽기와 성능이 같습니다. 하지만 쓸 때의 경우에는 다르겠죠? 몇 개의 복사본을 가지느냐에 따라 쓰기에 대한 성능이 달라집니다. 아까의 예로 살펴보면 2번의 복사본을 가지는 RAID이므로 하나의 블록에 대하여 2번의 쓰기가 발생합니다. 하지만 이는 병렬적으로 처리되기 때문에 단일 쓰기 시간과 거의 동일하지만, 디스크는 seek time, rotate time이 발생하므로 보통 단일 쓰기 시간보다는 더 많은 시간이 필요합니다.
이제 RAID 1에서 연속 접근과 랜덤 접근을 사용할 때의 성능 차이를 살펴보겠습니다. 아까 2개의 복사본을 가지는 경우로 생각해보면, 연속 접근으로 쓰기 작업을 수행할 때 총 2개의 물리적 write가 발생합니다. 따라서 순차적으로 이는 병렬적으로 처리되기 때문에 최대 대역폭의 절반부터 최댓값까지의 범위를 가집니다.
연속적인 읽기 작업은 어떨까요? 아까도 말했듯 읽기 작업은 여러 개의 복사본이 존재하더라도 하나의 블록만 읽으면 되기 때문에 성능은 단일 읽기 작업과 동일할 것이라고 생각할 수 있는데, 사실을 그렇지 않습니다. 이해를 위해 아까의 예를 다시 살펴볼게요. 위의 예에서 0~7번까지의 블록을 모두 읽는다고 할 때 순차적으로 읽게 되면 결국 모든 디스크의 정보를 봐야 합니다. 0번 블록을 디스크 0에서 보지 않더라도 디스크 0을 거쳐야 디스크 1로 갈 수 있기 때문이에요. 따라서 대역폭은 최대 대역폭의 절반만 제공합니다.
그럼 이번엔 랜덤 접근으로 성능을 평가해보겠습니다. 만약 랜덤 읽기를 RAID 1에서 한다면 어떨까요? 랜덤 읽기는 RAID 1에 가장 적합한 방법입니다. 랜덤 읽기를 사용하면 모든 디스크에 읽기 작업을 분산하여 전체 대역폭을 얻을 수 있습니다.
랜덤 쓰기 작업은 연속 쓰기와 마찬가지로 복사본을 만들어야 하기 때문에 복사본의 수만큼 대역폭이 나눠진 성능을 갖게 됩니다. 이를 병렬로 처리하긴 하지만 단일 쓰기보다는 낮은 성능을 보입니다.
RAID Level 4: Saving Space With Parity
이젠 RAID Level 4에 대해 알아보도록 하겠습니다. 레벨 2도 있는데 지금 알아볼 레벨 4가 나오게 되면서 거의 사용하지 않는다고 합니다. 레벨 4는 parity라고 하는 디스크 배열에 안정성을 보장하기 위한 다른 방법을 제시합니다. 앞에서 설명한 방법 중 미러링 방법이 안정성을 어느 정도 보장해줬었지만 용량을 너무 많이 사용한다는 단점이 있었습니다. Parity 기반 접근 방식은 더 적은 용량을 사용하여 미러링 시스템에 사용하는 용량 문제를 해결하려고 합니다. 물론 모든 것은 양면이 있기에 용량은 줄어들 수 있지만 성능은 나빠지게 됩니다.
위의 그림은 5개로 구성된 RAID-4 시스템의 예입니다. 블록들을 striping 방법으로 저장하다가 해당 열의 블록에 대한 중복 정보를 저장하는 하나의 parity 블록을 추가한 방법입니다. 일단 블록들을 striping 방법으로 저장하기 때문에 용량 문제를 해결할 수 있으며 parity 블록을 사용하여 안정성을 보장할 수 있습니다. 예를 들어 위의 그림에서 P0 블록이 parity 블록이며 이는 0,1,2,3번의 블록에서 계산한 중복 정보가 저장되어 있습니다. 패리티 블록을 사용하여 디스크가 정상인지를 파악할 수 있습니다.
Parity를 사용하여 디스크 손상을 알기 위해선 XOR 연산을 사용할 수 있습니다. XOR 연산은 1이 홀수개 있으면 1을 반환하고 짝수개 있으면 0을 반환합니다. 여기서 결괏값 1은 손실되었음을 나타내며 0은 정상임을 나타냅니다. 첫 번째 줄에서는 0,0,1,1이므로 1이 짝수개 있기 때문에 정상이라는 의미의 0을 반환합니다. 두 번째 줄은 1이 1개이므로 디스크 손실을 나타내는 1을 반환합니다. 이렇게 손실된 부분을 찾을 수 있기 때문에 이를 해결할 방법을 알아낼 수도 있습니다.
그럼 이러한 모든 비트에 대하여 XOR 연산을 진행한다고 하지만 실제 블록은 4KB나 더 큰 크기인데 어떻게 계산할 수 있을까요? 간단한 예로 4비트짜리 블록인 경우로 살펴보겠습니다. 위와 같이 비트가 2개로 구성된 블록들의 각 자릿수를 비교하는 것이죠. 위의 그림과 같이 자릿수의 1의 개수를 구하여 parity 블록을 계산하면 됩니다.
RAID-4 Analysis
그럼 RAID 4를 평가해보겠습니다. 일단 용량적인 부분에서는 패리티 정보를 저장하는 하나의 디스크를 제외하고는 모두 사용할 수 있습니다. 디스크가 N개라고 했을 때 총 N-1만큼의 용량을 사용할 수 있는 것이죠.
안정성도 보장됩니다. RAID 4는 하나의 디스크의 손상만 허용합니다. 따라서 두 개 이상의 디스크가 손상되었다면 오류를 발생시킬 거예요.
성능적인 측면은 연속 접근 방법부터 살펴보겠습니다. 연속 읽기를 할 땐 패리티 디스크를 제외한 모든 디스크를 활용할 수 있기 때문에 거의 최대 대역폭을 제공합니다. 정확하게는 디스크의 수가 N개 라면 (N-1)만큼의 성능을 보입니다.
연속 쓰기의 경우 striping 방법으로 블록들을 저장하기 때문에 빠르게 진행할 수 있는데요, 예를 들어 위와 같은 디스크를 가진 RAID 4에 블록 0,1,2,3에 쓰기 요청이 발생했다고 생각해보겠습니다. RAID는 0,1,2,3과 패리티 블록 P0에 쓰기 작업을 할 수 있습니다. 이에 대한 성능은 패리티 블록을 제외한 만큼의 성능이 나오게 됩니다. 또한 위와 같이 striping으로 쓰기 작업을 수행하는 것이 RAID 4의 가장 효율적인 쓰기 방법입니다.
그렇다면 랜덤 읽기는 어떨까요? 블록을 랜덤 하게 읽더라도 해당 블록이 정상인지를 확인하는 parity 블록은 동일합니다. 따라서 랜덤 읽기를 하더라도 성능은 크게 변하지 않습니다.
마지막으로 랜덤 쓰기에 대해 알아보겠습니다. 아까의 예를 다시 가지고 와서 이번에는 블록 1번을 덮어쓰고 싶다고 생각해보겠습니다. 블록 1을 덮어쓰기만 한다면 P0에 저장된 블록 1에 대한 신뢰성 정보가 업데이트되지 않기 때문에 P0도 함께 업데이트해줘야 합니다. 여기서 P0을 업데이트해주는 방법에는 두 가지 방법이 있습니다.
첫 번째 방법은 위와 같이 새로운 parity 블록의 값을 계산하려면 함께 속해있는 모든 블록을 병렬로 읽고 새로 덮어쓰려는 블록과 XOR 연산을 하여 새로운 parity 블록에 대한 값을 얻는 거예요. 가장 직관적인 방법입니다. 하지만 하나의 블록을 덮어쓸 때나 여러 개의 블록을 덮어쓸 때나 동일하게 parity 값을 위해 XOR 연산을 모든 블록에 대해 해줘야 한다는 점에서 성능이 저하됩니다.
따라서 두 번째 방법은 좀 더 효율적인 방법인 subtractive parity method가 있습니다. C2 new라고 하는 값으로 C2 블록을 덮어쓰는 작업을 한다고 생각해보겠습니다. Subtractive parity method는 3 단계로 진행되는데요, 가장 먼저 기존의 C2 값과 Parity 블록의 값을 읽습니다. 여기서는 기존 C2는 0, 기존 Parity 값은 0이네요. 그런 뒤 기존의 값들과 새로운 값을 비교합니다. 만약 새로운 값과 기존의 값이 같다면 비트를 그대로 유지하면 됩니다. 하지만 만약 다르다면 비트를 반전해주면 됩니다. 이와 같은 비트 연산을 위와 같은 식으로 나타낼 수 있습니다. 물론 이러한 연산은 현재 블록에 대하여 계산중이므로 블록의 모든 비트에 대해 이러한 계산을 수행해야 합니다.
결론만 말하자면 subtractive parity method를 사용하면 하나의 쓰기 작업에 대하여 RAID는 총 4번의 I/O를 수행하면 됩니다. (읽기 2회 쓰기 2회) 그럼 이러한 작업은 병렬로 얼마나 처리할 수 있을지를 알아보겠습니다.
위와 같이 블록 4, 블록 13에 대하여 쓰기 요청이 발생했다고 생각해보겠습니다. 이렇게 진행되면 접근해야 하는 디스크는 디스크 0,1,4가 되겠죠? 디스크 0, 1에 대한 작업은 병렬로 처리할 수 있는데 parity 블록이 저장되는 디스크 4에서는 병목 현상이 발생할 수 있습니다. 이러한 문제를 RAID 4에서 발생하는 small write 문제라고 합니다. 따라서 RAID 4를 사용하면 항상 parity 디스크가 병렬 처리를 하지 않고 직렬 처리를 하도록 만듭니다. 때문에 쓰기 작업이 작다면 RAID 4의 처리량이 나빠지는 것이죠. 이러한 문제를 해결한 방법이 지금부터 알아볼 RAID 5입니다.
RAID Level 5: Rotating Parity
그럼 마지막으로 RAID 5를 알아보겠습니다. 아까 알아본 RAID 4는 쓰기 작업의 경우 쓰기 작업이 작을 때 성능이 정말 별로라는 문제가 존재했었습니다. 이를 해결하기 위해 RAID 5에서는 rotating을 사용하여 이를 개선하려고 합니다. RAID 5는 parity 블록이 회전한다는 점을 제외하면 RAID 4와 거의 비슷합니다.
위와 같이 parity 블록들의 위치가 계속해서 변하게 배치하는 것을 볼 수 있습니다.
RAID-5 Analysis
RAID-5의 성능을 평가해보겠습니다. 사실 RAID 5는 RAID 4에서 랜덤 쓰기 작업을 할 때 발생하는 성능 문제점을 개선하기 위해 나온 것이기 때문에 연속 읽기, 연속 쓰기, 단일 블록 읽기, 단일 블록 쓰기에 대한 성능은 RAID 4와 같습니다.
RAID 5는 RAID 4에 비해 랜덤 읽기, 쓰기에 대하여 성능이 더 좋은데요, 특히 랜덤 쓰기가 RAID 4에 비해 정말 좋습니다. 쓰기 요청에 대한 병렬 처리를 허용하기 때문이에요. 위의 그림을 보며 이해해보겠습니다. 블록 1과 10에 쓰기 요청이 발생했다고 생각해보겠습니다. 블록 1에 대한 쓰기는 디스크 1,4에 대한 작업으로 바뀌고 블록 10에 대한 쓰기는 디스크 0, 2에 대한 작업으로 변하게 됩니다. 이를 병렬로 처리할 수 있기 때문에 성능이 향상되는 것이죠.
이렇게 대부분의 경우엔 RAID 4와 동일한데 몇 가지 경우에서 RAID 5가 더 나은 성능을 보이기 때문에 RAID 5를 주로 사용한다고 합니다.
RAID Comparison: A Summary
그럼 이제 지금까지 알아본 RAID의 레벨들을 정리해보도록 하겠습니다. 위의 그림과 같이 정리할 수 있습니다. 지금까지 알아본 내용들이 모두 정리된 내용이니 더 알아보진 않겠습니다.
결론은 안정성에 관심이 없고 성능만 중요하다면 Striping 방법이 가장 좋다는 것, 안정성과 랜덤 I/O 성능을 중요시한다면 Mirroring(RAID 2) 방법이 좋습니다. 하지만 RAID 2는 용량을 많이 사용하기 때문에 용량과 안정성을 중요시한다면 RAID 5를 사용하면 됩니다. 그리고 랜덤 쓰기, 읽기를 사용하지 않으면서 용량을 최대로 하고 싶을 때도 RAID 5가 좋은 선택이 될 수 있습니다.
Summary
이번 글에서는 RAID에 대해 알아 봤습니다. RAID는 여러 개의 디스크들을 안정적으로 동작하도록 해주며 이를 사용할 때 선택할 수 있는 RAID 레벨들이 존재했습니다. 미러링 된 RAID 구조는 안정적이지만 용량을 많이 사용했고 RAID 5는 용량은 적게 사용하지만 write가 조금 있을 때는 성능이 매우 떨어지는 단점을 가지고 있었습니다. 따라서 상황에 따라 적절한 RAID 레벨을 사용해야 좋은 RAID 성능을 이끌어 낼 수 있었습니다. 다음 글에서는 컴퓨터에서 탐색기나 finder에서 사용하는 파일과 디렉터리에 대하여 알아보도록 하겠습니다!
'Computer > Operating System' 카테고리의 다른 글
[OS] 간단한 FileSystem 구현 방법 - OS 공부 28 (2) | 2021.02.08 |
---|---|
[OS] File과 Directory - OS 공부 27 (1) | 2021.02.06 |
[OS] Hard Disk Drive 알아보기 - OS 공부 25 (2) | 2021.01.23 |
[OS] I/O Device 알아보기 - OS 공부 24 (0) | 2021.01.19 |
[OS] Concurrency의 문제점 Deadlock - OS 공부 23 (0) | 2021.01.17 |
- Total
- Today
- Yesterday
- System
- 아이폰
- 백준
- DP
- document
- pattern
- operating
- Xcode
- 코딩테스트
- operator
- Publisher
- BFS
- 알고리즘
- 앱개발
- 동시성
- 문법
- design
- IOS
- OS
- 자료구조
- 스위프트
- dfs
- 프로그래밍
- 코테
- OSTEP
- Combine
- 테이블뷰
- mac
- Swift
- Apple
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |