레코드 크기 8-128kB의 SD 카드 임의 쓰기 성능이 레코드 크기 4kB의 성능보다 떨어지는 이유는 무엇입니까?


15

임의 쓰기에 대한 SD 카드의 성능을 확인하면 레코드 크기 4kB의 성능이 상당히 나쁘다는 것을 알 수 있습니다 (이것은 놀라운 일이 아닙니다). 그러나 여러 카드의 경우 더 커지기 전에 더 큰 레코드 크기로 떨어집니다. iozone v3.430으로 임의 쓰기 성능을 측정하고 다른 제조업체의 여러 플래시 카드를 테스트했습니다. 이것은 파일 크기가 50MB 인 측정에 사용한 iozone 명령입니다.

iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile

파일 크기가 50MB 인 결과는 다음과 같습니다.

iozone 및 50MB 파일 크기로 테스트 할 때 무작위 쓰기를위한 SD 카드의 성능 저하

질문 : 레코드 크기가 8, 16, 32, 64 및 128 kB 인 임의 쓰기 성능이 4 kB 레코드 크기보다 느린 이유는 무엇입니까?

Peter Brittain은 더 큰 파일 크기로 테스트 할 것을 제안 했으므로 파일 크기 500MB로 시도했습니다. 결과는 다음과 같습니다.

iozone 및 500MB 파일 크기로 테스트 할 때 무작위 쓰기를위한 SD 카드의 성능 저하

전반적인 성능은 나빠졌지만 현상은 여전히 ​​발생합니다.

파티션은 4MB 경계로 정렬됩니다. 파일 시스템은 4 kB 블록 크기의 ext4입니다. 테스트 시작에 사용 된 파티션은 mmcblk0p2입니다.

$ lsblk 
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0 953.7M  0 loop /mnt/sdb1
mmcblk0     179:0    0  14.9G  0 disk 
├─mmcblk0p1 179:1    0    56M  0 part /boot
├─mmcblk0p2 179:2    0   7.8G  0 part /
└─mmcblk0p3 179:3    0     7G  0 part /mnt/mmcblk0p3

$ cat /etc/fstab | grep mmcblk0p2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1

$ sudo fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes
4 heads, 16 sectors/track, 486192 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000981cb

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    16506879     8192000   83  Linux
/dev/mmcblk0p3        16506880    31115263     7304192   83  Linux

$ mount | grep ext4 | grep root
/dev/root on / type ext4 (rw,noatime,data=ordered)

# tune2fs -l /dev/mmcblk0p2 | grep Block
Block count:              2048000
Block size:               4096
Blocks per group:         32768

업데이트 1 : 특히 작은 레코드 크기에 대한 임의 쓰기 성능이 순차적 쓰기에 비해 현저히 낮습니다. NAND 플래시 스토리지의 메모리 셀은 페이지와 소거 블록으로 그룹화됩니다. 일반적인 페이지 크기는 4, 8 또는 16kB입니다. 컨트롤러가 단일 페이지를 쓸 수는 있지만 데이터를 먼저 지우지 않고 덮어 쓸 수 없으며 지우기 블록은 NAND 플래시 스토리지가 지울 수있는 가장 작은 단위입니다. 소거 블록 크기는 일반적으로 128kB에서 2MB 사이입니다. 현대의 SD 카드에서 소량의 소거 블록은 동일한 크기의 더 큰 단위로 할당되며이를 할당 그룹 또는 할당 단위 또는 세그먼트라고합니다. 일반적인 세그먼트 크기는 4MB입니다.스토리지의 각 쓰기 조작으로 인해 전체 세그먼트에 대한 읽기-수정-쓰기 조작이 발생합니다. 예를 들어, 4MB 세그먼트 크기의 SD 카드에서 4kB의 데이터를 임의의 위치에 쓰면 쓰기 증폭 계수가 1024가됩니다. SD 카드의 컨트롤러는 변환 계층을 구현합니다. 모든 I / O 작업의 경우 컨트롤러에서 가상 주소를 물리적 주소로 변환합니다. 세그먼트 내부의 데이터를 덮어 쓰면 변환 계층은 세그먼트의 가상 주소를 지워진 다른 물리적 주소로 다시 매핑합니다. 이전 물리적 세그먼트는 더티로 표시되고 삭제 대기 중입니다. 나중에 지워지면 재사용 할 수 있습니다. SD 카드의 컨트롤러는 일반적으로 임의 쓰기 작업의 성능을 높이기 위해 하나 이상의 세그먼트를 캐시합니다.SD 카드가 루트 파일 시스템을 저장하는 경우, 카드의 컨트롤러가 쓰기 작업이 수행되는 세그먼트, 파일 시스템의 메타 데이터를 저장하는 세그먼트 및 사용 가능) 파일 시스템의 저널 결과적으로, SD 카드의 랜덤 쓰기 성능은 소거 블록 크기, 세그먼트 크기 및 컨트롤러 캐시 인 세그먼트 수에 의존한다. 그러나 이것이 8, 16, 32, 64 및 128 kB의 레코드 크기를 갖는 랜덤 쓰기 성능이 4 kB 레코드 크기보다 느린 이유를 설명하지는 않습니다.

