netdb류 함수는 무겁다?

purewell의 이미지

서버 쪽 프로그래밍을 하다보니 가끔씩 netdb류 함수(gethostbyaddr 같은거)를 많이 쓰게 되는데, 프로파일링이나 ltrace 걸어보면 호출 횟수에 비해 어마어마하게 응답시간이 크더군요. glibc의 resolv디렉토리 까보니 좀 복잡하고 호출하는게 많긴 하더군요. 그래도 응답시간이 무척이나 크던데...

nsswitch.conf에 hosts는 "files dns"로 잡혀 있고 resolv.conf에 등록한 nameserver는 없습니다. 그럼 /etc/hosts에서 찾아와야할텐데 생각보다 느리네요.

로그인을 담당하는 서버에 사용했더니 가끔씩 한 컨넥션의 gethostbyaddr을 처리하기 위해 다른 컨넥션들이 처리되지 못하여 시간초과로 끊기는 불상사가 있었습니다.

$ tcpdump -xXnN -s 2000 udp

TCP덤프를 UDP로 떠봐도 DNS쿼리하는 부분도 없고 말이죠. (가끔씩 netbios패킷은 보이지만)

netdb류 함수가 원래 이렇게 좀 무거운가요? 아니면 설정을 잘못해서인가요?

imyejin의 이미지

IPV6 환경에서까지 호환성 있는 코드를 작성하시려면 getaddrinfo 류를 사용하세요.

원래 어느 정도는 무거운 함수입니다. 그거 부를 때마다 구조체를 동적 할당하죠.
것도 그냥 구조체 하나가 아니라 구조체 리스트를 돌려주는 구조입니다.
쓴 다음에는 freeaddrinfo 로 해제해야 하죠.
그리고 reverse lookup을 하면 더 느리지 않나요?

보통은 nss cache 정도면 리스트 동적할당도 버틸만 할 거 같은데 getaddrinfo 류 함수를 매우 자주 호출하는 프로그램인가요?
성능에 영향이 많은 병목이고 어차피 항상 같은 넘들만 돌려주는 거라면 getaddrinfo 결과를 일정 시간 캐싱해 두는 것도 좋을 것 같습니다.
자바 네트웍 라이브러리 같은 경우는 기본적으로 그런 식의 캐싱을 한다고 하더군요.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

purewell의 이미지

man페이지를 참조하면 gethostbyaddr은 static변수를 사용하여 언제나 같은 포인터를 내보내고 있으며, 위에 쓴 것처럼 네임쿼리 순서가 files->dns로 되어 있고, nameserver가 아무것도 설정되어 있지 않으면 바로 리턴이 될꺼라 봅니다. 그런데도 다른 함수에 비해 응답시간이 너무 커서요.

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

ganadist의 이미지

libc에 있는 넘들은 모두 block 모드로만 실행됩니다. 따라서 dns로부터 응답이 올때 까지 아무짓도 할 수 없습니다.

ADNS같은넘을 써보세요.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

댓글 달기

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