2008-10-10 12 views
5

SD 카드에 일정한 속도로 jpeg 이미지를 쓰는 작은 응용 프로그램을 작성 중입니다. EXT3 파일 시스템을 선택했지만 EXT2 파일 시스템에서도 동일한 문제가 발생했습니다.SD 카드 쓰기 성능

내 쓰기 루프는 다음과 같습니다

get_image() 
fwrite() 
fsync() 

또는 같은

:

get_image() 
fopen() 
fwrite() 
fsync() 
fclose() 

나는 또한 약간의 타이밍 통계를 표시, 나는 내 프로그램이 언젠가 몇 초 동안 차단됩니다 볼 수 있습니다. 들어오는 이미지를 FIFO에 보관하면 짧은 시간 안에 많은 이미지를 쓸 것이기 때문에 평균 속도는 여전히 좋습니다. OS에 문제가 있거나 SD 카드 자체와 관련이 있는지 알고 있습니까? 어떻게 실시간에 가까워 질 수 있습니까? 나는 강하게 실시간을 필요로하지 않지만 몇 초 동안 실속당하는 것은 받아 들일 수 없다.

일부 정밀도 : 예 이미지를 디스크 또는 일부 사용자 또는 커널 버퍼가 아니기 때문에 모든 파일 다음에 fsync를 수행해야합니다. 동기화가 없으면 훨씬 더 좋은 통행량을 가지지 만 여전히 받아 들일 수없는 실속입니다. 첫 번째 스톨은 50MB가 작성된 후에 발생하기 때문에 버퍼 문제는 아니라고 생각합니다. 맨 페이지에 따르면, fsync는 버퍼링 된 데이터가없는 것을 보장하기 위해 여기에 있습니다.

평균 쓰기 속도에 대한 정밀도 : 사용중인 카드에서 지속 가능한 속도로 쓰고 있습니다. fsync가 완료되기를 기다리는 동안 들어오는 이미지를 쌓아두면이 정지 후에 쓰기 전송 속도가 증가하고 평균 속도로 빠르게 되돌아갑니다. 평균 전송 속도는 약 1.4MBytes/s입니다.

SYSTEME 증권 KEE (2.6.24.19) 나는이 지역에서 매우 지식이 아니에요

답변

1

와 우분투 8.04 실행하는 현대 노트북,하지만 당신이 설명하는 증상은 버퍼를 채우고처럼 엄청 많이 소리. 파일 라이터 또는 SD 카드와 통신하는 I/O 장치의 버퍼를 채울 수 있습니다. 그런 다음 더 쓸 수 있기 전에 카드에 실제로 데이터를 쓸 때까지 (따라서 버퍼를 비우는) 기다려야합니다. SD 카드는 특히 빠른 작성자가 아닙니다. 이러한 일시 중지 중에 실제로 데이터가 카드에 기록되는지 확인할 수있는 방법을 찾으면 내 이론을 확인할 수 있습니다. 일부 카드 판독기에는 데이터에 액세스 할 때 깜박이는 LED가 있습니다. 이는 아마도 좋은 지표 일 것입니다.

그냥 직감 ... 약간의 소금으로 그것을 가지고 :)

3

는 모든 파일 후 fsync()에 필요가 있습니까? OS가 모든 대기열에 포함 된 이미지를 SD 카드에 쓸 때 OS가 결정할 수있게하는 것이 더 나을 것입니다. 모든 이미지에 대해 발생시키지 않고 많은 이미지 위에 SD 카드 파일 시스템을 조작하는 시작 비용을 상환해야합니다.

플랫폼에 대한 자세한 정보를 제공 할 수 있습니까? 느린 I/O 시간은 시스템의 다른 프로세스, 느린 I/O 컨트롤러 등과 관련 될 수 있습니다.

또한 플래시 메모리가 더 적합한 파일 시스템을 사용하는 것이 좋습니다. FAT32는 extN보다 일반적이지만 SD 용으로 특별히 제작 된 파일 시스템도 순서에 포함될 수 있습니다. JFFS이 좋은 예입니다.플래시 용으로 설계된 파일 시스템 (자기 미디어를 회전시키는 것과는 대조적으로)을 사용하면 더 나은 성능을 얻게 될 것이고, 더 나은웨어 레벨링 (그리고 장치 수명/안정성) 속성을 얻게 될 것입니다.

+0

pleaes 참조 JFFS주의 등이 자신의웨어 레벨링을 같은 컴팩트 플래시와 같은 일부 플래시 장치에 대한 좋은 생각이 아니다. – Hasturkun

+1

그들은 나쁜 생각입니까, 아니면 CompactFlash 착용 레벨링이 JFFS의 장점을 부정하는 것입니까? 정직한 질문입니다. 잘 모르겠습니다. 확실히 '원시'플래시 장치에 더 나은 선택이라고 생각합니다. –

2

