open시 O_SYNC, O_DSYNC, O_DIRECT

sysadmin의 이미지

안녕하십니까?

Disk Write 속도 테스트를 하고 있는데, 이해가 안가는 부분이 있어
질문드립니다..

아래와 같이 테스트를 하였습니다.
open : O_CREAT|O_TRUNC|O_WRONLY|O_SYNC(또는 O_DSYNC)
write : 200Bytes(100만건)
fsync : 사용하지 않음
결과 : 17~19초(초당 약 5~6만건)

[질문1]
위의 프로그램을 하나만 실행하면 별 문제가 없습니다.
그런데, 동일한 프로그램을 2개(a.dat와 b.dat 파일)를 띄우면
속도가 현저히(10배 이상) 떨어집니다.. ==> 이해가 안가는 부분이구요..

[질문2]
그리고 a.dat와 b.dat가 물리적으로 서로 다른 Disk인 경우에는 원래의 속도가 납니다. ==> 이건 더 이해가 안가네요..
O_SYNC를 파일단위가 아닌 Disk단위로 적용되는 건지?(말도 안되는 것 같습니다만 결과가 이러니..)
혹시 시스템옵션에 설정하는 게 있는건 아닌지..

[질문3]
open시에 O_DIRECT를 주고 동일한 테스트를 했더니, 7-8초(초당 약 13만건) 정도밖에
걸리지가 않네요..
O_DIRECT로 open한 경우에는 fsync를 하지 않아도 되는건지?

참고로, AIX 5.3에서 테스트했습니다.

혹시 경험이 있으신 분이 계시면 답변 부탁드립니다..

tangtung의 이미지

AIX 에서의 경험은 아닙니다. 제가 아는 짧은 지식으로 말씀드리면...

질문2] 물리적으로 다른 디스크에 쓰면 당연히 각각의 디스크와 관련된 I/O 큐에 I/O 요청이 들어가기 때문에 하나의 테스트로 했을 때와 비슷한 속도가 나오는게 맞습니다. O_SYNC 는 파일 단위로 되는것이 맞지요. 파일단위이지만 결국 하나의 디스크 I/O 큐로 요청을 하기때문에, 처음 테스트한 것과 당연히 비슷한 결과가 나와야 할 것으로 생각됩니다.

질문3] O_DIRECT 는 user -> kernel 메모리 copy 를 생략하기 때문에, 옵션이 없는 경우보다 빨라지는 것입니다. 메모리 copy 에 소요되는 CPU 와 메모리 등의 자원에 대한 cost 가 줄어들기 때문입니다. fsync 는 아마 안해도 될 것 같은데요? O_DIRECT 옵션은 어떤 응용 프로그램을 사용하느냐에 따라 잘 선택해서 사용하는 것이 좋습니다.
http://www.ukuug.org/events/linux2001/papers/html/AArcangeli-o_direct.html

질문1] 좀 애매한데요. 200byte 짜리 파일을 100만개 썼다는 것인지? 한개의 파일에 200byte 씩 100만번 write 를 했다는 것인지, 아니면 한개의 파일을 200byte 쓰고, 다시 지우고 200byte 쓰고를 반복해서 100만번을 하신것인지 명확하지 않군요.

O_TRUNC 옵션을 보면 아마 지우고 새로 쓰는 것을 100만번 반복 했다는 것 같습니다.

어찌되었던 현상은 I/O 가 서로 간섭을 일으키는 것처럼 보입니다.
리눅스의 I/O 는 인접한 블럭에 대한 각각의 요청을 하나의 요청으로 묶어서 I/O 큐에 전달하는데 AIX 도 그렇게 되어있는지는 모르겠습니다. top 에서 I/O wait 이 차지하는 비율을 비교해보셔서 한개 프로세스를 사용할때 보다, 두개를 사용할때가 wait 이 높게 나온다면, 디스크 I/O 가 효율적이지 못하다는 것을 유추할 수 있을 것 같네요.

위 테스트에서 I/O 효율과 관련될 수 있을 법한 내용은

1. 파일시스템 bitmap allocation 방법,
2. IO subsystem 알고리즘

위 내용은 수정하거나 바꿀 수 있는 것이 아니기 때문에, 테스트방법을 여러가지(write 크기를 크게 한다거나, O_SYNC 옵션을 뺀다거나)로 해보시고 비교해보시는 것이 좋지 않을까 싶네요. 1번의 경우라면 AIX 에서 다른 파일시스템에서 테스트 해보는 것도 괜찮겠군요.(AIX도 여러파일시스템을 지원하는지는 잘 모르겠습니다만..)

==========================
별은 바라보는 자에게 빛을 준다

==========================
별은 바라보는 자에게 빛을 준다

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.