11. Mass-Storage Structure

대용량 기억 장치의 구성을 알아보자. 현대 컴퓨터의 주 대용량 기억 장치는 2차 저장소로, 대개 HDD나 비활성 메모리 기기이다. 어떤 시스템은 더 느리고 큰 3차 저장소를 쓰기도 한다. (마그네틱 테이프, 광학 디스크, 클라우드 저장소 등)

11.1. Overview of Mass-Storage Structure

현대 컴퓨터의 이차 저장소는 대개 하드 디스크 드라이브(HDD)나 비휘발성 메모리(NVM) 기기이다.

11.1. Hard Disk Drives

하드 디스크 드라이브는 상대적으로 간단하다. 각 디스크 플래터는 평평한 원형이다. 읽기-쓰기 헤드는 플래터의 표면에 파일을 기록하거나 읽는다. 이 헤드는 디스크 암에 부착된다. 플래터의 표면은 원형 트랙으로 나뉘어지고, 이 트랙은 또 섹터로 나뉘어진다. 각 암 위치의 트랙들은 실린더를 구성한다. 디스크 드라이브 모터는 특정 분당 회전수(RPM)만큼 회전한다. 이는 성능의 주요 요소인 전환율에 관계가 있다. 전환율 외에 성능에 영향을 미치는 요소는 위치 결정 시간, 또는 무작위 접근 시간으로 이는 탐색 시간회전 대기 시간의 두 가지로 구성된다. 헤드가 디스크의 얇은 막을 뚫고 피해를 입히면 헤드 크래시가 일어나며 이는 복구가 불가능하다. 많은 저장소 미디어는 제거 가능하며 이는 시스템이나 저장소 샤시를 끄지 않고도 하드 디스크를 제거 가능하게 만든다.

11.1.2. Nonvolatile Memory Devices

비휘발성 메모리에 대해 알아보자.

11.1.2.1. Overview of Nonvolatile Memory Devices

플래시 메모리 기반 비휘발성 메모리는 고체 상태 디스크(SSD)에서 사용되고 USB 드라이브에서도 사용된다. 비휘발성 메모리는 하드 디스크에 비해 이동 부분이 없고 탐색 시간이나 회전 대기 시간이 없기 때문에 더 빠르다. 단점은 더 비싸다는 것이다. 이 경우 표준 버스 인터페이스가 처리량에 대한 병목이 된다. NAND 반도체는 저장 가용성을 나타내는 척도로 일당 드라이브 쓰기(DWPD)를 쓴다.

11.1.2.2. NAND Flash Controller Algorithms

NAND 반도체는 한 번 써진 뒤에 덮어써질 수 없으므로 무효한 데이터를 담는 페이지가 있을 수 있다. 유효한 데이터를 담는 논리적 블록을 추적하기 위해 컨테이너는 플래시 전이 층(FTL)을 유지해 이를 추적한다. SSD가 꽉 차있을 때 각 페이지가 무효한 데이터를 얼마간 담고 있다면 쓰레기 수집을 발생시켜 이들을 정리할 수 있다. 쓰레기 수집이 데이터를 쓸 공간을 확보해놓기 위해 NVM 기기는 과공급을 한다. 과공급은 적게 지워진 블록에 데이터를 할당하는 방식으로 웨어 레벨링에도 도움을 준다. 데이터 보호에 관해서는 HDD와 마찬가지로 NVM도 에러 수정 코드를 둔다.

11.1.3. Volatile Memory

DRAM도 대용량 기억 장치로 쓰인다. RAM 드라이브는 2차 저장소처럼 동작하는데 이는 디바이스 드라이버가 시스템의 DRAM 섹션을 잘라내어 시스템의 나머지 부분이 이를 저장소처럼 여기도록 하는 것이다. RAM 드라이브는 고속 임시 저장소로 쓰기에 유용하다.

11.1.4. Secondary Storage Connection Methods

이차 저장소는 시스템 버스 또는 I/O 버스에 의해 컴퓨터와 연결된다. 버스에는 여러 종류가 있는데, 고급 기술 결합(ATA), 직렬 ATA(SATA), eSATA, 직렬 부착 SCSI (SAS), 전역 직렬 버스(USB), 광 채널(FC) 등. SATA가 가장 널리 쓰인다. NVM은 HDD보다 빠르기 때문에, 산업에서는 NVM을 위한 특별한 인터페이스인 NVM 익스프레스(NVMe)를 만들었다.

