Multi-streamed SSD Research

Multi-streamed SSD

What is that?

Multi-streamed SSD는 stream 인터페이스 지원을 통해 stream 별로 flash block에 데이터를 저장할 수 있는 SSD를 말한다. Multi-stream 기술의 철학은 비슷한 lifetime을 가지는 데이터끼리 동일한 stream으로 그룹핑하여 동일한 flash block에 저장하게 하는 것이다. 이를 통해서 SSD의 Garbage Collection(GC) 연산에 대한 오버헤드를 줄여준다.

Background for understanding Multi-streamed SSD

먼저 SSD에서 Garbage Collection(GC) 연산의 필요성과 GC 연산이 SSD에 어떤 성능적 영향을 미치는지 알아보자. GC 연산은 SSD내의 free block을 만들기 위한 remove 연산이다. 여기서 알아두어야 할 것은 SSD는 write/read의 연산 단위와 remove 연산 단위가 다르다는 점이다(1). write/read는 page단위로 수행되는 것과 비교해 remove 연산은 여러 page로 구성된 block 단위로 수행된다.(참고로 연산 자체의 실행시간도 remove가 가장 오래걸린다.) 또한 SSD는 in-place update를 지원하지 않는다(2). 따라서 update 작업이 수행될 때, 기존 데이터가 위치한 page에 overwrite되지 않고 새로운 page에 최신 버전의 데이터가 기록되며 old-version의 데이터를 가지는 page는 invalid의 상태로 전환된다. 이렇게 생성된 invalid page들은 GC 연산이 수행되면서 free page로 전환된다. 하지만, (1)에서 언급한 것과 같이 remove는 block 단위로 수행된다. 따라서 block내에 valid page가 존재한다면 다른 free block의 page로 copy해주는 추가작업이 요구되어 진다. 이를 GC overhead라 한다. 정리하자면, SSD의 (1),(2)의 특성으로 GC 연산시에 overhead가 발생하고, 이러한 오버헤드는 SSD의 성능뿐 아니라 수명에도 영향을 미치기 때문에 GC overhead를 최소화하는 것은 매우 중요하다.

그렇다면 어떻게 GC overhead를 줄일 수 있을가?
생각해보자. GC overhead는 block 삭제 과정에서 valid page를 다른 block으로 copy하기때문에 발생하는 것이다. 그러면 block내의 데이터들이 모두 invalid page라면 GC 연산시에 오버헤드는 zero일 것이다. page가 invalid되는 경우는 update 작업이 수행될 때 그리고 호스트에서 해당 데이터를 지웠을 때이다; 우리는 파일시스템 레벨에서 데이터를 지우면 바로 데이터가 사라지는 것으로 인식하지만, 실제로 SSD에서는 해당 데이터의 페이지들을 invalid 상태로 전환시켜 놓고 나중에 한꺼번에 지워버린다.
간단히 생각해보면 block에 포함된 page들이 함께 지워지면된다. 즉, 비슷한 lifetime을 가지는 데이터들이 같은 block내에 있으면 된다. 이 경우 비슷한 시기에 block내의 page들이 invalid되어 GC 연산시 한꺼번에 같이 지워질 수 있다. 이러한 배경에서 비슷한 lifetime을 가지는 데이터들을 stream 단위로 그룹핑하여 같은 block에 저장할 수 있도록한 multi-streamed SSD가 등장한 것이다.

Trend

Multi-streamed SSD의 효과는 “어떤 기준으로 데이터 lifetime을 나누어 stream을 할당 할 것인가” 의 여부에 전적으로 달려있다. 초기 연구에서는 응용레벨에서 데이터 lifetime을 나누는 최적화 작업이 많이 진행되었다. 이러한 응용수준에서의 최적화는 응용 정보를 기반으로 데이터의 lifetime을 명확히 구분할 수 있어 multi-stream 기능을 최대로 활용할 수 있었다. 하지만, multi-stream 기능을 이용하기 위해서는 각 응용의 코드를 고쳐야한다는 한계를 가지고 있다. 이러한 한계를 극복하기 위해서 “파일시스템”, “블록 레이어” 수준에서 stream을 할당하여 응용의 수정없이 모든 응용이 multi-stream 기능을 이용할 수 있는 연구로 발전해 나갔다. 궁극적으로는 데이터 lifetime을 응용 수준에서 할당한 것 처럼 잘 나눌 수 있으면서 multi-stream 기능을 투명하게 사용할 수 있어야한다. 최근에는 program context를 기반으로 stream을 투명하게 할당해주는 연구가 진행되었다.

Discussion

Multi-streamed SSD를 통해서 얻을 수 있는 장점은 크게 2가지이다. 가장 확실한 장점은 lifetime이 다른 데이터들을 block 별로 분리시켜 GC시 불필요한 copy를 줄임으로써 SSD의 lifetime을 늘려준다는 점. 그리고 GC로 인한 write/read의 성능을 저하를 줄인다는 점이다. 하지만 두번째 언급한 장점은 반만 맞는 이야기라 말할 수 있을 것 같다. 일반적으로 GC로 인한 성능저하는 SSD 내부의 여유공간이 부족할 때 나타난다. 즉, 여유 공간이 많은 경우에는 GC로 인해 발생하는 추가적인 copy로 인해 write/read의 성능에 영향을 크게 주지 않는다. 따라서 대부분의 I/O 환경에서 일반 SSD와 Multi-streamed SSD는 거의 비슷한 성능을 보인다. Multi-streamed SSD를 통해서 성능적 이점을 얻기위해서는 SSD에 상당한 I/O 부하를 주며, SSD의 사용량이 많은 환경에서 사용해야한다. 대표적으로 Burst Buffer의 스토리지 디바이스로 multi-streamed SSD를 활용했을 때 성능적 이점을 얻을 수 있다. 그 외의 Multi-streamed SSD가 SSD 자체의 lifetime을 증진시켜주는 것 이외에 일반 SSD와 비교하여 성능적 이점을 보장해줄만한 환경은 그리 많지 않은 상황이다. Multi-streamed SSD의 전망은 그리 맑아보이지는 않지만, 그럼에도 HPC 환경과 같은 곳에서 special purpose의 형태로는 사용되어 질 것으로 보인다.


Comments: