2011년 10월 5일 수요일

eMMC trim command on android

 eMMC를 사용하는 android model을 개발하면서 I/O wait이 갑자기 높아지면서 Application에서 ANR이 발생하는 문제를 본 적이 있다.
 이런 현상은 자동화(특히 카메라 촬영 -> 저장(반복) -> 삭제) 테스트를 진행중에 Camera Application에서 드물게 발생한다.
 이 문제는 추측컨데 eMMC 내부에서의 garbage collection으로 인해서 발생하는 것이 아닌가 한다. ( eMMC 내부적으로 SLC나 MLC를 사용하고 있으니 gc가 일어나는 것은 당연)

 구글에서 이 문제를 관련해서 검색을 하다보니 SSD Trim 기능이라는 알게 되었고, eMMC에도 TRIM command를 지원하는 것을 확인할 수 있었다.

 Trim은 아래 wiki 사이트 에 아주 잘 설명이 되어 있다.

 eMMC를 사용하는 Android mode에서의 상황을 간략하게 정리하면,

1. file system에서 파일을 삭제하면 파일의 data cluster들을 flagging하는 정도만 수행하지 실제 삭제하지는 않는다.

  • HDD의 경우에는 overwite되므로 삭제라는 개념이 없다고 봐도 된다.
  • FAT의 경우 cluster table을 가지고 있고, cluster table에 cluster 사용유무가 masking되게 되어 있다. file을 삭제하면 file의 data(content)에 할당된 cluster가 table에서 unused 로 masking된다.
  • file data(content)의 삭제는 cluster의 unused로 masking하는 것으로 생각하면 된다.
  • 물론 inode는 이와 다르다.

2. NAND flash의 경우는 read/write와 erase의 단위가 틀리다.

  • read/write는 page 단위로 일어난다. (512bytes, 2K 등등)
  • erase는 block단위로 일어난다. (block은 page의 집합)
  • over-write을 허용하지 않는다.
  • write와 erase 단위가 틀리므로 write after erase 도 되지 않는다.
  • NAND Flash를 사용할 경우 FTL(Flash translation layer)가 있어야 한다.
  • FTL은 Garbage collection을 수행해야 한다.
    • 사용하지 않는 block을 삭제하여 write에 사용할 수 있도록 해야 하기 때문.

3. eMMC는 내부적으로 NAND Flash와 MMC controller의 조합으로 되어 있다.

  • MMC Controller는 wear leveling, block management, address translation, garbage collection등을 수행한다.
  • NAND flash를 가진 eMMC의 MMC Controller는 내장 FTL을 가지고 있고, wear leveling, block management, address translation, garbage collection등을 수행한다.
    • NAND를 직접 사용하는 file system의 경우 software로 구현한 FTL을 가져야 한다.

4. eMMC를 사용하는 File system에서 file의 삭제 및 잘라내기, 덮어쓰기 동작은 내부적으로 garbage page를 만든다.

  • file을 삭제, 잘라내기, 덮어쓰기와 같은 동작은 file data(content)의 변경을 가져오게 된다.
  • file data가 변경될 경우 overwite를 할 수 없는 NAND Flash의 특성상 기존 data의 page는 garbage로 처리되고 새로운 page(지워져 있는 page)를 할당받아 새로운 data를 write하게 된다.
  • file system에 의해서 할당된 N번 sector에 새로운 data를 write할 경우에 eMMC 내부에서는 기존 N번 sector에 할당되어 있는 NAND flash의 page를 garbage로 만들고 새로운 page(지워져 있는 page)를 N번 sector와 연결시키고 write를 수행한다.
  • data가 삭제될 경우에는 file system에서는 cluster table만 수정한다. 
    • eMMC는 삭제된 file의 data에 할당되어 있던 sector에 대한 어떤한 정보도 file system으로부터 얻을 수 없다!

5. eMMC TRIM command는 erase command와 유사하지만 erase group에 대한 erase를 수행하지 않고, write block에 대한 erase를 수행한다.

  • JEDEC eMMC Standard문서인 JESD84-A441의 기술된 원문은 아래와 같다.
The Trim function applies the erase operation to write blocks instead of  erase groups.  The Trim function allows the host to identify data that is no longer required so that the card can erase the data if necessary during background erase events.

  • JEDEC eMMC Standard문서인 JESD84-A441의 13 e•MMC standard compliance( = eMMC 표준 준수)에 아래와 같이 기술되어 있다.
The Trim command allows the host to assist with the optimization of the internal card garbage collection operations

6. EXT4 File system은 discard mount option으로 TRIM 기능을 지원한다. (물론 TRIM을 지원하는 eMMC의 경우) : linux vFAT도 지원!

  • discard option으로 mount되고 TRIM을 지원하는 경우 block을 free할 때 TRIM command를 host(eMMC)로 전송하게 된다.
  • TRIM을 사용할 경우의 Performance는 아래 사이트에 잘 정리가 되어 있다.

https://wiki.linaro.org/WorkingGroups/Kernel/Specs/StoragePerfMMC-FS-compare

  • 위 사이트의 결과를 보면 EXT4와 EXT4-with-trim 과 성능상의 차이는 없어 보인다.
    • read에서는 EXT4가 EXT4-with-trim보다 더 우위에 있고, write는 그 반대이다.
    • 그 차이는 신경쓸 정도로 크지 않는 것 같다.


7. 성능상의 차이가 유사하다면 TRIM을 사용하는 것이 더 나은 선택일 것 같다.

  • EXT4로 mount 되는 data 영역은 사용자의 data base가 저장되는 공간이기 때문에 update가 빈번하고, vFAT의 mount되는 sdcard 영역은 file 삭제나 덮어쓰기(overwrite)가 빈번하게 일어난다.
  • 시간이 흐름에 따라 eMMC 내부에는 많은 garbage가 발생할 수 있고, garbage collection이 발생할 때 system의 performance를 저하시키는 원인으로 발생할 수 있다.
    • 일반적인 사용자의 패턴에서는 발생할 가능성이 크지는 않을 것으로 생각된다.
  • discard mount option을 사용함으로써 eMMC 내부에서 일어나는 garbage collection operation의 최적화에 도움이 되도록 하는 것이 system의 performance에 유지하는 것에 도움이 되도록 하는 것이 좋은 방법이라고 생각된다.



결론적으로 대용량 eMMC를 사용하는 Android model의 경우(/mnt/sdcard 영역을 eMMC에 mount 하는 모델), eMMC가 TRIM command를 지원한다면 discard option을 사용하는 것이 좋을 것 같다.

댓글 1개:

  1. 혹시 최근에 안드로이드 trim 명령내려주는 어플리케이션인 lagfix 라는 어플을 아시나요?

    여기 글 읽어보면 Ext4 와 vfat 파일 시스템을 지원한다고 나와있는데요, 왜 현실은 Ext4 영역만 지원하는지 궁금합니다.

    사용빈도를 보면 어플리케이션을 업데이트 하거나 하는 일이 없는 한 사용자의 데이터 영역 ( 흔히 외장메모리라 불리는 vfat 을 파일 시스템으로 사용하는, )을 저장하는데 사용되는 부분이 더 많은 i/o 가 더 많이 일어나고 이 부분에 대해서 trim 이 더 절실히 필요하다 생각하는데 현실은 Ext4만을 지원하네요ㅠㅜ

    답글삭제