버스에서의 데이터 교환은 컨트롤러(호스트-버스 어댑터(HBA))라는 특별한 전자 프로세서에 의해 이루어진다. 호스트 컨트롤러는 버스의 끝에 있는 컴퓨터에 대한 컨트롤러이다. 디바이스 컨트롤러는 각 저장 기기에 내장된다. 대형 저장소 I/O 동작을 위해서 컴퓨터는 호스트 컨트롤러에 명령어를 위치시키고 호스트 컨트롤러는 이 명령어를 디바이스 컨트롤러에 보낸 뒤 컨트롤러는 드라이브 하드웨어를 통해 이 명령어를 실행한다.

11.1.5. Address mapping

저장소 기기는 큰 일차원 배열인 논리적 블록으로 이루어져 있다. 논리적 블록 주소(LBA)는 알고리즘이 실린더 섹터, 헤드 튜플 등에 비해 다루기 쉽다. 이 논리적 블록과 물리적 주소간 매핑을 실제 구현할 때는 고려사항이 있는데, 상수 선속도(CLV)를 쓸지와 상수 각속도(CAV)를 쓸지에 대한 것이다.

11.2. HDD Scheduling

하드웨어 스케쥴링 방법에 의해 알아보자. 목표는 디바이스 대역폭을 최대화시키고 접근 시간의 평균과 분산을 최소화시키는 것이다.

11.2.1. FCFS Scheduling

가장 간단한 것은 선입 선출 스케쥴링이다.

11.2.2. SCAN Scheduling

실제로는 SCAN 알고리즘(엘레베이터 알고리즘)이 많이 쓰인다. 이는 디스크 암이 디스크의 한 쪽 끝에서부터 시작해서 다른 쪽 끝까지 이동해 나가며 각 실린더에 도착할 때마다 요청을 받는다. 다른 쪽 끝까지 이동하면 다시 반대쪽 끝으로 이동해 나간다.

11.2.3. C-SCAN Scheduling

원환 SCAN (C-SCAN) 스케쥴링은 SCAN의 변형으로서 다른 쪽 끝까지 이동했을 때 반대쪽 끝으로 즉시 위치를 변경한다.

11.2.4. Selection of a Disk-Scheduling Algorithms

SCAN과 C-SCAN 스케쥴은 부하를 크게 주는 시스템에서 성능이 더 좋은데, 기아 문제를 적게 일으키기 때문이다. 기아 문제는 여전히 발생하므로 Linux에서는 만기 스케쥴러를 둔다. Linux의 RHEL 7에서는 2가지 대안도 두는데, 하나는 완전 공정 큐 스케쥴러(CFQ)이고 다른 하나는 NOOP이다.

11.3. NVM Scheduling

NVM은 디스크 헤드를 이동시키지 않으므로 대개 간단한 선입선출 알고리즘을 쓴다. Linux NOOP 스케쥴러는 선입선출을 쓰나 인접 요청을 통합시킨다. I/O는 순차적으로 또는 무작위적으로 발생할 수 있다. 무작위 I/O는 초당 입출력 연산수(IOPS)로 성능이 측정되며 NVM에서 훨씬 빠르다. NVM에서 쓰레기 수집은 성능에 영향을 크게 미치는데 애플리케이션이 아니라 오로지 NVM의 쓰레기 수집으로부터 생성되는 I/O 요청을 쓰기 증폭이라 한다.

11.4. Error Detection and Correction

에러 감지는 에러가 발생했는지를 감지한다. 이 방법에는 홀짝성을 포함한 체크섬, 순환 중복 검사(CRC) 등이 있다. 에러 정정 코드(ECC)는 에러를 감지할 뿐만 아니라 수정한다. ECC가 수정할 수 있는 에러는 소프트 에러이고 아니면 하드 에러이다.

11.5. Storage Device Management

저장소 관리법을 알아보자.

11.5.1. Drive Formatting, Partitions, and Volumes

새로운 저장소 기기를 쓰기 위해서는 먼저 포매팅을 해야 한다. 이를 저수준 포맷(물리적 포맷)이라 한다. 또한 운영체제는 자체적 자료구조를 기기에 쓸 필요가 있다. 이는 3단계로 구성된다. 첫째는 기기를 복수의 블록이나 페이지의 그룹으로 파티션하는 것이다. 파일 시스템을 파티션에 마운팅하는 것은 시스템을 사용가능하게 해준다. 둘째는 볼륨을 생성하고 관리하는 것이다. 셋째는 파일 시스템을 만드는 논리적 포매팅이다.