업데이트 2 (myaut에 대한 답변) : 표의 스크린 샷은 저의 작품입니다. 현재 단일 보드 컴퓨터의 클러스터에 대한 기사 / 논문을 작성하여 학생 프로젝트 및 연구원에게 리소스를 제공하는 흥미로운 옵션이되기 때문입니다. 이러한 맥락에서 나는 단일 노드의 CPU, 스토리지 및 네트워크 인터페이스의 성능도 조사했습니다. 테스트 된 모든 SD 카드를 구입했습니다. 내가 설치 한 카드 중 하나에 (dd를 통해 복사) Raspian Wheezy (버전 2014-06-20). 네트워크 설정을 구성하고 추가 패키지 (예 : iozone)를 설치 한 후 전체 SD 카드를 다른 모든 SD 카드에 복사했습니다.

업데이트 3 (Gabriel Southern에 대한 답변) : 단일 실행 결과입니다. 절차는 다음과 같습니다.

  1. Raspberry Pi Model B에 카드 삽입
  2. 시스템 부팅
  3. SSH를 통한 로그인
  4. 요 오존 테스트 실행 시작
  5. 시스템을 정지시키고 다른 SD 카드로 시도하십시오

일부 카드를 여러 번 다시 확인하려고했습니다. 변형이 거의 없었습니다. 이 현상은 삼성 카드 2 개와 Verbatim 카드 1 개를 제외하고 항상 발생합니다.

업데이트 4 : 현재 명확한 답변을 요청하기 위해 NAND 플래시 클론 롤러 (삼성, SanDisk, Toshiba ...)를 생산하는 회사에 연락하려고합니다. SanDisk에는 포럼이 있습니다. 나는 거기에 설명을 요청 했다. 또한 Kingston의 기술 지원 부서에 요청을 보냈습니다.

업데이트 5 : 소거 블록 크기 및 할당 단위 (세그먼트) 크기는이 현상에 영향을 미치지 않습니다. ThinkPad X240 노트북의 내부 카드 리더에있는 pritcsd.py 툴 주먹과 마지막으로 Raspberry Pi Model B를 사용하여 모든 SD 카드의 지우기 블록 크기를 테스트했습니다 . 모든 카드의 출력은 다음과 같습니다 Erase block size of mmcblk0 is 65536 bytes. 또한 테스트 된 모든 SD 카드의 세그먼트 크기가 동일합니다. 4MB입니다. 이 정보는 파일 에서 찾을 수 있습니다 /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size. 제 생각에는이 모든 카드가 같은 지우기 블록 크기와 세그먼트 크기를 가지고 있다는 것은 매우 특별합니다. 그동안 테스트 한 카드의 포장에서 제품 ID / 항목 번호를 수집했습니다. 여기 있습니다.

테스트 된 카드 포장의 제품 ID / 항목 번호

업데이트 6 : Kingston의 기술 지원에 따르면 테스트 된 Kingston 카드 (및 기타 카드)의 컨트롤러가 크기가 4kB 인 파일에 최적화되어 있다고 작성되었습니다. 정확한 컨트롤러 구현은 기밀입니다. Kingston의 답변은 내가 얻은 것 중 최고입니다. SanDisk가 지원 요청에 응답하지 않았으며 Sony, Samsung 또는 Verbatim에서 연락처를 찾을 수 없습니다.


1
이것은 흥미로운 질문입니다. 보고 한 결과가 여러 번의 실행에 대한 평균입니까, 아니면 한 번의 실행에 대한 평균입니까? 결과에 얼마나 많은 변화가 있는지 궁금합니다.

