본문 바로가기

CS/컴퓨터구조

[컴퓨터구조] External Memory(2)

현재 글은 컴퓨터 구조와 아키텍처 서적 및 대학에서 들은 강의를 기반으로 한다.


Disk Array

Disk Array는 가격이 저렴한 디스크 여러개를 하나의 큰 논리적 디스크처럼 사용하는 방식이다. 데이터는 여러개의 디스크에 분산되어 저장되며, 각 디스크는 독립적으로 I/O 작업이 가능하므로 전반적인 처리 속도가 빨라지는 장점이 존재한다.

Disk Array 방식과 단일 디스크를 비교한 표

 위 표에 따르면 Disk Array 방식을 이용하는 경우 차지하는 공간, 파워, 전송율, 초당 처리율 및 가격 면에서 하나의 성능이 뛰어난 디스크를 사용하는 것에 비해 더 좋다는 것을 알 수 있다. 그러나 단순히 데이터를 분산하여 저장하기만 하는 방식은 하나의 디스크만 망가지더라도 연관된 모든 디스크가 영향을 받아 전체 데이터는 사용할 수 없게 되므로 위 그림 기준 수명이 50000/70 = 700시간 정도로 감소하는 문제가 있다. 따라서 디스크의 수명을 늘리기 위한 방법이 필요하다.

RAID

RAID(Redundant Array of Independent/Inexpensive Disk)는 Disk Array의 수명이 단일 디스크보다 짧아지는 문제를 해결하기 위해 등장한 방법으로, 기존 데이터들에 대한 추가적인 정보를 디스크 상에 함께 저장하여 이를 기반으로 고장이 발생한 데이터들을 복구할 수 있도록 한다.

 많은 디스크들을 중재 또는 관리하기 위한 디스크 컨트롤러가 필요하다. 하드웨어/소프트웨어 모두 가능하며 최근에는 다음과 같은 이유로 소프트웨어 방식의 컨트롤러의 인기가 증가한다고 한다.

  • 하드웨어 방식의 컨트롤러는 가격이 좀 나가는 편이다.
  • 분산된 서버에 대해 하드웨어 컨트롤러를 사용하면 서버 측의 부하가 커지므로 소프트웨어를 이용한다.
  • 클러스터링 기반 네트워크의 속도를 따라잡기 위해 소프트웨어가 필요하다.

RAID에는 7가지 레벨이 존재한다. 각 레벨 사이에 계층 관계는 없으며, 다음 3가지 조건을 공통적으로 만족한다.

  1. 여러개의 물리적 디스크들은 OS 수준에서 단일 논리적 디스크로 보인다.
  2. 데이터는 striping에 의해 여러 물리적 디스크들에 분산되어 저장된다.
  3. Redundant Disk들은 패리티 등 디스크가 고장났을 때 데이터 복구를 보장할 수 있는 정보를 저장하는데 사용된다.

데이터는 각 디스크에 대한 로드를 균등하게 만들고, 병렬 접근이 가능하도록 작은 단위로 분산되어 저장되어야 한다.

RAID 레벨 별 특성을 정리한 표


RAID 0 (Striping)

RAID 0(Nonredundant)

 데이터를 strip 단위로 나누어 round robin 방식으로 각 디스크에 저장하되, 추가되는 정보나 중복이 없는 형태이다. 각 디스크 단위로 독립적인 I/O가 가능하기 때문에 기존에 비해 속도가 빨라지는 장점이 있으나, 데이터 복구를 위한 장치가 존재하지 않으므로 고장에 대한 내성이 매우 낮다. 데이터를 복구하기 위한 공간이 따로 없는 상태.


RAID 1 (Mirroring)