AFAIK 일부 ​​플래시 디스크는 쓰기 성능이 매우 낮습니다 (특히 저가 브랜드). 따라서 애플리케이션의 쓰기 속도 (fsync에 필요한 시간 포함)를 측정한다면 무엇을 얻게됩니까? 하드웨어가 더 나아지지 않기 때문에 초당 수 메가 바이트 정도의 순서 일 수 있습니다.

또한 큰 블록 하나 대신 많은 작은 블록을 작성하는 경우 분명히 쓰기가 훨씬 느릴 수 있습니다. 플래시 디스크는 불량한 경우 초당 약 10 개의 쓰기 만 수행 할 수 있습니다. 이것은 아마도 커널 버퍼에 의해 완화 될 수있는 것이므로 fsync를 사용하면 빈번히 쓰기가 느려질 수 있습니다 ...

Btw. FAT32에서 쓰기 성능을 측정 했습니까? 나는 그것이 거의 같다고 생각 하겠지만, 그렇지 않다면 여전히 사용할 수있는 최적화가있을 것입니다.

1

이 도움이 될 수 있음 - Benchmarking Filesystems :

... 내가, 전체이었다 많은 배포판들이 기본 파일 시스템이 파일 시스템을 사용하는 방법 느린 ext3로 매우 놀랐습니다 ...

그리고 "ext3 fsync batching" :

...이 패치 조치는 디스크에 트랜잭션을 커밋 소요되며, 기본 디스크의 속도에 따라 잔다 시간.

4

O_DIRECT으로 파일을 열고 응용 프로그램 수준에서 캐싱을 시도하십시오.

우리는 STB Box에서 PVR (Personal Video Record) 기능을 구현할 때 유사한 문제를 경험했습니다. O_DIRECT 트릭이 마침내 우리의 필요를 만족 시켰습니다. (*)

O_DIRECT없이. write()의 데이터는 먼저 커널 버퍼에 캐시 된 다음 fsync을 호출하거나 커널 캐시 버퍼가 가득차면 (**) 미디어에 플러시됩니다.

O_DIRECT. 커널은 write syscalls에 매개 변수로 전달 된 사용자 공간 버퍼가 가리키는 실제 메모리로 직접 DMA를 수행합니다. 따라서 사용자 공간 메모리와 커널 캐시 사이의 복사본에는 CPU 및 mem 대역폭이 사용되지 않으며 캐시 관리 (예 : 캐시 조회, 페이지 별 잠금 등)에 CPU 시간이 소요되지 않습니다. (here에서 복사)

잘 모르겠지만 문제를 해결할 수도 있지만 시도해 볼 수도 있습니다.

* Linus의 이 O_DIRECT 임에도 불구하고 문제를 해결했습니다.

** 당신은 사람이 읽기 및 2.6.28 이상의 커널을 사용하기 위해 O_DSYNC 또는 O_SYNC

+0

매우 흥미 롭습니다. 캐싱 문제는 모든 특정 I/O 요청이 단일 큐를 통과한다는 것입니다. 블록 장치 (디스크)가 저널링 정보를 플러시하는 경우 다른 블록 장치 (SD 카드)와 관련이없는 쓰기가 차단됩니다. 나는이 O_DIRECT 것을 시도 할 것이다. – shodanex

0

으로 파일을 열 수 없습니다 않았다 가정, 추천은 파일 시스템 인 대신 EXT3의에서 ext4를 사용하는 것입니다 당신을 더 나은 성능을 위해 조정할 수 있습니다. 데이터가 저널되지 않은 writeback 모드에서 최상의 성능을 얻을 수 있습니다. 데이터 모드 섹션을 https://www.kernel.org/doc/Documentation/filesystems/ext4.txt에서 읽으십시오. 이미 생성 된 파티션이있는 경우

다음이가 일지 않고 ext4에로 포맷하는 데 사용할 수있는 몇 가지 단계가 있습니다, /dev/sdb1 말 : 그런 다음

mkfs.ext4 /dev/sdb1 -L jp # Creates the ext4 filesystem 
tune2fs -o journal_data_writeback /dev/sdb1 # Set to writeback mode 
tune2fs -O ^has_journal /dev/sdb1 # Disable journaling 
sudo e2fsck -f /dev/sdb1 # Filesystem check is required 

,이 파티션을 마운트 (또는 설정할 수는 해당 플래그 항목 당신이 무슨 일을하는지 알고있는 경우 /etc/fstab) :

mount -t ext4 -O noatime,nodirame,data=writeback /dev/mmcblk0p1 /mnt/sd 

최적화 된 ext4 파일 시스템을 ext3에서 이동은 급격한 차이가 있어야한다. 물론 SD 카드가 빠르면 (즉, 클래스 10) 도움이됩니다.

https://developer.ridgerun.com/wiki/index.php/High_performance_SD_card_tuning_using_the_EXT4_file_system