2012-09-27 3 views
0

오디오를 녹음하고 SD 카드에 기록하는 경우 데이터 속도는 약 1.5MB/s입니다. 내가 ext4 파일 시스템과 클래스 4 SD 카드를 사용하고 있습니다.linux : smart fsync()?

일정한 간격 후에 커널은 파일을 자동으로 동기화합니다. 이것의 단점은 응용 프로그램 버퍼가 디스크에 쓰여지기를 기다리고 있다는 것입니다.

나는 커널이 현재 무엇을하는지 자주 동기화하면 문제를 해결할 수 있다고 생각한다.

특정 간격 후에 동기화하려면 응용 프로그램에서 fsync()을 사용했습니다. 그러나 응용 프로그램에서 호출 된 fsync()가 시간 낭비이므로 특정 시간 커널이 응용 프로그램이 fsync()이라는 바로 전에 동기화 되었기 때문에이 방법으로는 문제가 해결되지 않습니다.

동기화 메커니즘이 필요합니다 (예 : smart_fsync()). 응용 프로그램이 smart_fsync()를 호출하면 잠시 동안 동기화되지 않은 경우에만 커널이 동기화됩니다. 그렇지 않으면 그냥 돌아옵니다.

smart_fsync()과 같은 기능이 없으므로 가능한 해결 방법은 무엇입니까?

+0

파일 버퍼를 초과하지 않으면 커널이 아무 것도 동기화하지 않는다고 저는 생각하지 않습니다. 수동으로 (그리고 꽤 자주) 동기화하면 모든 동기화 시간을 줄일 수 있지만 전체적으로 소요되는 시간은 거의 동일하게 유지됩니다.또한 nonblocking I/O 또는 쓰는 쓰레드를 사용할 수 있지만 약간 까다 롭습니다. Btw, 클래스 4의 1.5Mb는 상당히 낮습니다. FS 저널을 사용하지 않으면 도움이 될 수 있습니다. – keltar

답변

3

첫 번째 질문은 입니다. 발생한 문제의 정확성은 무엇입니까? 커널은 주기적으로 더럽지 않은 (캐싱되지 않은) 버퍼를 플러시합니다. 이는 동기식으로 플러시하는 것보다 빠르게 수행하는 경향이 있기 때문입니다 (응용 프로그램의 대기 시간 감소가 적음). 단점은 더러운 데이터에 대한 커널의 한계에 도달하면 더 많은 지연 시간이 걸릴 수 있다는 것입니다 (그리고 더러운 데이터가 손실 된 후에 더 많은 데이터 손실이 발생할 수 있음).

데이터가 최대한 빨리 디스크에 저장되도록하려면 O_SYNC 옵션을 사용하여 파일을 열어야합니다. 이것은 write()에 즉시 디스크에 데이터를 플러시합니다. 물론 이것은 상당한 성능 저하를 의미하지만 다른 한편으로는 데이터가 플러시되는 시점을 완전히 제어 할 수 있습니다.

동기화가 진행되는 동안 처리량이 떨어지면 대부분 디스크가 지원할 수있는 것보다 더 빨리 쓰려고 시도하고 더티 페이지 메모리 제한에 도달하려고합니다. 유감스럽게도 이것은 하드웨어가 단순히 쓰기 속도에 미치지 못한다는 것을 의미합니다. 느리게 작성하거나 더 빠른 매체에 데이터를 버퍼링해야합니다 (또는 RAM을 추가하십시오!).

또한 '스마트 fsync'는 커널이 구현 한 것과 정확히 일치합니다. 다음 중 하나가 참일 때 페이지가 플러시됩니다 : * 메모리에 너무 많은 데이터가 있습니다. 더티 데이터의 총량이 /proc/sys/vm/dirty_background_bytes을 초과하거나 총 메모리의 비율이 /proc/sys/vm/dirty_background_ratio을 초과하면 비동기 적으로 (쓰기를 차단하지 않고) 트리거합니다. 총 데이터 양이 /proc/sys/vm/dirty_bytes을 초과하거나 총 메모리의 비율이 /proc/sys/vm/dirty_ratio을 초과하면 동 기적으로 트리거합니다 (응용 프로그램의 write()을 장시간 차단 함). * 더티 데이터가 너무 오래 메모리에 대기 중입니다. pdflush 데몬은 /proc/sys/vm/dirty_writeback_centisecs 센티 세컨드 (1/100 초)마다 오래된 더티 블록을 확인하고 메모리가 /proc/sys/vm/dirty_expire_centisecs보다 길면 블록을 만료시킵니다.

이러한 매개 변수를 조정하는 것이 조금 도움이 될 수 있지만 기본값이 그대로 유지되지 않는 이유를 파악하는 것이 좋습니다.