O_DIRECT 옵션에 따른 성능
글쓴이: freedom / 작성시간: 목, 2008/07/03 - 11:16오전
안녕하세요? 오랜만에 오는군요
다름이 아니라 제가 하나의 파일을
Thread 를 이용하여 (각각의 Thread 는 하나의 파일에 대한 자신만의 FileDescriptor 를 가지고 있음)
병렬로 Read 하려고 합니다.
하던중 O_DIRECT 라는 옵션에 대한 글을 찾았는데,
몇몇분은 성능이 많이 올라 갔다고 합니다만
저 같은 경우 오히려 몇배로 성능이 떨어 졌습니다.
이유를 모르겠습니다.
open 옵션은 O_RDONLY | O_DIRECT (O_SYNC 혹은 O_DSYNC 도 넣어서 테스트 해봤습니다.)
제 생각은 지금 제가 뭔가의 전제 조건? 등 모르는게 있는거 같아서 이렇게 글 남깁니다.
OS 는 Linux 를 사용하고 있습니다.
Forums:
O_DIRECT mode는 DMA를
O_DIRECT mode는 DMA를 사용하는 mode로 알고 있습니다. 이 것은 대용량 파일(사실 어디까지가 대용량이고, 아니고는 좀 애매하긴 합니다만)에서는 속도 향상이 있지만, 작은용량의 파일들에 대해서는 오히려 buffer를 이용한, 즉 일반 open이 더 빠른 걸로 알고 있습니다. 실제로 이 부분에 대한 성능 측정도 예전 대학교 연구실에 해본적도 있고요. ^^ 그럼 수고하세요.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
답글 감사합니다.
제가 지금 테스트 하는 파일의 경우 4GB 정도 됩니다.
우선 초당 읽어 들이는 속도가 O_DIRECT 경우 2MB 일반의 경우 12MB 바이트 입니다.
속도면에서는 일반open 경우가 훨씬 좋았고
저 용량(400MB) 경우는 비슷했습니다.
물론 CPU 사용면에서는 O_DIRECT 가 압도적으로 사용량이 낮게 나오네요..
이유라도 알면 좋겠는데.. 답답하네요
음.. 그 정도
음.. 그 정도 용량이면, O_DIRECT가 더 빨라야 할 거 같은데요. kernel에서 DMA를 지원하는지 등을 한번 살펴보시는 게 좋을 거 같습니다.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
아직 DMA 에 대해서
아직 DMA 에 대해서 권한이 없어서 확인은 못했습니다...
그리고, 환경이 되는데로 확인하려고 합니다만
원본파일이 NFS 통해서 오기 때문에 O_DIRECT 가 어떠한 영향을 미치는지도 궁금하네요
man 페이지에서는 buffer cache 에 영향에 대한 얘기만 있어서 NFS 로 인한 영향이 애매 한거 같습니다.
O_DIRECT는 OS에서
O_DIRECT는 OS에서 관리하는 disk cache를 건너뛰고 디스크를 직접 읽는 옵션입니다.
따라서 "내가 OS 제작자보다 더 disk cache 관리 루틴을 잘 짤 수 있다."라거나 "OS가 사용패턴을 제대로 분석 못하고 삽질한다." 두 가지 경우에 사용할 수 있는 옵션이 되겠습니다.
하나의 파일을 thread를 이용하여 병렬로(?) read한다고 하셨는데, 이런 상황에서 O_DIRECT를 사용하지 않으면 OS가 알아서 순서대로 읽은 다음 잘라서 각 thread에 분배해줄 수 있지만 O_DIRECT를 사용하면 무조건 thread가 요청하는 순서대로 읽게 됩니다. 이 경우 thread가 서로서로 동기화를 잘 해서 파일의 내용을 처음부터 순서대로 요청하지 않으면 결국 random access가 되어서 성능이 매우 떨어질 것 같네요.
현재 상황에서는
현재 상황에서는 순서는 상관없습니다, 단지 정확하게 읽으면 되는 상황이고, OS 가 알아서 순서대로 읽는 다고 하셨는데,
O_DIRECT 가 아닌 상황에서도 OS 는 thread 가 요청한 순간 해당 데이터를 buffer 에 읽어 들일뿐이라고 생각합니다.
즉 각각의 thread 가 랜덤적으로 요청을 하면 file 에 대한 access 가 랜덤적으로 되서 성능이 떨어질 수는 있어도
O_DIRECT 에 의해서는 아니라고 생각합니다.
(내 지식 범위에서는 이렇지만 아니라면 답글 부탁드려요..ㅠㅠ)
그러고보니, 전
그러고보니, 전 O_DIRECT와 buffer cache에 대해서만 생각했는데, 글이 다시 읽어보니, thread를 통해서 reading 하시고 계셨었네요. 일단, thread에서 각각의 file descriptor들이 어떻게 읽어오냐에 따라서 성능에 대한 결정이 충분히 가능성은 있을 거 같습니다. file pointer의 radmon accessing보다는 VFS에서 readahead라는 매커니즘이 있습니다. 이건 파일에 대해서 sequencial하게 읽는다는게 보장되어야만 하는데, 이 것 역시 성능에 영향이 미치게 되어 있죠. thread가 어떠 식으로 파일의 영역들을 read하는지에 따라서 성능은 틀려질 수 있으니, Thread로 영역을 구분해서 read하지 마시고, single process로 성능 측정을 해보시는 것도 해보는 건 괜찮을 거 같네요..
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
일단 powerson, jick 님
일단 powerson, jick 님 조언을 듣고 여러 상황을 만들고 있습니다. 이런 상황에 대한 테스트를 하고 나면 제가 원하는 목표에 대한 좀 더 구체적인 것이 확립될 듯 싶네요, 조언 감사하고 나름 테스트를 해서 결과가 나온다면 다시 댓글을 달겠습니다.
바쁘신데 조언 정말 감사합니다..^^
좋은 하루 되십시오!
댓글 달기