[번역] epoll : level triggered patch 를 내놓으면서.

nomoreid의 이미지

어제 서버실 정리도중 개발서버 파워부분이 나가서 구굴링을 하던중 발견한
lt epoll에 관한 글입니다. 원문보기

LT는 level triggered , ET는 외계인 ET가 아니라Edge triggered 의 약자 입니다.
꽤 까마득한 글이지만. ET방식이 기본이었던 epoll이 왜 LT기본으로 바뀌었는지에 대해 알려주는 중요한 역사적인 글 같아서 번역해 봅니다.

요즘 LT를 쓸까 ET를 쓸까 고민하고 있던때라서 저같은 고민이 있는 분에게 도움이 될듯 합니다. ^^ (더 복잡해 지려나 ㅎㅎㅎ)

(번역)

lt-epoll (level triggered epoll)

지난 3달동안 나는 꽤 많은 시간을 개발자들에게 edge triggered API들이 어떻게 동작하는지, epoll을 어떻게 써야 할지 설명하는데 보냈다. 그건 내게 현실을 알게해준 시간이었다. 이게 바로 그 현실이다.

1) 개발자들은 ET API에 대해 전혀 이해하지 못하고 있다.
2) 대부분의 존재하는 어플리케이션들은 LT API를 사용한다.

ET 인터페이스와 와 LT 인터페이스의 차이를 간단히 설명하기 위해 다음 상황을 가정해 보자.

1) pipe writer가 2kb의 데이터를 썼다.
2) pipe reader가 1kb를 읽었다.
3) pipe reader가 epoll_wait 을 호출한다.

ET API 에서는 I/O space가 다 비워지지 않으면 어플리케이션은 3)에서 멈춘다. because to trasition 0->1 won't be possible (<<- 이부분은 번역불가 -_-; ) LT API에서는 어플리케이션은 poll() 때처럼 EPOLLIN event를 받을 것이다.

지난 주말에 Niels 과 Marius 의 도움으로 epoll을 LT API로 구현하는것을 시도했다. 이것이 바로 epoll을 LT API로 바꾸는 patch이다. 이 patch는 2.5.64 kernel을 기준으로 작업되었다. 오리지널 버전에서 정말로 최소한의 부분만 수정되었다. 내 기계에서 테스트 해본 결과 ET API과 비교해도 손색없는 결과가 나왔다. 내 의견으로는 LT API가 두가지 면에서 잇점이 있는거 같다.

1) 개발자들은 ET API에 비해 이것을 훨씬 잘 이해하고 잘 쓰고 있다.
2) 현존하는 많은 어플리케이션들이 poll/select같은 LT epoll이 포팅하기 쉬운 형태로 되어 있다.

LT epoll은 모든면에서 poll보다 빠르고 모든 poll을 대체할 수 있다. 이걸 테스트 하기 위해서 thttped를 LT poll로 포팅해 봤는데 LT epoll은 나를 실망시키지 않았다. Niels 과 Marius는 또한 꽤 괜찮은 이벤트 라이브러리를 만들었다.

[url]http://monkey.org/~provos/libe­vent/[/url]

LT epoll을 사용하는건 poll과 select를 사용하는것과 같다고 보면 된다. ET epoll과는 전혀 다른 사용 패턴이다. ET epoll을 쓸때는 fd를 epoll에 등록할때 EPOLLIN|EPOLLOUT 옵션으로 등록해야 하지만 LT epoll은 간단하게 epoll_ctl(EPOLL_CTL_MOD)를 써서 EPOLLIN 과 EPOLLOUT을 전환해주면된다. 이런상황에서 3가지 선택사항이 있었다.

1) epoll을 그냥 ET 로 둔다. (패치를 적용하지 않는다.)
2) 이 패치를 적용해서 LT상태로 만든다.
3) 파라메터를 epoll_create등에 적용해서 생성때 선택한다.

2)와 3)에 대한 man page는 Andries에 의해 다시 쓰여져서 포스팅되었다.
코멘트?

___________________________________________________________________________________

PS. (nomoreid주)
현재 대부분의 커널 2.6 배포판들은 위 패치가 적용된 상태입니다. (sys/epoll)
즉 기본적으로 아무런 옵션을 주지 않으면 LT epoll로 동작합니다.

LT epoll은 파일(소켓)디스크립터가 많으면 ET epoll보다 성능저하가 있을 수 있습니다.
하지만 그래도 여전히 poll이나 select보다 빠릅니다.

PS2. 위의 번역불가인 부분 번역해 주실분 손!!

PS3. 오역수정은 언제나 환영입니다

Forums: 
정태영의 이미지

http://www.joinc.co.kr/modules/moniwiki/wiki.php/epoll

우선 joinc 위키에 관련된 부분이 한글로 잘 정리되어 있는 듯 하군요 :)

because to trasition 0->1 won't be possible
말 그대로 해석하면 0->1 로 변하는건 불가능하다. (실제로 일어나지 않는다)

정도일 듯 하군요..

joinc wrote:
만약 RFD 파일 지정자가 EPOLLET 플래그를 이용할경우 마지막 단계의 epoll_wait(2)는 영원히 반환되지 않을 것이다. 왜냐하면 위의 단계를 보면 쓴 데이터는 2kb인데 반해 읽어들인 데이터는 1kb임을 알수 있다. 이럴 경우 여전히 파일 입력 버퍼에는 사용할수 있는 데이터가 남아 있게 되고 버퍼를 모두 비우기 전까지는 원격 클라이언트에게 응답(메시지 수신이 끝났다는)을 보내지 않게 된다.

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

nomoreid의 이미지

정태영 wrote:
http://www.joinc.co.kr/modules/moniwiki/wiki.php/epoll

우선 joinc 위키에 관련된 부분이 한글로 잘 정리되어 있는 듯 하군요 :)

위에도 썻듯이 왜 ET 기본에서 LT로 바뀌었는지 알려주는 문서라서 번역해 본것입니다. 위에서 썻듯이 역사적인 가치(?)가 있어서.. ㅎㅎ "know how" 라기보단 "know why" 쪽 문서죠.

아 방금 서버 파워 교체가 이루어졌습니다. T_T

Never Ending 삽질.

댓글 달기

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