Tuesday, December 13, 2016

DRAM-less SSD에 대한 고찰.

SSD라고 불리는 NAND storage는 DRAM을 기본적으로 장착하고 있다는 것이 상식이었다.
하지만, 최신 SSD중 일부는 DRAM없이(DRAM-less) 제품이 만들어지고 있으며, 이런 경향을 앞으로 더 가속될 것으로 예상된다.

사실, DRAM-less SSD에 사용된 기술은 새로울 것이 없다.
SSD가 아닌 NAND storage, 예를 들면 USB thumb drive, SD card, eMMC, UFS등은 DRAM이 없는 것이 기본이다. (일부 제품의 경우 DRAM이 있을 수도 있겠다..)

그러면 왜 최근 SSD에서 '새로울 것이 없는' DRAM-less에 주목하는 것일까?

그 이유를 알기위해 먼저 DRAM을 가진 SSD에서 DRAM의 용도를 먼저 알아볼 필요가 있다.

많은 사람들이 오해하는 사실 중 하나로 'SSD에서 DRAM은 data cache로 사용된다'는 것이다. 필자가 개발했거나, 개발예정인 SSD중에서 data cache로 사용된 DRAM의 용량은 전체의 1%이내이다.
그러면 나머지 대부분은 어떤 용도로 사용되는 것일까?

현 시대의 SSD는 흔히 말하는 page mapping방식(이 단어가 잘못사용된다는 점은 무시하자)을 사용한다. 그 중에서도 4KB를 하나의 단위로 사용하며, 이때 하나의 단위에 대한 mapping 정보는 4bytes로 구성된다.
느낌이 오는가?
4GB 짜리 SSD의 경우 mapping unit의 개수가 1024K개이고, 이때 mapping정보의 양은 4MB가 된다.
그렇다면.. 256GB의 SSD라면 map정보의 양이 256MB가 될 것이다.

그렇다,
DRAM의 대부분의 공간은 map정보를 저장하는데 사용되며, 이 공간은 SSD의 용량에 비례하여 커지게 되는 것이다.

다시, 원래의 질문으로 돌아가보자.
왜 최근 SSD는 DRAM-less에 주목하는 것일까?
최근 SSD는 V-NAND기술을 등에 업고 점점 커지고 있다.
기술의 첨탑에서는 수십 TB용량을 가진 SSD가 존재하며, 컨슈머 시장에서도 1TB SSD가 팔리도 있다. 그리고 곧 4TB SSD도 곧 팔릴 것이다.

4TB SSD는 DRAM-less SSD에게 기념비적인 용량이다.
이 용량의 SSD는 map정보만 4GB가 된다!!! 4GB는 어떤 의미인가?
4TB가 넘어가는 SSD는 (정상적인) 32 bit 컨트롤러에 장착할 수 있는 최대 DRAM크기 이상의 memory가 필요하다.

결국 32bit controller를 사용해서 4TB이상의 SSD를 개발하기 위해서는 DRAM-less에서 사용되던 '부족한 메모리'에 대한 기술이 필요한 것이다.


[SW 개발] Hierarchy에 대해서....

Hierarchy에서 중요한 점은.. 

아키텍처 측면에서 "중요한" 것이 상위로 가야 한다는 것이다. 


CPU의 개수라는 factor의 경우, 상위일 수도 있고 하위일 수도 있을 것이다.

그런데, 그 개수가 전체 SW에 영향을 미치면 상위에 놓고,
아주 국소적으로 영향을 미치는 것은 하위에 놓는다.

예를 들어, CPU개수에 따라서 해상도가 결정되고 해상도는 (플랫폼이 구려서) 많은 부분에 영향을 미치는 경우라면 최상위로 두는 것이 좋다.

반대로 (플랫폼이 좋아서) 병렬처리를 single과 똑같은 방법으로 구현하는 개발과정이라면 CPU개수는 아랫 단계로 내려놓는 것이 맞다.


이런 결정은 아무런 생각없이 직관적으로 내리는 경우 플랫폼이 품질이 떨어질 수 밖에 없을 것이다.


한가지 예를 들어보자,

여러 HW를 지원하는 개발과제가 있고, 여러 HW는 어쩔 수 없이 차이가 있을 것이다.
이 경우, 사소한 차이(예를 들면 register의 주소)만 있는 경우라면 이런 차이점에 대해서 #ifdef 등으로 구별을 하는데, 이 구별을 위한 #define은 register를 직접 access하는 header file이나, hardware 차이점을 기술한 파일 (예를 들어 stmXX.h)에 기술하면 충분하다.

그렇지만, (예를 들면) 둘 중 하나의 HW만 DMA를 지원하며, DMA를 지원하는 HW에 대해서는 busy waiting을 하지 않는 SW를 개발하는 경우라면 DMA의 여부는 architecture 최상위에 위치해야 할 것이다.
한가지 기능이 전체 SW의 동작에 큰 영향을 미치기 때문이다.

물론, HW의 기능차이를 무시하고 동일한 방식(DMA를 사용여부와 상관없이 busy waiting하는 경우)으로 처리한다면 DMA여부는 아키텍처상 하위에 위치해도 충분할 것이다.