효율성을 위해 대부분의 파일 시스템은 블록들을 더 큰 블록인 클러스터로 군집화한다. 어떤 운영체제는 특별한 프로그램들에 한해 파티션을 논리적 블록의 순차적 배열로 다룰 수 있게 하는데 이를 원시 디스크라 한다.

11.5.2. Boot Block

컴퓨터가 가동을 시작하려면 부트스트랩이라는 시작 프로그램이 필요하다. 이는 2차 저장소에서 전체 부트스트랩 프로그램을 불러올 수 있어야 한다. 이는 부트 디스크시스템 디스크에 저장된다. 부트스트랩 NVM의 코드는 저장소 컨트롤러가 부트 블록을 메모리로 읽어들이게 하고 그 코드를 실행시킨다. Windows의 경우 드라이브의 파티션 하나가 부트 파티션으로 나뉘어 있고 부트 코드는 하드 디스크의 마스터 부트 리코드(MBR)에 위치시킨다. 시스템이 부트 섹션을 인식하면 그 파티션의 첫 번째 섹터나 페이지(부트 섹터)를 읽고 실행한다.

11.5.3. Bad Blocks

디스크는 공장에서부터 불량 블록을 갖고 나오기도 한다. 많은 디스크들은 이 블록을 섹터 예비 또는 포워딩을 통해 운영 체제에 보이지 않도록 한다. 또는 대안으로 섹터 피하기를 사용하기도 한다. 소프트 에러의 경우 이런 방법들을 통해 데이터를 복원할 수 있다. 하드 에러의 경우 복원이 불가능하다.

11.6. Swap-Space Management

교환 공간 관리는 운영 체제의 주요 저수준 작업 중 하나이다.

11.6.1. Swap-Space Use

필요한 교환 공간은 시스템에 따라 크게 다르다. 이 공간의 크기는 과소추정하는 것보다 과다추정하는 것이 더 낫다.

11.6.2. Swap-Space Location

교환 공간은 일반 파일 시스템에서 잘라내어질수도 있지만 별개의 원시 파티션으로 둘 수도 있다. 이 원시 파티션 내의 할당/해제 알고리즘은 저장소 효율성 대신 속도에 최적화된다.

11.6.3. Swap-Space Management: An Example

Solaris에서는 교환 공간은 익명 메모리에만 사용하고, 교환 공간에 썼다가 다시 읽는 대신 파일 시스템에서 재읽기를 하는 방법을 쓴다. Linux는 Solaris와 비슷하지만 복수의 교환 공간이 설치될 수 있다. 각 교환 공간은 4KB의 페이지 슬롯들로 구성되며 각 교환 공간에는 교환 맵이 할당된다.

11.7. Storage Attachment

컴퓨터는 2차 저장소를 3가지 방법으로 접근한다. 호스트 부착 저장소, 네트워크 부착 저장소, 클라우드 저장소.

11.7.1. Host-Attached Storage

호스트 부착 저장소는 국소적 I/O 포트를 통해 접근된다. 하이엔드 워크스테이션이나 서버는 이런 I/O 포트로 광 채널을 쓴다. 이런 호스트 부착 저장소는 HDD, NVM, CD, DVD, 블루레이, 테이프 드라이브, 저장소 영역 네트워크 (SANs) 등이 있다.

11.7.2. Network-Attached Storage

네트워크 부착 저장소는 네트워크를 통해 접근된다. iSCSI는 최근의 네트워크 부착 저장소 프로토콜이다.

11.7.3. Cloud Storage

클라우드 저장소는 클라우드를 통해 접근된다. NAS와의 다른 점은 NAS는 그저 파일 시스템이나 원시 블록 디바이스처럼 동작하지만 클라우드 저장소는 API를 통해 접근된다. 이는 지연 시간이나 WAN이 실패하는 경우로 인해 생기는 차이이다.

11.7.4. Storage-Area Networks and Storage Arrays

NAS의 단점은 저장소 I/O 연산이 데이터 네트워크의 대역폭을 소모하므로 네트워크 통신의 지연 시간을 늘린다는 점이다. 저장소 영역 네트워크(SAN)는 개인 네트워크로서 서버와 저장소 단위를 연결한다. 이 저장소 배열은 RAID 보호되거나 비보호될 수 있다(JBOD). 저장소 배열은 SAN 포트나 네트워크 포트를 포함하는 특수 목적 기기로서 데이터를 저장할 드라이브와 컨트롤러를 포함한다. FC는 가장 흔한 SAN 상호 연결 장치이지만, 인피니밴드(IB)도 쓰인다.

