지능형 스토리지 시스템은 프로트엔드, 캐시, 백엔드, 물리적 디스크라는 4개의 주요 요소를 갖는다. 호스트의 I/O 요청은 프론트엔드 포트에 도착해 캐시와 백엔드를 통해 처리돼 물리적 디스크로부터 데이터를 추출하거나 저장하게 된다. 요청된 데이터가 캐시에 있으면 캐시에서 바로 읽기 요청을 처리할 수 있다. 최신 지능형 스토리지 시스템에서는 프론트엔드와 캐시, 백엔드는 보통 단일 보드(스토리지 프로세서 storage processor 나 스토리지 컨트롤러 storage controller라고 함)에 집적된다.
프론트엔드는 스토리지 시스템과 호스트 사이의 인터페이스를 제공한다. 이는 프론트엔드 포트와 프론트엔드 컨트롤러라는 2개의 컴포넌트로 구성된다. 보통 프론트엔드는 고가용성을 위해 여분의 컨트롤러를 갖고 있으며, 각 컨트롤러는 여러 개의 포트를 갖고 있어, 많은 호스트가 지능형 스토리지 시스템에 연결할 수 있다. 각 프론트엔드 컨트롤러는 스토리지 연결을 위해 파이버 채널이나 iSCSI, FICON, FCoE 등의 알맞은 전송 프로토콜을 실행하는 처리 로직을 갖고 있다.
프론트엔드 컨트롤러(front-end controller)는 내부 데이터 버스를 통해 캐시와 데이터를 주고받는다. 캐시가 쓰기 데이터를 받으면 컨트롤러는 호스트에게 수신확인(acknowledgment) 메시지를 호스트에게 보낸다.
캐시는 호스트의 I/O 요청 처리 시간을 줄이기 위해 데이터를 임시 저장하는 반도체 메모리를 말한다.
캐시는 호스트가 회전 디스크나 하드 디스크 드라이브(HDD, hard disk drive)의 기계적 지연 시간을 기다리지 않게 해 성능을 향상시킨다. 회전 디스크는 지능형 스토리지 시스템에서 가장 느린 컴포넌트다. 회전 디스크의 데이터 액세스는 탐색 시간과 회전 지연 시간으로 인해 수 밀리초가 걸린다. 캐시에서 데이터를 액세스하면 밀리초 이하의 시간이 걸려 매우 빠르다. 지능형 어레이에서 쓰기 데이터는 먼저 캐시에 적재된 후 디스크에 기록된다.
캐시는 캐시 할당의 가장 작은 단위인 페이지로 구성된다. 캐시 페이지의 크기는 애플리케이션 I/O 크기에 따라 결정된다. 캐시는 데이터 스토어(data store)와 태그 RAM(tag RAM)으로 구성된다. 데이터 스토어는 데이터를 저장하고, 태그 RAM은 데이터 스토어와 디스크에서의 데이터 위치를 추적한다.
태그 RAM의 엔트리는 데이터의 캐시 위치와 디스크의 위치를 알려준다. 태그 RAM에는 더티 비트(dirty bit) 플래그가 있다. 이는 캐시의 데이터가 디스크에 커밋됐는지 알려준다. 여기에는 또한 최근 액세스 시간 같은 시간 관련 정보도 있다. 이 정보는 장기간 사용되지 않아 제거될 수 있는 캐시 정보를 판별하는 데 사용한다.
호스트가 읽기 연산을 요청하면 스토리지 컨트롤러는 태그 RAM을 읽어 요청한 데이터가 캐시에 있는지 확인한다. 요청 데이터가 캐시에 있으면 이는 읽기 캐시 히트(read cache hit) 또는 읽기 히트라고 하며, 디스크 연산 없이 데이터를 바로 호스트에 전송한다. 이를 통해 호스트에게 매우 빠른 응답 시간을 제공한다(약 1밀리초). 요청 데이터가 캐시에 없으면 이는 캐시 미스(cache miss)라고 하며, 디스크로부터 데이터를 읽어야 한다. 백엔드가 디스크에 액세스해 요청 데이터를 가져온다. 이 데이터는 캐시에 저장되고 최종적으로 프론트엔드를 거쳐 호스트에게 전송한다. 캐시 미스는 I/O 응답 시간을 증가시킨다.
시퀀셜 읽기 요청인 경우에는 프리페치(prefetch)나 미리 읽기(read-ahead) 알고리즘을 사용한다. 시퀀셜 읽기 요청은 연속된 블록을 가져온다. 호스트가 아직 요청하지 않은 다른 블록도 디스크에서 읽어와 캐시에 미리 저장한다. 호스트가 이후에 이 블록을 요청하면 읽기 히트가 발생한다. 이 과정은 호스트의 응답 시간을 상당히 감소시킨다. 지능형 스토리지 시스템은 고정된 크기나 변동 크기 프리페치 크기를 지원한다. 고정 크기 프리페치(fixed prefetch)에서는 지능형 시스템이 고정된 양의 데이터를 프리페치한다. 호스트 I/O 크기가 일정한 경우 사용한다. 변동 크기 프리페치(variable prefetch)에서는 스토리지 시스템이 호스트가 요청한 크기의 배수만큼의 데이터를 프리페치한다. 최대 프리페치 한도를 정해 프리페치로 인해 너무 많은 I/O가 발생하지 않게 한다.
읽기 성능은 읽기 히트 비율(read hi ratio)이나 히트 비율로 측정된다. 이 비율은 전체 읽기 요청에서 읽기 히트가 발생한 비율이다. 읽기 히트 비율이 높을수록 읽기 성능이 향상된다.
캐시를 사용하면 디스크에 직접 쓸 때보다 성능이 향상된다. I/O가 캐시에 기록되고 확인 메시지를 보내면, 디스크에 직접 기록할 때보다 훨씬 적은 시간이 걸린다(호스트의 관점에서). 시퀀셜 쓰기의 경우에도 캐시를 사용하면 작은 쓰기 연산을 합쳐 더 큰 데이터를 디스크에 전달함으로써 최적화할 수 있다.
캐시를 사용한 쓰기 연산은 다음과 같이 구현된다.
- 후 기입 캐시(write-back cache)
캐시에 데이터를 저장하고 바로 호스트에게 응답메시지를 보낸다. 그리고 후에 여러 쓰기 데이터가 디스크에 커밋된다. 쓰기 연산에서 기계적인 디스크 지연 시간이 없어지기 때문에 응답 시간이 매우 빨라진다. 그러나 커밋되지 않은 데이터로 인해 캐시 실패가 발생하면 데이터를 잃을 수 있다.
- 연속 기입 캐시(write-through cache)
데이터를 캐시에 저장하고 바로 디스크에 저장하며 호스트에게 응답 메시지를 보낸다. 데이터가 바로 디스크에 커밋되기 때문에 데이터를 잃을 위험은 줄어든다. 그러나 디스크 연산으로 인해 쓰기 응답 속도가 길어진다.
많은 데이터를 기록하는 I/O 같은 특정 상황에서는 캐시를 우회할 수 있다. 이런 구현에서는 I/O 요청의 크기가 쓰기 우회 크기(write aside size)라 불리는 지정한 크기를 넘어서면 바로 디스크에 기록해 쓰기 연산이 캐시 공간을 많이 사용하는 이을 방지한다. 이는 캐시 크기가 제한되고 캐시가 주로 작은 랜덤 I/O에 필요한 경우 많이 사용한다.
'IT > Storage' 카테고리의 다른 글
스토리지 프로비저닝 (0) | 2022.09.03 |
---|---|
캐시 와 플러시 (0) | 2022.08.09 |
디스크 드라이브 성능 (0) | 2022.06.30 |
디스크 드라이브 컴포넌트 (0) | 2022.06.29 |
인터페이스 프로토콜과 스토리지 (0) | 2022.06.29 |