Wear Leveling (웨어 레벨링) : 균등 분배

 

[서문] SSD의 기록장치인 낸드플래시는 RW특성상 데이터 입출력이 진행될수록 기록소자가 노화되어 파손되기 때문에 일정한 한계수명이 존재한다.

따라서, 아무런 안전장치없이 자성기록장치(HDD)에 최적화 되어있는 현재의 기록 알고리즘으로는 특정섹터(셀)에 기록이 집중될 수 있으며

셀이 균일하게 사용되지 못하고 급격하게 파손되어 죽어버린 데드셀이 늘어나면서 기록장치로서의 기능을 빠르게 상실할 수 있다.

약간의 데드셀은 예비영역의 셀로 대체하여 일시적으로는 사용가능하지만, 마찬가지로 해당부분만 기록이 집중되면 다시 고장나는건 시간문제이기 때문이다.

대체불가능한 데드셀이 발생하면 더 이상의 작동이 불가능해진다.

 

하지만 모든 SW가 HDD의 기록방식에 최적화 되어있는 현재, SSD하나때문에 낸드플래시에 적합한 방식의 기록 알고리즘을 새로 개발하고 모두 대체하기란

불가능에 가까운게 사실이다. 그래서 SSD는 자체적으로 기존 IO방식을 고치지 않고도 사용할 수 있도록 자체적인 기능을 여럿 내장하고 있는데, 그중에서도

가장 중요하고 핵심적인 기능이 웨어레벨링 이라는 기술이다. 지금부터 이것이 무엇인지 차근차근 알아보도록 하자. FTL이라는 기능도 관련있으며 매우 중요하다.

 

 

 

[본문] WL기술의 발전과 중간에 등장한 꼼수(!)에 대해서 알아보자. 말로 설명하는건 이해하기가 힘들기 때문에 이미지를 준비했다.

다만, 쉬운 이해를 위해 WL이외의 다른 셀관리 기술은 제외했으므로 실제장치의 작동과는 조금 다를 수 있으며 약간 과장된 면도 있다. 개념만 이해하자.

 

SSD 초창기시절에 등장했던 WL기술은 장치의 빈공간에 굉장한 영향을 받았다. 안그래도 낸드플래시의 집적도가 낮아서 용량이 작았는데

정상적인 동작, 특히 성능을 위해서는 거의 절반정도는 비워두는 것이 필수에 가까웠던 시절이었다. 그때 그 시절(?)의 WL알고리즘 작동방법을 살펴보자.

왼쪽은 권장량만큼 여유공간을 확보한 모습을 가정했고, 오른쪽은 나몰라라하고 그냥 대충쓰는걸 가정했다.

 

01wlold.png

설명의 편의와 쉬운 이해를 위해, 데이터를 한번만 기록하면 바로 셀 수명이 끝난다고 가정하고 "8" 만큼의 데이터를 기록해보겠다.

 

02lwold.png

차이점이 느껴지는가? 공간이 여유로운 쪽은 WL이 효과를 발휘한 반면, 남은공간이 부족한 쪽은 빈공간에 해당하는 셀만 혹사당했다.

블럭몇개가 죽는것은 예비공간에서 대체하지만, 저렇게 "디스크의 일부공간" 수준이 수명을 다하게되면 장치는 어느날 갑자기 작동이 안된다. 수명이 다하는거다.

 

03lwold.png

이때 Smart정보를 참조하면 값은 똑같거나 비슷한데 정작 해당장치는 어느날 갑자기 죽어버린다.

이랬던 초기 SSD의 약한 모습때문에 컴퓨터 부품중 유달리 SSD의 수명에 신경을 쓰게되는 웃지못할 상황이 생겨버린게 아닌가 싶다. 평생 쓸것도 아닌데.

 

이런 문제때문에 등장한 것이 오버 프로비저닝(Over Provisioning)영역 이라는 꼼수다. 이는 SSD에 탑재된 낸드플래시의 하드웨어적

총 용량중 일부구간을 펌웨어 레벨에서 일반사용자는 접근하지 못하도록 설정하여 컨트롤러만 사용할 수 있도록 예비해둔 공간이다.

 

oparea.png

대략 이런식이다. 위 그림에서 오른쪽 상황을 이 그림으로 대체해서 상상해보자. 빈공간에 해당하는 셀의 혹사가 약간은 줄어들 것이다.

사용자가 장치에서 제공하는 총 용량을 다 잡아서 사용하더라도, 미리 일부공간을 선점해둬서 WL알고리즘이 정상동작 하도록 돕는 빈공간이라고 할수있다.

하지만 컨트롤러, 낸드플래시가 발전하고 더불어 WL 알고리즘도 크게 개선되면서 OP영역의 중요도는 낮아지게 되었다. 어찌된 일일까? 같이 살펴보자.

 