RAID 1(Mirrored)

 동일한 내용의 데이터를 가진 디스크를 여러개 두는 방식이다. 디스크의 내용이 완전히 동일하기 때문에 한 디스크가 고장나면 동일한 내용을 가지고 있는 다른 디스크로 바로 대체하여 사용할 수 있다. 데이터는 striping되서 저장되며, 논리적 디스크 수준의 strip가 두개의 물리적 디스크 상의 strip에 대응된다.

  • 장점
    • 동일 데이터를 가진 두 물리적 디스크 중 더 빠르게 전송된 데이터를 읽어올 수 있으므로 읽기 속도가 빨라진다.
    • 패리티 계산 등 데이터 복구를 위한 연산 대신 단순히 동일 데이터를 두 디스크에 쓰기만 하면 되므로 추가적인 연산에 소모되는 시간이 없다( no write panalty ).
    • 디스크가 고장나면 동일한 데이터를 가진 디스크로 대체하면 되므로 복구 과정이 매우 간단하다.
  • 단점
    • 데이터 중복 저장으로 인해 2N개의 디스크가 필요하므로 다른 레벨에 비해 비용이 많이 높다.

Parallel Access: RAID 2, RAID 3

 RAID 2와 RAID 3은 모든 디스크가 항상 전송 과정에 참여하여 병렬적으로 동작함으로써 데이터 전송율을 높이는 것을 목적으로 한다.

RAID 2

RAID 2(Redundancy through Hamming Code)

 데이터를 바이트, 워드 단위의 매우 작은 크기의 strip으로 관리하며 추가적인 디스크에 해당 데이터들에 대한 해밍 코드를 저장하는 방식. 데이터 디스크(b)의 데이터들에 대해 패리티 비트가 연산되어 패리티 디스크(f)에 저장된다. 해밍 코드를 사용하므로 고장난 위치를 특정할 수 있으며 Single Error Correction & Double Error Detection이 가능하다.

 RAID 1에 비해 디스크 수 자체는 줄어든 편이지만 패리티 디스크는 데이터 전송 과정에 전혀 사용되지 않는 오버헤드로 작용하는 쓸모없는 디스크에 불과하다. 또한 고장난 위치를 쉽게 특정할 수 있더라도  패리티 디스크 및 고장나지 않은 디스크들을 이용하여 연산하는데 걸리는 복구 시간이 훨씬 길다는 점에서 실효성이 떨어지는 편이다.

  따라서 디스크에 에러가 매우 빈번하게 발생하는 상황이 아닌 이상 RAID 2는 거의 사용되지 않는다.

RAID 3

RAID 3(Bit-Interleaved Parity)

  RAID 2는 해밍 코드를 기반으로 에러가 발생한 위치를 바로 식별할 수 있다는 장점이 있었으나, 에러의 발견보다 해당 에러를 수정하는데 훨씬 긴 시간이 필요하다는 점에 있어서 해밍 코드를 저장했던 패리티 디스크들이 단순히 오버헤드로 작용하는 문제가 있었다. RAID 3은 해밍코드 대신 패리티 비트 하나만을 이용하여 에러를 처리한다.

 패리티 디스크의 개수가 하나로 감소하므로 불필요한 데이터에 대한 오버헤드를 크게 줄일 수 있다는 장점이 있다. 그러나 패리티 비트 하나만으로는 다중 비트 에러 에러 상황을 구분할 방법은 없다.

P  = D3⊕D2⊕D1⊕D0
D1= P⊕D3⊕D2⊕D0

Independent Access: RAID 4, RAID 5, RAID 6

  RAID 4 ~ 6에서는 모든 디스크가 독립적인 I/O을 수행하는 상황을 다룬다. 은행 업무처럼 높은 I/O Request rate을 가지고 있어 이를 병렬적으로 처리해야 하는 경우에 적합한 구조이다.

RAID 4

RAID 4(Block-level Parity)

 strip의 크기가 이전 계층에 비해 커진다. 각 데이터는 블럭 단위로 처리되며, 패리티 비트 역시 블럭 단위로 구성된다. RAID 3처럼 패리티 비트가 하나의 패리티 디스크에 집중되어 저장된다.

 데이터를 쓸 때 패리티 비트의 연산은 다음과 같다.

P’=D3D2D1’D0 (3 reads and 2 writes)
->
P’=D3D2D1’D0D1D1
   =PD1’D1
