기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
linux kernel 2.6.20
s3c2410
nand 64MB
JFFS2가 마운트시 리소스를 많이 먹는다는 건 여러 문서를 통해 알고 있었습니다.
그러나 이 정도 일 줄은 몰랐습니다.
리소스를 많이 먹다 못해 리눅스 자체를 아예 1초 동안 멈춰 버리게 합니다.
처음부터 이랬던 건 아닙니다.
파일 생성 삭제를 반복하다 보니 이런 증상이 생깁니다.
대략 5M 정도의 jffs2 파티션에 4KB 정도의 TEXT 파일을 주기적으로 썼다 지웟다를 반복 하다 보면
어느 순간부터 마운트 도중 os가 멈칫 합니다. . 멈칫 하는 시간도 처음엔 짧게 멈추다가 더욱 많이 파일을 쓰고 지우면
멈칫거리는 시간이 점점 늘어납니다.
파일을 대략 100만번 썻다 지웟다를 반복하니 1.5초까지 멈추더군요. ㅡㅡ;;
JFFS2 마운트시 프로세스중에 pdflush가 먼저 리소스를 차지하기 시작합니다.
그러나 jffs2_gcd_mtd1 이란 프로세스가 점점 치고 들어 오다가 100% 리소스를 먹는 순간 os가 멈~칫 합니다.
그러다 리소스를 반환하기 시작하면 정상적으로 돌아옵니다.
마운트시 임의로 jffs2_gcd_mtd1을 stop 시키면 멈칫거리는 증상이 나타나질 않는 것으로 봐서
주범은 저 프로세스입니다.
그렇다고 죽여 놓으면 jffs2가 어떤 이상 증세를 보일지 모르기 때문에 죽이기도 찝찝합니다.
파일 생성/삭제를 여러 번 할 수록 파일이나 노드들 기타 등등이 조각나서 그런 것 일까요?
리눅스엔 파일조각모음 이란 어플은 없더군요. 원래 리눅스 파일 시스템이 조각나기 어려운 구조 라더군요.
그런데 증상을 보면 조각 났을 거란 추정 밖엔 딱히 떠오르는 게 없네요.
디스크 검사 하는 fsck도 jffs2는 지원하지 않더군요.
원래 NAND에 file write를 계속 한다는 건 잘못된 것이지만...
해결 방안이 없을까요?
조각모음 이라던지 디스크정리 라던지 이런 유틸이 있음 좋으련만...
까짓꺼 1.5초 멈추면 어떠냐 ...하실 수도 있겠지만...
부득이하게 보드에 외부 와치독이 달려 있습니다. 토글 안 시켜주면 리부팅 시켜버립니다.
딱 리부팅 되기 좋은 상황인 것이죠. ㅠㅠ
쓰다 보니 장문이 되 버렸습니다. 읽어 주셔서 감사합니다.
음.....jffs2의 경우는 소스를 봐봐야 알겠지만....
아마도 log structured style일 가능성이 좀 보이네요. 이 경우 전체 영역에 대한 저널링 처리를 하기 때문에
write/erase 를 반복하게 되면, 엄청 느려질 가능성이 높습니다.
지금 문제를 보면 garbage collection 부분 처리에서 벅벅대는 듯 합니다.
아마도 yaffs2를 포팅하셔도 비슷한 증상이 나올거라고 보여집니다.
최후로 테스트해 볼 것은 결국은 ubifs밖에 없을 듯 하네요.
ubifs는 hdd와 유사한 형태로 구현거니 아마도 gc 부분이 없어서 괜찮을 듯 합니다만...kernel 2.6.27서부터 공식으로 지원합니다....쩝
100만번이면... 좀 많긴 많습니다.
저널링 구조상 노드 정보가 엄청 쌓여 있을것 같습니다.
YAFFS로 한번 시도해 보시는게 어떨까요? 저도 100만번 테스트는 안해봐서.. 잘은 모르겠지만요...
아니면 아래 링크를 참고하세요. NAND에 좀 더 최적화된 JFFS2 패치랍니다.
http://www.inf.u-szeged.hu/jffs2/mount.php