1
논리적 리매핑 및웨어 레벨링의 결과로,이 문제는 "예를 들어 4MB 세그먼트 크기의 SD 카드에서 4kB의 데이터를 임의의 위치에 기록하면 쓰기 증폭 계수는 1024가됩니다." 거짓입니다.
벤 Voigt

1
내 경험 성능 테스트에서는 소규모 테스트에서 모든 종류의 최적화 및 캐시를 수행했습니다. 특히 플래시 속도가 느린 제조업체는 파일 시스템 업데이트를 효율적으로 처리하기 위해 이러한 최적화가 필요하지만 모든 컨트롤러에 대한 공개 문서가 없기 때문에이를 입증 할 수는 없다고 생각할 수 있습니다. 즉, 50MB 파일 만 사용하고 있습니다. 이 문제를 해결하기 위해 훨씬 더 큰 파일 ( iozone.org/docs/IOzone_msword_98.pdf의 "실행 규칙"에 따라 )을 시도 했습니까?

1
차이가 없다고 가정하면이 문제에 대한 다른 데이터를 살펴 보았습니다. Linaro 조직이 비슷한 연구를 한 것 같습니다 . 특히 초대형 SLC 캐시는 매우 빠른 결과를 설명 할 수 있습니다. FAT32 최적화는 특히 소규모 쓰기를 목표로합니다.

1
예-이미 페이지에서 그 문제를 발견했습니다 ... FAT32와 관련하여 누락 된 것으로 생각됩니다. 카드는 FAT32뿐만 아니라 "FAT32에서 관찰되는 액세스 패턴에 맞게"최적화되어 있습니다. FAT의 일반적인 액세스 패턴은 새 파일을 작성하는 것입니다. 파일 데이터를 스트리밍하고 FAT 업데이트를 수행해야합니다. FAT 업데이트에는 일반적으로 적은 수의 블록이 포함됩니다. FTL을 작성하는 경우 FAT 성능에 도움이되도록 페이지 크기보다 작은 쓰기를 최적화 할 계획입니다.

답변:


4

SD 카드 셀 구조 :

고체 전자 장치에서, 셀은 하나 또는 다수의 정보 비트를 저장할 수있는 메모리 소자이며, 셀당 비트 수는 사용 된 기술에 의존한다. (SLC / MLC / TLC)

제조업체는 플래시 메모리에 서로 다른 기술을 사용하여 구조를 관리하며 가장 많이 사용되는 구조는 TLC와 MLC이며 특히 TLC와 같은 기술과 관련된 비용이 저렴하기 때문입니다.

이 기술 정보는 SD 카드 및 USB 스틱에 대해 얻기가 어렵 기 때문에 제조업체는 다른 플래시와 같은 기술과 관련 하여이 정보가 거의 항상 제공되는 SSD로 결정했습니다.

이는 하드웨어 수명뿐만 아니라 속도에도 직접적인 영향을 미칩니다.

SLC, 단일 레벨 셀 (1 비트)

Generally 100000 write erase cycles
Erase time: 1-2.5ms

MLC, 멀티 레벨 셀 (2 비트 이상)

Anywhere from 3000 to 15000 write erase cycles
Erase time: 2.5-3.5ms

TLC, 트리플 레벨 셀 (3 비트)

Anywhere from 1000 to 5000 write/erase cycles
Erase time: 4-5ms

노트 :

셀은 1, 2 또는 3 비트를 포함 할 수 있으므로 경우에 따라 SD 카드 컨트롤러 칩은 레코드 크기 및 셀 용량에 따라 더 많은 액세스주기를 수행해야합니다.

삼성 카드는 아마도 SLC 기술을 사용하거나 강력한 컨트롤러 칩을 가지고있을 것입니다.

노트 2 :

파티션 ext4 블록 크기 4 kb1 kb에서 와 같이 몇 가지 테스트를 시도 했지만 큰 차이는 없습니다.


삼성 카드와 Verbatim 카드는 소비자 제품이며, 지난 몇 년 동안 SLC 메모리는 이러한 장치에서 일반적이지 않았습니다. 삼성 카드는 MB-MP16DMB-MS16D 이며 축약 카드는 품번 44007 입니다.
Neverland

어쩌면 일부 컨트롤러의 사양을 사용할 수도 있습니다. SD 카드를 열고이 카드에 포함 된 컨트롤러를 확인할 수 있지만 microSD 카드를 열 수는 없습니다. 소프트웨어를 통해 SD 카드 컨트롤러의 제품 ID / 번호를 읽을 수 있습니까?
Neverland
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.