11.8. RAID Structure

복수 배열 독립 디스크(RAIDs)는 컴퓨터 시스템에 복수의 독립된 하드 디스크를 부착함으로써 데이터의 가용성을 높이는 것이다.

11.8.1. Improvement of Reliability via Redundancy

복수의 디스크를 부착하는 것은 중복으로 인해 평균 고장 간격(MTBF)을 크게 낮추는 역할을 한다. 가장 간단한 방법은 모든 드라이브를 복제해 미러 드라이브를 만드는 미러링이다. 미러 볼륨의 평균 고장 간격은 평균 수리 간격이나 평균 데이터 유실 간격으로 측정된다. 그러나드라이브들의 고장은 독립적이지 않을 수 있다. 또한, 드라이브를 복제할 때는 한 번에 하나씩 복제하는 것이 필요하다.

11.8.2. Improvement of Performance via Parallelism

복수 드라이브에 대한 병렬화된 접근으로 성능을 높일 수 있다. 간단한 접근은 데이터를 복수 드라이브에 스트리핑하는 데이터 스트리핑이다. 이것이 비트 단위일 경우 비트 레벨 스트리핑이라 한다. 블록 단위일 겨웅 블록 레벨 스트리핑이라 한다. 이를 통해 반응 시간을 줄이고 처리량을 늘릴 수 있다.

11.8.3. RAID Levels

디스크 스트리핑과 디스크 중복을 통해 가용성과 성능을 전부 높이는 다양한 접근법이 있으며 이는 RAID 레벨로 나뉘어진다. RAID 레벨 0은 블록 레벨 스트리핑을 중복 없이 하는 것이다. RAID 레벨 1은 드라이브 미러링이다. RAID 레벨 4는 메모리 스타일 에러 교정 코드로도 알려져 있다. 이 때 읽기-수정-쓰기 사이클로 인해 하나의 쓰기 연산은 4회의 드라이브 접근을 필요로 한다. RAID 레벨 4는 레벨 1에 의해 저장소 오버헤드가 적고 블록의 집합을 읽거나 쓰는 전송율이 더 빠르다. 그러나 XOR 홀짝성을 계산하고 쓰는 데 있어 성능 문제가 있다. RAID 레벨 5는 레벨 4와 비슷하나 홀짝성을 모든 드라이브에 분산시킨다는 것이 다르다. 가장 많이 쓰인다. RAID 레벨 6은 P + Q 중복 스킴으로 알려져 있으며 레벨 5와 달리 복수의 드라이브 고장을 대비하기 위해 추가로 중복 정보를 둔다. XOR 홀짝성 대신 갈루아 체론을 사용한다. 다차원 RAID 레벨 6은 행렬 형태로 구현한 RAID 레벨 6이다. RAID 레벨 0 + 1 (또는 1 + 0)은 레벨 0과 레벨 1을 조합한 것이다. RAID의 구현은 여러 변형으로 구현될 수 있다.

스냅샷(마지막 업데이트 이전 파일 시스템의 보존)나 복제(독립된 사이트간 쓰기가 발생했을 때 자동 중복 쓰기)도 여러 레벨로 구현될 수 있다. RAID 구현에 대해 핫 스페어 드라이브도 사용된다.

11.8.4. Selecting a RAID Level

재구축 성능은 RAID 레벨 1이 가장 낫다. 데이터 손실이 치명적이지 않은 고성능 애플리케이션에 대해서는 레벨 0이 쓰인다. 레벨 1보다 공간 오버헤드가 적게 필요할 경우 레벨 5가 쓰인다. 레벨 6이나 다차원 레벨 6은 저장소 배열에 있어 가장 흔하다.

11.8.5. Extensions

RAID의 개념은 다른 저장소 기기에도 확장될 수 있다

11.8.6. Problems with RAID

RAID는 데이터 가용성 면에서 만능이 아니다. 그래서 Solaris ZFS는 체크섬을 아이노드에 저장해 유효성을 검증한다. 또한, RAID는 데이터 유연성이 부족하다는 단점도 있다. ZFS는 RAID 세트를 저장소 에 담아 이 문제를 해결한다.

11.8.7. Object Storage