위에서와 마찬가지로, 왼쪽은 권장량만큼 여유공간을 확보한 모습을 가정했고, 오른쪽은 나몰라라하고 그냥 대충쓰는걸 가정했다.

04wlnew.png

설명의 편의와 쉬운 이해를 위해, 데이터를 한번만 기록하면 바로 셀 수명이 끝난다고 가정하고 아까보다 기록량을 늘려서 "16" 만큼의 데이터를 기록해보겠다.

 

05wlnew.png

 

06wlnew.png

 

07wlnew.png

 

08wlnew.png

 

09wlnew.png

 

10wlnew.png

위에서와는 다르게, 데이터가 존재하는 셀까지 옮겨가면서 기록하는 것이 보인다. 그리고 좀더 균일하게 사용된 것이 눈에 띈다.

그러나 역시 여유공간이 많을때 기록완료가 빠르며, 주어진 데이터 기록과는 무관하게 자료를 옮김으로써 유발되는 수명하락도 줄어든 점이 보인다.

예제에서 "자료를 이동"시키느라 허비된 수명은 2와 4로써 별 차이가 나지 않는듯이 느껴지겠지만, 실제 장치에서 이로인해 유발되는 수명차이는 상당한 편이다.

이전보다 많이 나아졌지만 그래도 여유공간에 따른 성능차이는 어쩔수가 없는것이 SSD의 특징이라고 할수있다. 이것이 더티상태 성능하락 이다. 이해되노?

기록해야할 데이터가 16보다 많았다면 어찌됐을지는 각자 상상해보자. DataMove 횟수차이가 더 벌어졌을 것이다.

 

그리고, 예제를 보면서 이런 생각이 들었을 수도 있다. "더욱 세밀하게 레벨링이 가능할것 같은데, 왜 저렇게 불균일하냐?"

만약 이런 의문이 들었다면 너의 이해력과 몰입력과 집중력에 박수를 보낸다. WL알고리즘의 존재이유와 작동의도를 심취해서 읽었다면 당연한 의문이다.

WL이란것은 흡사 3D게임 화질옵션의 안티앨리어싱과 비슷하다. 하드하게 적용하면 좋지만 느려지고, 느슨하게 적용하면 빠르지만 나빠지는 그런 특성이다.

SSD에게 데이터 기록이란 작동중 항시 있는 일이고, 따라서 아무리 깔끔하게 칼같이 정리해놔도 레벨링은 장치수명이 다하는 순간까지 끝나지 않는 작업이다.

그렇기 때문에 [칼정리&수명↑/느린쓰기속도] VS. [여유롭게운영&수명↓/빠른쓰기속도] 이 딜레마 사이에서 끝없는 기묘한 균형잡기를 해야하는 것이다.

이 균형잡기도 대충 설정되어 있는것이 아니고, 컨트롤러가 Data I/O 규모를 상시 모니터링하고 셀의 상태에 따라서 수시로 정책을 바꿔서 시행한다. 그래서 그렇다.

 

이렇게 WL알고리즘이 개선되면서 OP영역의 필요도는 이전에 비해 떨어졌고, HDD에 비해 공간이 협소한 SSD이므로 이 OP공간을 사용자에게 다시 돌려주는

것이 현재의 대세이다. 다만, TLC제품의 경우는 MLC보다 내구성이 확연히 떨어지기 때문에 OP영역을 지정해둔다. 대표적으로 삼성SSD 840/EVO가 그렇다.

ssd.PNG

이것이 괜히 나온게 아니란 말씀! 봤어도 무심히 지나쳤던 이것. 이제 이해가십니까? 근데 왜 하필 7%... 아아 노짱...ㅠ.ㅠ

 

그리고 이전세대의 WL알고리즘은 조금 멍청멍청해서, 빈공간이어도 할당된 공간(파일시스템의 관리영역에 속한 빈공간)은 잘 건드리지 못하는 특성이 있었다.

그러니까, SSD총용량을 C:로 잡고 쓰는데 전체공간을 다 써먹지 않아도 WL알고리즘이 WL작업을 수행하는데 있어서 적극적으로 개입하지 못한다는거다.

따라서 구형제품을 사용하는 유저중에 "디스크용량이 많이 필요하진 않다!" 하는 사람은

empty.png

이런식으로 할당되지 않은 공간을 만들어두면, 컨트롤러가 알아서 저 공간을 OP Area로 사용하게 된다. 성능유지와 수명관리에 도움이 된다.

삼성컨트롤러는 모든 제품이 다 이런 기능을 지원하고, 다른 제조사의 메이저급 컨트롤러도 거의 대부분 그러하다. 일부 안 그런것들은 지들이 이상한거다.

굳이 이럴거까지야 없긴한데 웨어 레벨링 관련된 팁이라서 언급해본다. 요즘 출시되는 신형 제품에도 여전히 유효하므로 관심있다면 참고하기 바란다.

 

 

 

1부는 이것으로 마친다. 읽어줘서 고맙다.