임의 쓰기에 대한 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 인 결과는 다음과 같습니다.
질문 : 레코드 크기가 8, 16, 32, 64 및 128 kB 인 임의 쓰기 성능이 4 kB 레코드 크기보다 느린 이유는 무엇입니까?
Peter Brittain은 더 큰 파일 크기로 테스트 할 것을 제안 했으므로 파일 크기 500MB로 시도했습니다. 결과는 다음과 같습니다.
전반적인 성능은 나빠졌지만 현상은 여전히 발생합니다.
파티션은 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에 대한 답변) : 단일 실행 결과입니다. 절차는 다음과 같습니다.
- Raspberry Pi Model B에 카드 삽입
- 시스템 부팅
- SSH를 통한 로그인
- 요 오존 테스트 실행 시작
- 시스템을 정지시키고 다른 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 / 항목 번호를 수집했습니다. 여기 있습니다.
업데이트 6 : Kingston의 기술 지원에 따르면 테스트 된 Kingston 카드 (및 기타 카드)의 컨트롤러가 크기가 4kB 인 파일에 최적화되어 있다고 작성되었습니다. 정확한 컨트롤러 구현은 기밀입니다. Kingston의 답변은 내가 얻은 것 중 최고입니다. SanDisk가 지원 요청에 응답하지 않았으며 Sony, Samsung 또는 Verbatim에서 연락처를 찾을 수 없습니다.