또 다른 접근법은 데이터 저장소를 저장소 풀로부터 시작해 오브젝트를 그 풀에 넣는 것이다. 오브젝트 저장소 관리 소프트웨어로는 하둡 파일 시스템(HDFS)과 Ceph 등이 있다. 이는 횡적 확장성을 가진다. 이는 저장소 배열이 꽉 찼을 때 컴퓨터를 추가해 풀에 부착하기만 하면 확장이 가능하다는 것이다. 또한, 오브젝트 저장소는 연상 기억 장치이기 때문에 오브젝트가 그 내용물을 통해 접근될 수 있다. 이 때 시스템이 저장하는 것은 비구조화된 데이터이다.

11.9. Summary

  • 하드 디스크 드라이브나 비휘발성 메모리 디바이스는 대부분 컴퓨터의 주 2차 저장소 I/O 유닛이다. 현대 2차 저장소는 논리적 블록들의 큰 일차원 배열로 구조화되어 있다.
  • 여러 타입의 드라이브가 컴퓨터 시스템에 다음과 같은 방식으로 부착될 수 있다: 1) 호스트 컴퓨터의 로컬 I/O 포트를 통해, 2) 마더보드를 통해, 3) 통신 네트워크나 저장소 네트워크 연결을 통해.
  • 2차 저장소 I/O 요청은 파일 시스템을이나 가상 메모리 시스템에 의해 생성된다. 각 요청은 기기에서 참조될 주소를 논리적 블록 번호의 형태로 특정한다.
  • 디스크 스케쥴링 알고리즘은 HDD의 유효 대역폭, 평균 반응 시간, 반응 시간의 분산을 개선한다. SCAN이나 C-SCAN은 디스크 큐 순서를 통해 이런 개선을 한다. 디스크 스케쥴링 알고리즘의 성능은 하드 디스크에 대해서는 알고리즘마다 크게 차이가 난다. 그에 반해 고체 상태 디스크는 이동하는 부분이 없기 때문에 알고리즘마다 성능 차이가 크게 나지 않으므로 단순한 선입선출 알고리즘이 많이 쓰인다.
  • 데이터 저장소와 전송은 복잡하고 자주 오류를 발생시킨다. 에러 감지는 이런 에러를 감지해 시스템에 경고를 보내고 에러 전파를 막고 에러 수정을 유도시킨다. 에러 교정은 에러를 감지할 수도 있고 데이터가 오염된 정도와 교정할 가용 데이터의 양에 따라서 그것을 교정할 수도 있다.
  • 저장소 기기들은 하나 이상의 공간 덩어리로 분할된다. 각 분할은 단일 볼륨을 담거나 복수 기기 볼륨의 일부를 담는다. 파일 시스템은 볼륨들로 생성된다.
  • 운영 체제는 저장소 기기 블록을 관리한다. 새 기기는 먼저 포맷된 상태로 출하된다. 디바이스는 분할되고 파일 시스템이 생성되고 디바이스가 운영 체제를 포함한다면 시스템의 부트스트랩 프로그램에 부트 블록이 할당된다. 블록이나 페이지가 오염되면 시스템은 그 블록을 잠금 처리하거나 여분으로 논리적 대체를 해야 한다.
  • 유효 교환 공간은 특정 시스템들에서 좋은 성능을 얻는 데 있어 핵심이다. 어떤 시스템은 교환 공간에 원시 파티션을 할당하고 어떤 시스템은 파일 시스템 내 파일로 할당하기도 한다. 다른 시스템은 사용자나 시스템 관리자에게 두 선택지 중 하나를 결정하게 한다.
  • 대형 시스템에 필요한 저장 용량의 크기와 저장소 고장의 여러 가능성 때문에 2차 저장소 기기는 RAID 알고리즘으로 중복을 만들어 둔다. 이 알고리즘은 하나 이상의 드라이브가 각 연산에 의해 사용될 수 있게 하고 연속된 연산과 드라이브 고장 시 자동 복구도 수행한다. RAID 알고리즘은 여러 레벨로 구성되어 있으며 각 레벨은 각자 다른 가용성과 전송율의 조합으로 되어 있다.
  • 오브젝트 저장소는 인터넷 인덱싱이나 클라우드 사진 저장소 등에 대한 빅 데이터 문제에 쓰인다. 오브젝트는 자체 정의되는 데이터의 모음으로 파일명보다는 오브젝트 ID에 의한 주소값을 갖는다. 일반적으로 데이터 보호를 위해 복제를 쓰고, 데이터의 복제가 존재하는 시스템이 있다면 그 시스템 내 데이터에 기반해 연산을 한다. 이는 종적 확장이 쉽게 가능하다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중