(2 reads and 2 writes)

 데이터 읽기에는 하나의 디스크만 참여하기 때문에 Parallel Read가 가능하다. 반면 쓰기 과정에는 데이터 디스크 및 패리티 디스크가 반드시 참여하게 되므로 Parallel Write는 불가능하다. 즉, 쓰기 성능이 떨어지는 편이므로 데이터가 거의 변하지 않는 환경에 적합하다.

RAID 5, RAID 6

RAID 5(Block-level distributed Redundancy)

 RAID 5는 블럭 단위 패리티 비트 역시 데이터처럼 여러 디스크에 분산 저장하여 모든 쓰기 작업을 동시에 진행하지는 못하더라도 일부 디스크에 대한 Parallel Write을 가능하게 만든다. 이를 통해 RAID 4에서 발생하던 I/O 병목 현상을 피할 수 있다. 

RAID 6(Dual Redundancy)

 RAID 6은 RAID 4, 5에서 사용하는 XOR 기반 패리티 이외에 Reed-Solomon code 라는 연산을 이용한 패리티를 추가적으로 둬서 데이터 복구율을 더 높이는 방식이다. 추가된 패리티에 대한 디스크가 필요하며, write panalty가 증가한다.

 


Multiple Level

 RAID의 각 레벨은 함께 사용될 수 있다. 일반적으로 RAID 1 이상을 적용한 구조에 RAID 0을 적용하여 성능을 높인다.

  • RAID 01: 분산하여 저장한 것(0)을 미러링(1)
  • RAID 10: 미러링해놓은 단위를(1) 분산(0)

RAID 1은 RAID 0의 striping과 떨어질 수 없는 관계이므로 RAID 01 또는 RAID 10의 구조를 가지게 된다. 이외의 가능한 구조들은 https://en.wikipedia.org/wiki/Nested_RAID_levels 을 참고하자.


 

HDD와 SSD 비교

HDD에 대한 SSD의 특성을 나타낸다.

  • IOPS(Input Output Per Second) 높음
  • Durability 높음: SDD에는 기계적 움직임(모터 회전 등)이 필요하지 않아 고장이 덜하다.
  • Long lifespan: 하드디스크에 비해 수명이 긴 편이다.
  • Power 소모 적음
  • 조용하며, 쿨러와 함께 사용할 수 있다.
  • access time이 작고, bandwidth 높다.

SSD에서 고려할 점들

  1. 디바이스를 사용할 수록 속도가 낮아지는 경향성이 있다.
    : 블럭 단위로 데이터를 지우기 때문에 시간이 오래 걸림. 변경되지 않는 데이터를 RAM 버퍼에 저장 + 이후 다시 블럭 단위로 작성해야 하는 문제가 발생. 
  2. 일정 횟수 이상 쓰면 더 이상 사용할 수 없어진다.

이를 해결하기 위한 방법에는 다음과 같은 것들이 있다.

  1. 캐시를 둬서 쓰기 속도를 높인다.
  2. wear-leveling 통해 전반적인 쓰기 수준을 평준화하여 수명을 늘린다.
  3. Bad block을 관리하는 시스템 또는 기능을 이용한다.

FTL(Flash Translation Layer)

플래시 드라이브를 일반적인 디스크처럼 block device처럼 사용할 수 있도록 에뮬레이션 해주는 소프트웨어. OS 또는 펌웨어 형태로 구현될 수 있다. Address Translation, Garbage Collection, Wear Leveling, Parallelization 등 다양한 방법을 이용하여 플래시 드라이브를 관리해주는 소프트웨어 시스템이라고 볼 수 있다.

 

'CS > 컴퓨터구조' 카테고리의 다른 글

[컴퓨터구조] Instruction set(1)  (1) 2022.11.07
[컴퓨터구조] I/O  (0) 2022.11.03
[컴퓨터구조] External Memory(1)  (0) 2022.10.19
[컴퓨터구조] Internal Memory(2)  (1) 2022.10.18
[컴퓨터구조] Internal Memory(1)  (0) 2022.10.12