netdb류 함수는 무겁다?
글쓴이: purewell / 작성시간: 수, 2008/10/15 - 1:52오후
서버 쪽 프로그래밍을 하다보니 가끔씩 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류 함수가 원래 이렇게 좀 무거운가요? 아니면 설정을 잘못해서인가요?
Forums:
IPV6 환경에서까지
IPV6 환경에서까지 호환성 있는 코드를 작성하시려면 getaddrinfo 류를 사용하세요.
원래 어느 정도는 무거운 함수입니다. 그거 부를 때마다 구조체를 동적 할당하죠.
것도 그냥 구조체 하나가 아니라 구조체 리스트를 돌려주는 구조입니다.
쓴 다음에는 freeaddrinfo 로 해제해야 하죠.
그리고 reverse lookup을 하면 더 느리지 않나요?
보통은 nss cache 정도면 리스트 동적할당도 버틸만 할 거 같은데 getaddrinfo 류 함수를 매우 자주 호출하는 프로그램인가요?
성능에 영향이 많은 병목이고 어차피 항상 같은 넘들만 돌려주는 거라면 getaddrinfo 결과를 일정 시간 캐싱해 두는 것도 좋을 것 같습니다.
자바 네트웍 라이브러리 같은 경우는 기본적으로 그런 식의 캐싱을 한다고 하더군요.
임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
man페이지를 참조하면
man페이지를 참조하면 gethostbyaddr은 static변수를 사용하여 언제나 같은 포인터를 내보내고 있으며, 위에 쓴 것처럼 네임쿼리 순서가 files->dns로 되어 있고, nameserver가 아무것도 설정되어 있지 않으면 바로 리턴이 될꺼라 봅니다. 그런데도 다른 함수에 비해 응답시간이 너무 커서요.
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
libc에 있는 넘들은
libc에 있는 넘들은 모두 block 모드로만 실행됩니다. 따라서 dns로부터 응답이 올때 까지 아무짓도 할 수 없습니다.
ADNS같은넘을 써보세요.
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
댓글 달기