O_DIRECT 옵션에 따른 성능

freedom의 이미지

안녕하세요? 오랜만에 오는군요

다름이 아니라 제가 하나의 파일을

Thread 를 이용하여 (각각의 Thread 는 하나의 파일에 대한 자신만의 FileDescriptor 를 가지고 있음)

병렬로 Read 하려고 합니다.

하던중 O_DIRECT 라는 옵션에 대한 글을 찾았는데,

몇몇분은 성능이 많이 올라 갔다고 합니다만

저 같은 경우 오히려 몇배로 성능이 떨어 졌습니다.

이유를 모르겠습니다.

open 옵션은 O_RDONLY | O_DIRECT (O_SYNC 혹은 O_DSYNC 도 넣어서 테스트 해봤습니다.)

제 생각은 지금 제가 뭔가의 전제 조건? 등 모르는게 있는거 같아서 이렇게 글 남깁니다.

OS 는 Linux 를 사용하고 있습니다.

powerson의 이미지


O_DIRECT mode는 DMA를 사용하는 mode로 알고 있습니다. 이 것은 대용량 파일(사실 어디까지가 대용량이고, 아니고는 좀 애매하긴 합니다만)에서는 속도 향상이 있지만, 작은용량의 파일들에 대해서는 오히려 buffer를 이용한, 즉 일반 open이 더 빠른 걸로 알고 있습니다. 실제로 이 부분에 대한 성능 측정도 예전 대학교 연구실에 해본적도 있고요. ^^ 그럼 수고하세요.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

freedom의 이미지

제가 지금 테스트 하는 파일의 경우 4GB 정도 됩니다.

우선 초당 읽어 들이는 속도가 O_DIRECT 경우 2MB 일반의 경우 12MB 바이트 입니다.

속도면에서는 일반open 경우가 훨씬 좋았고

저 용량(400MB) 경우는 비슷했습니다.

물론 CPU 사용면에서는 O_DIRECT 가 압도적으로 사용량이 낮게 나오네요..

이유라도 알면 좋겠는데.. 답답하네요

powerson의 이미지


음.. 그 정도 용량이면, O_DIRECT가 더 빨라야 할 거 같은데요. kernel에서 DMA를 지원하는지 등을 한번 살펴보시는 게 좋을 거 같습니다.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

freedom의 이미지

아직 DMA 에 대해서 권한이 없어서 확인은 못했습니다...

그리고, 환경이 되는데로 확인하려고 합니다만

원본파일이 NFS 통해서 오기 때문에 O_DIRECT 가 어떠한 영향을 미치는지도 궁금하네요

man 페이지에서는 buffer cache 에 영향에 대한 얘기만 있어서 NFS 로 인한 영향이 애매 한거 같습니다.

jick의 이미지

O_DIRECT는 OS에서 관리하는 disk cache를 건너뛰고 디스크를 직접 읽는 옵션입니다.

따라서 "내가 OS 제작자보다 더 disk cache 관리 루틴을 잘 짤 수 있다."라거나 "OS가 사용패턴을 제대로 분석 못하고 삽질한다." 두 가지 경우에 사용할 수 있는 옵션이 되겠습니다.

하나의 파일을 thread를 이용하여 병렬로(?) read한다고 하셨는데, 이런 상황에서 O_DIRECT를 사용하지 않으면 OS가 알아서 순서대로 읽은 다음 잘라서 각 thread에 분배해줄 수 있지만 O_DIRECT를 사용하면 무조건 thread가 요청하는 순서대로 읽게 됩니다. 이 경우 thread가 서로서로 동기화를 잘 해서 파일의 내용을 처음부터 순서대로 요청하지 않으면 결국 random access가 되어서 성능이 매우 떨어질 것 같네요.

freedom의 이미지

현재 상황에서는 순서는 상관없습니다, 단지 정확하게 읽으면 되는 상황이고, OS 가 알아서 순서대로 읽는 다고 하셨는데,

O_DIRECT 가 아닌 상황에서도 OS 는 thread 가 요청한 순간 해당 데이터를 buffer 에 읽어 들일뿐이라고 생각합니다.

즉 각각의 thread 가 랜덤적으로 요청을 하면 file 에 대한 access 가 랜덤적으로 되서 성능이 떨어질 수는 있어도

O_DIRECT 에 의해서는 아니라고 생각합니다.

(내 지식 범위에서는 이렇지만 아니라면 답글 부탁드려요..ㅠㅠ)

powerson의 이미지

그러고보니, 전 O_DIRECT와 buffer cache에 대해서만 생각했는데, 글이 다시 읽어보니, thread를 통해서 reading 하시고 계셨었네요. 일단, thread에서 각각의 file descriptor들이 어떻게 읽어오냐에 따라서 성능에 대한 결정이 충분히 가능성은 있을 거 같습니다. file pointer의 radmon accessing보다는 VFS에서 readahead라는 매커니즘이 있습니다. 이건 파일에 대해서 sequencial하게 읽는다는게 보장되어야만 하는데, 이 것 역시 성능에 영향이 미치게 되어 있죠. thread가 어떠 식으로 파일의 영역들을 read하는지에 따라서 성능은 틀려질 수 있으니, Thread로 영역을 구분해서 read하지 마시고, single process로 성능 측정을 해보시는 것도 해보는 건 괜찮을 거 같네요..

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

freedom의 이미지

일단 powerson, jick 님 조언을 듣고 여러 상황을 만들고 있습니다. 이런 상황에 대한 테스트를 하고 나면 제가 원하는 목표에 대한 좀 더 구체적인 것이 확립될 듯 싶네요, 조언 감사하고 나름 테스트를 해서 결과가 나온다면 다시 댓글을 달겠습니다.

바쁘신데 조언 정말 감사합니다..^^

좋은 하루 되십시오!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.