실용적인 RAID 성능
RAID 레벨 선택은 비용, 신뢰성, 용량, 그리고 물론 성능을 포함한 많은 요소들의 균형을 맞추는 과정입니다. RAID 성능은 서로 다른 RAID 레벨이 다른 기법을 사용하고 경우에 따라 서로 상당히 다르게 동작하기 때문에 이해하기 어려울 수 있습니다. 이 기사에서는 RAID 0, 5, 6, 10의 일반적인 RAID 레벨들을 탐색하여 성능이 어떻게 다른지 살펴보고자 합니다.
이 기사의 목적상, RAID 1은 RAID 10의 하위 집합으로 가정합니다. 이것은 종종 RAID 1을 생각하는 편리한 방법입니다. 단일 미러링된 쌍 멤버만 있는 RAID 10 어레이로 단순히 생각하는 것입니다. RAID 1이 진정한 단일 쌍 RAID 10이고 그렇게 동작하므로, RAID 성능을 이해하기 쉽게 만들기 위해 RAID 10 성능 곡선에 단순히 매핑되기 때문에 이것은 훌륭하게 작동합니다.
모든 스토리지에서 살펴볼 두 가지 유형의 성능이 있습니다. 읽기와 쓰기입니다. RAID 측면에서 읽기는 매우 쉽고 쓰기는 다소 복잡합니다. 읽기 성능은 모든 RAID 유형에서 사실상 안정적입니다. 하지만 쓰기는 그렇지 않습니다.
성능 논의를 더 쉽게 하기 위해 몇 가지 용어를 정의해야 합니다. 우리는 몇 가지 방정식을 사용할 것이기 때문입니다. 논의에서는 어레이의 총 드라이브 수(종종 스핀들이라고 부름)를 나타내기 위해 N을 사용하고 개별 드라이브의 성능을 나타내기 위해 X를 사용합니다. 이를 통해 RAID 어레이를 추상화하고 원시 IOPS로 생각할 필요 없이 드라이브 성능의 팩터로 상대적 성능에 대해 이야기할 수 있습니다. IOPS는 정의하기 매우 어려운 경우가 많지만 어레이 내 개별 드라이브와의 관계에서 의미 있는 방식으로 성능을 비교할 수 있습니다.
또한 우리가 이야기하는 것은 전체 스토리지 서브시스템이 아닌 RAID 어레이 자체의 성능임을 기억하는 것이 중요합니다. 메모리 캐시나 솔리드 스테이트 캐시와 같은 아티팩트는 스토리지 서브시스템의 전체 성능을 변경하는 놀라운 일을 하지만, 내부적으로 RAID 어레이 자체의 성능을 근본적으로 바꾸지는 않습니다. 다양한 캐시 옵션이 전체 성능에 어떤 영향을 미칠지 결정하는 단순한 공식은 없지만, 이것이 매우 극적일 수 있지만 이것은 캐시 선택 자체뿐만 아니라 워크로드에도 크게 의존합니다. 가장 크고 빠른 강력한 캐시 옵션조차도 어레이의 장기적이고 지속적인 성능을 바꿀 수 없습니다.
RAID는 복잡하고 최종 성능에 많은 요소가 영향을 미칩니다. 하나는 RAID 시스템 자체의 구현입니다. 좋지 않은 구현은 레이턴시를 유발하거나 사용 가능한 스핀들을 활용하지 못할 수 있습니다(예: RAID 1 어레이가 두 디스크 모두에서 동시에 읽는 대신 단일 디스크에서만 읽는 경우!). 특정 RAID 구현의 결함을 쉽게 설명할 방법이 없으므로 모든 엔터프라이즈 RAID 시스템이 그렇게 하듯이 모두 사양의 한계에서 작동한다고 가정해야 합니다. 주로 취미용 및 소비자용 RAID 시스템이 이를 하지 못합니다.
일부 유형의 RAID는 상당한 양의 계산 오버헤드가 있는 반면 다른 유형은 그렇지 않습니다. 주로 패리티 RAID 레벨은 각 작업에 대한 계산량이 다른 수준을 가지며 쓰기 작업을 처리하기 위해 무거운 처리가 필요합니다. 이것은 레이턴시를 도입하지만 처리량을 제한하지는 않습니다. 하지만 이 레이턴시는 RAID 레벨 구현뿐만 아니라 해당 시스템의 처리 능력에 따라 달라집니다. 하드웨어 RAID는 이를 처리하기 위해 범용 CPU(종종 Power 또는 ARM RISC 프로세서) 또는 커스텀 ASIC 같은 것을 사용하는 반면, 소프트웨어 RAID는 이를 서버 자체 CPU에 넘깁니다. 종종 서버 CPU가 실제로 더 빠르지만 시스템 자원을 소비합니다. ASIC은 매우 빠를 수 있지만 생산 비용이 많이 듭니다. 이 레이턴시는 스토리지 성능에 영향을 미치지만 예측하기 매우 어렵고 명목상에서 극적인 수준까지 다양할 수 있습니다. 따라서 각 RAID 레벨에 대한 상대적 레이턴시 영향을 언급하겠지만 측정하려고 하지 않겠습니다. 대부분의 RAID 성능 계산에서 이 레이턴시는 무시되지만 그것이 존재하고 어레이 구성에 따라 워크로드에 눈에 띄는 영향을 미칠 수 있음을 이해하는 것이 중요합니다.
언급해야 할 것이 있는데, 디스크 자체에 데이터 레이아웃의 효율성으로 인해 읽기 작업에 아주 작은 성능 영향이 있다는 것입니다. 패리티 RAID는 정상적인 읽기 작업 중에는 쓸모없지만 속도를 높이는 데 사용할 수 없는 데이터가 디스크에 있어야 합니다. 이것은 실제로 약간 느린 결과를 초래합니다. 하지만 이 영향은 터무니없이 작으며 일반적으로 측정되지 않으므로 무시할 수 있습니다.
스트라이프 크기와 같은 요소도 당연히 성능에 영향을 미치지만 이것은 구성 가능하며 어떤 RAID 레벨에도 내재적인 아티팩트가 아니므로 여기서는 무시하겠습니다. 이것은 RAID 레벨 자체를 선택할 때가 아니라 선택한 후 구성할 때만 관련됩니다.
언급하고 싶은 마지막 요소는 스토리지 작업의 읽기 대 쓰기 비율입니다. 일부 RAID 어레이는 거의 순수하게 읽기 작업에 사용되고, 일부는 거의 전적으로 쓰기 작업에 사용되지만 대부분은 두 가지의 혼합을 사용하며, 아마도 읽기 80% 쓰기 20% 정도일 것입니다. 이 비율은 특정 RAID 어레이에서 얻을 성능과 각 RAID 레벨이 어떻게 영향을 미치는지 이해하는 데 매우 중요합니다. 저는 이것을 읽기/쓰기 블렌드라고 부릅니다.
우리는 스토리지 성능을 주로 IOPS로 측정합니다. IOPS는 초당 입출력 작업(Input/Output Operations Per Second)을 의미합니다(네, 글자들이 잘 맞지 않는 것을 알고 있지만 그게 맞습니다). 저는 또한 읽기 IOPS를 위해 RIOPS, 쓰기 IOPS를 위해 WIOPS, 80/20이나 다른 비율로 올 블렌딩된 IOPS를 위해 BIOPS라는 용어를 사용합니다. 많은 사람들이 단일 IOPS 숫자로 스토리지 성능을 이야기합니다. 이렇게 할 때 그들은 보통 50/50에서 블렌딩된 IOPS를 의미합니다. 하지만 거의 어떤 워크로드도 50/50으로 실행되지 않으므로 그 숫자는 매우 오해를 불러일으킬 수 있습니다. 두 가지 숫자, RIOPS와 WIOPS가 성능을 이해하는 데 필요하며 이 두 가지를 함께 사용하여 필요한 IOPS 블렌드를 찾을 수 있습니다. 예를 들어, 50/50 블렌드는 (RIOPS * .5) + (WIOPS * .5)처럼 간단합니다. 더 일반적인 80/20 블렌드는 (RIOPS * .8) + (WIOPS * .2)가 됩니다.
이제 몇 가지 기준과 배경 이해를 설정했으므로 RAID 레벨 자체를 깊이 살펴보고 성능이 어떻게 달라지는지 살펴보겠습니다.
모든 RAID 레벨에서 읽기 IOPS 숫자는 NX를 사용하여 계산됩니다. 물론 이것은 위에서 언급한 명목상의 오버헤드 수치를 다루지 않습니다. 이것은 “최선의 경우” 숫자이지만 실제 세계 숫자는 너무 가까워서 이 공식을 단순히 사용하는 것이 매우 실용적입니다. 스핀들 수(N)를 가져와서 개별 드라이브의 IOPS 성능(X)을 곱합니다. 드라이브는 종종 읽기와 쓰기 성능이 다르므로 읽기 IOPS 계산에는 드라이브의 읽기 IOPS 등급이나 테스트된 속도를 사용하고 쓰기 IOPS 계산에는 쓰기 IOPS 등급이나 테스트된 속도를 사용해야 합니다.
RAID 0
RAID 0은 걱정할 오버헤드가 사실상 없고, 이를 구동하는 데 소비되는 자원이 없으며, 읽기와 쓰기 모두 항상 모든 스핀들의 완전한 혜택을 받기 때문에 이해하기 가장 쉬운 RAID 레벨입니다. 따라서 RAID 0에서 쓰기 성능의 공식은 매우 간단합니다: NX. RAID 0은 항상 가장 성능이 좋은 RAID 레벨입니다.
예를 들어 8 스핀들 RAID 0 어레이가 있습니다. 어레이의 개별 드라이브가 125 IOPS를 제공한다면 계산은 N = 8, X = 125가 되므로 8 * 125는 1,000 IOPS를 산출합니다. 읽기와 쓰기 IOPS가 여기서 동일하기 때문에 1K RIOPS, 1K WIOPS, 그리고 어떤 블렌딩에서도 1K로 매우 간단합니다. 개별 스핀들의 절대 IOPS를 모른다면 8 스핀들 RAID 0을 8X 블렌딩된 IOPS를 제공하는 것으로 표현할 수 있습니다.
RAID 10
RAID 10은 계산하기 두 번째로 간단한 RAID 레벨입니다. RAID 10은 미러 세트의 RAID 0 스트라이프이기 때문에 스트라이프에서 걱정할 오버헤드가 없지만 각 미러는 미러링을 생성하기 위해 동일한 데이터를 두 번 써야 합니다. 이것은 동일한 수의 드라이브를 가진 RAID 0 어레이에 비해 쓰기 성능을 절반으로 줄입니다. 따라서 쓰기 성능 공식은 단순히 NX/2 또는 .5NX입니다.
스핀들 수가 같은 것이 아니라 동일한 용량에서 RAID 10이 RAID 0과 동일한 쓰기 성능을 가지지만 두 배의 읽기 성능을 가진다는 점에 주목해야 합니다. 단순히 동일한 용량에 맞추기 위해 두 배의 스핀들이 필요하기 때문입니다.
따라서 8 스핀들 RAID 10 어레이는 N = 8, X = 125가 되며 결과 계산은 (8 * 125)/2 즉 500 WIOPS 또는 4X WIOPS입니다. 50/50 블렌드는 750 블렌딩된 IOPS(1,000 읽기 IOPS와 500 쓰기 IOPS)가 됩니다.
이 공식은 RAID 1, RAID 10, RAID 100, RAID 01에 동일하게 적용됩니다.
RAID 10에서의 트리플 미러링과 같은 특수 옵션은 이 쓰기 페널티를 변경합니다. 트리플 미러링이 있는 RAID 10은 예를 들어 NX/3이 됩니다.
RAID 5
RAID 5는 더 이상 사용되지 않으며 새 어레이에서 절대 사용해서는 안 되지만 잘 알려져 있고 일반적으로 사용되는 RAID 레벨이며 성능을 이해해야 하기 때문에 여기에 포함합니다. RAID 5는 현대 패리티 RAID 레벨 중 가장 기본적인 것입니다. RAID 2, 3, 4는 더 이상 프로덕션 시스템에서 찾아볼 수 없으므로 여기서는 성능을 살펴보지 않겠습니다. RAID 5는 오늘날 사용하기에 권장되지 않지만 다른 현대 패리티 RAID 레벨의 기초이므로 이해하는 것이 중요합니다.
패리티 RAID는 디스크에 쓰는 모든 쓰기와 함께 패리티를 검증하고 재작성하는 다소 복잡한 필요성을 추가합니다. 이는 RAID 5 어레이가 데이터를 읽고, 패리티를 읽고, 데이터를 쓰고, 최종적으로 패리티를 써야 한다는 것을 의미합니다. 실제로 하나에 대해 네 번의 작업이 필요합니다. 이것은 RAID 5에 4의 쓰기 페널티를 부여합니다. 따라서 RAID 5 쓰기 성능 공식은 NX/4입니다.
따라서 개별 스핀들의 쓰기 IOPS가 125인 8 스핀들 예를 따르면 (8 * 125)/4 즉 2X 쓰기 IOPS로 250 WIOPS가 됩니다. 50/50 블렌드에서는 625 블렌딩된 IOPS가 됩니다.
RAID 6
RAID 6은 RAID 10 다음으로 오늘날 가장 일반적이고 유용한 RAID 레벨입니다. 하지만 RAID 6은 RAID 5를 기반으로 하며 또 다른 수준의 패리티를 가집니다. 이것은 RAID 5보다 극적으로 더 안전하게 만들며 매우 중요하지만, 각 쓰기 작업에서 디스크가 데이터를 읽고, 첫 번째 패리티를 읽고, 두 번째 패리티를 읽고, 데이터를 쓰고, 첫 번째 패리티를 쓰고, 마지막으로 두 번째 패리티를 써야 하기 때문에 극적인 쓰기 페널티를 부과합니다. 이것은 6배의 쓰기 페널티가 되며 꽤 극적입니다. 따라서 공식은 NX/6입니다.
예를 계속하면 (8 * 125)/6은 약 167 쓰기 IOPS 또는 1.33X가 됩니다. 50/50 블렌드 예에서는 583.5 블렌딩된 IOPS의 성능입니다. 보시다시피, 패리티 쓰기는 쓰기 성능의 매우 빠른 감소와 블렌딩된 성능의 눈에 띄는 저하를 일으킵니다.
RAID 7 (RAID 5.3 또는 RAID 7.3이라고도 함)
RAID 7은 기존의 단일 패리티인 RAID 5와 기존의 이중 패리티인 RAID 6을 기반으로 하는 트리플 패리티가 있는 다소 비표준적인 RAID 레벨입니다. 현재 RAID 7의 유일한 구현은 ZFS의 RAIDZ3입니다. RAID 7은 RAID 5와 RAID 6 모두의 오버헤드에 세 번째 패리티 구성 요소의 추가 오버헤드가 더해지므로 8배의 엄청난 쓰기 페널티가 있습니다. 따라서 RAID 7 쓰기 성능을 찾기 위한 공식은 NX/8입니다.
이 예에서는 (8 * 125)/8이 125 쓰기 IOPS 또는 1X가 됩니다. 따라서 어레이에 8개의 드라이브가 있어도 단일 독립 드라이브의 쓰기 성능만 얻게 됩니다. 그것은 상당한 오버헤드입니다. 블렌딩된 50/50 IOPS는 562.5에 불과합니다.
복잡한 RAID
RAID 50, 60, 61, 16 등과 같은 복잡한 RAID 레벨이나 중첩된 RAID 레벨은 위의 정보를 사용하고 RAID를 구성 요소로 분해하여 위에 제공된 공식을 사용하여 각각 적용함으로써 찾을 수 있습니다. 이러한 레벨에는 구성이 다양하기 때문에 단순한 공식이 없습니다. 구성 요소로 분해하여 공식을 여러 번 적용해야 합니다.
각 드라이브가 150 IOPS인 12개 드라이브, 6개 드라이브 두 세트로 구성된 RAID 60은 두 개의 RAID 6으로 처리됩니다. N이 2(두 개의 RAID 6 어레이)이고 X가 각 RAID 6의 결과 성능인 RAID 0의 NX가 됩니다. 각 RAID 6 세트는 (6 * 150)/6이 됩니다. 따라서 전체 어레이는 2((6 * 150)/6)이 됩니다. 결과는 300 쓰기 IOPS입니다.
위와 같은 예이지만 RAID 6 어레이의 미러링된 쌍인 RAID 61로 구성된 경우, 각 RAID 6 어레이당 동일한 성능이지만 RAID 1 공식 NX/2에 적용됩니다(여기서 X는 각 RAID 어레이의 결과 성능입니다). 따라서 최종 공식은 2((6 * 150)/6)/2가 되어 12개 드라이브에서 150 쓰기 IOPS가 됩니다.
용량의 함수로서의 성능
RAID 성능 공식을 만들 때 우리는 이것들을 스핀들 수로 생각합니다. 이것은 매우 합리적입니다. 이것은 제안된 어레이나 측정이 불가능한 기존 어레이의 성능을 결정하고 다양한 제안된 옵션 간의 상대적 성능을 비교할 수 있게 해줍니다. 우리가 RAID 성능을 보편적으로 생각하는 것은 이러한 맥락에서입니다.
하지만 이것이 항상 좋은 접근 방식은 아닙니다. 일반적으로 우리는 RAID를 성능이나 스핀들 수의 함수가 아닌 용량의 함수로 봅니다. 8 드라이브 RAID 6 어레이 대 8 드라이브 RAID 10 어레이를 고려하는 것은 매우 드문 일이지만 확실히 가능합니다. 섀시 제한이나 다른 유사한 이유로 가끔 발생할 것입니다. 하지만 일반적으로 RAID 어레이는 스핀들 수, 성능 또는 다른 요소가 아닌 총 어레이 용량(즉, 사용 가능한 용량)의 관점에서 봅니다. 따라서 RAID 성능을 스핀들 수의 함수로 보는 것으로 전환하는 것은 이상한 일입니다.
관점을 바꿔서 공통 요소로 용량에 초점을 맞추면서 개별 드라이브 용량과 성능(X)이 비교 대상 간에 일정하게 유지된다고 가정하면 완전히 다른 성능 풍경에 도달합니다. 이렇게 하면 예를 들어 RAID 0이 더 이상 가장 성능이 좋은 RAID 레벨이 아니며 읽기 성능이 상수 대신 극적으로 달라진다는 것을 알 수 있습니다.
용량은 변수가 많지만 원하는 용량에 도달하는 데 필요한 스핀들 수로 추출할 수 있습니다. 이것이 이 논의를 훨씬 더 쉽게 만듭니다. 따라서 첫 번째 단계는 원시 용량에 필요한 스핀들 수를 결정하는 것입니다. 예를 들어 10TB의 용량이 필요하고 1TB 드라이브를 사용한다면 10개의 스핀들이 필요합니다. 또는 3.2TB가 필요하고 600GB 드라이브를 사용한다면 6개의 스핀들이 필요합니다. 이전과 달리 스핀들 수를 R이라고 부릅니다. 이전과 같이 개별 드라이브의 성능은 X로 표시됩니다. (R은 총 스핀들 수가 아닌 원시 용량 수(Raw Capacity Count)를 나타내기 위해 여기서 사용됩니다.)
RAID 0은 간단하게 유지되며 성능은 여전히 RX입니다. 추가 드라이브가 없기 때문입니다. 읽기와 쓰기 IOPS 모두 단순히 NX입니다.
RAID 10은 RX 쓰기 IOPS이지만 2RX 읽기 IOPS입니다. 이것은 극적입니다. 갑자기 안정적인 용량의 함수로 성능을 볼 때 RAID 10이 RAID 0보다 두 배의 읽기 성능을 가진다는 것을 알 수 있습니다!
RAID 5는 약간 더 복잡해집니다. 쓰기 IOPS는 ((R + 1) * X)/4로 표현됩니다. 읽기 IOPS는 ((R + 1) * X)로 표현됩니다.
RAID 6은 예상대로 RAID 5가 투영하는 패턴을 따릅니다. RAID 6의 쓰기 IOPS는 ((R + 2) * X)/6입니다. 그리고 읽기 IOPS는 ((R + 2) * X)로 표현됩니다.
RAID 7은 이 라인에 잘 맞습니다. RAID 7 쓰기 IOPS는 ((R + 3) * X)/8입니다. 그리고 읽기 IOPS는 ((R + 3) * X)입니다.
이 관점은 성능에 대해 생각하는 방식을 바꾸며, 순수하게 읽기 성능만 볼 때 RAID 0은 가장 빠른 것이 아니라 가장 느린 RAID 레벨이 되고 RAID 10은 R과 X 값에 관계없이 읽기와 쓰기 모두에서 가장 빠른 레벨이 됩니다!
20TB의 사용 가능한 용량을 달성하기 위한 2TB 드라이브 10개의 실제 예를 들어 각 드라이브의 성능이 100 IOPS이고 50/50 블렌드를 가정하면 결과 IOPS는 RAID 0이 1,000 블렌딩된 IOPS, RAID 10이 1,500 블렌딩된 IOPS(2,000 RIOPS / 1,000 WIOPS), RAID 5가 687.5 블렌딩된 IOPS(1,100 RIOPS / 275 WIOPS), RAID 6이 700 블렌딩된 IOPS(1,200 RIOPS / 200 WIOPS), 마지막으로 RAID 7이 731.25 블렌딩된 IOPS(1,300 RIOPS / 162.5 WIOPS)입니다. RAID 10이 압도적인 우승자입니다.
소프트웨어 RAID에서의 레이턴시 및 시스템 영향
앞서 언급했듯이 RAID 0과 RAID 10은 사실상 고려할 시스템 오버헤드가 없습니다. 미러링 작업은 본질적으로 계산 노력이 거의 필요하지 않으며 사실상 측정할 수 없을 정도로 작습니다. 패리티 RAID는 계산 오버헤드가 있으며 이는 스토리지 레이어에서 레이턴시와 시스템 자원 소비를 초래합니다. 물론 하드웨어 RAID를 사용한다면 해당 자원은 RAID 어레이 전용이며 이 역할에서 소비되는 것 외에 다른 기능이 없습니다. 하지만 소프트웨어 RAID를 사용한다면 이것은 RAID 어레이 처리 목적으로 소비되는 범용 시스템 자원(주로 CPU)입니다.
많은 양의 RAID가 있는 매우 작은 시스템에도 영향은 여전히 매우 작지만 측정할 수 있으며 가볍게나마 고려해야 합니다. 레이턴시와 시스템 영향은 서로 직접적으로 관련되어 있습니다.
다양한 RAID 레벨에 대한 레이턴시와 시스템 영향을 이런 방식 외에는 간단하게 말할 방법이 없습니다: RAID 0과 RAID 10은 사실상 레이턴시나 영향이 없고, RAID 5는 일부 레이턴시와 영향이 있으며, RAID 6은 RAID 5보다 약 두 배의 계산 레이턴시와 영향이 있고, RAID 7은 RAID 5보다 약 세 배의 계산 레이턴시와 영향이 있습니다.
많은 경우 이 레이턴시와 시스템 영향은 너무 작아서 표준 시스템 도구로 측정할 수 없으며 현대 프로세서가 점점 더 강력해짐에 따라 레이턴시와 시스템 영향은 계속 감소할 것입니다. 약 2001년부터 저사양 범용 하드웨어에서도 RAID 5와 RAID 6 시스템의 영향은 무시할 수 있는 것으로 간주되었습니다. 하지만 많은 양의 패리티 RAID 활동이 있는 무거운 부하의 시스템에서는 RAID 서브시스템과 시스템 자원을 요구하는 다른 프로세스 간에 경합이 있을 수 있습니다.
참고: The IT Hollow - RAID 페널티 이해하기
기사 원문은 StorageCraft 블로그 - RAID 성능에 게재되었습니다.
