dns 분석 시간 초과 고장 분석

3812 단어 경험 공유
XX 송신 인터페이스 시간 초과 문제 조사
한 마디 로 총괄 하 다
XX 전송 인터페이스 논리 에서 YY 의 http 인 터 페 이 스 를 호출 했 습 니 다. http client 에서 dns 분석 에 시간 초과 제어 가 없어 http 호출 에 시간 이 초과 되 었 습 니 다.
현상.
XX 가 접속 한 후에 온라인 모니터링 에서 메 시 지 를 보 내 는 인터페이스 응답 시간 에 우발 적 인 피크 가 있 는 것 을 발견 했다. 로 그 를 보면 시간 초과 응답 시간 은 3 - 5s 이 고 같은 시간 에 나타 나 며 최고 9s 의 시간 초과 가 있 으 며 한 기 계 는 매일 약 10 번 정도 느 린 요청 (단기 send 인터페이스 qps 약 1) 이 있다.
조사 하 다
1.    비 즈 니스 코드 의 단계별 소모 로 그 를 통 해 시간 초과 원인 은 스 팸 인 터 페 이 스 를 호출 하 는 http 요청 이 느 리 기 때 문 입 니 다.
2.    http client 설정 을 보면 cotimeout 은 100 ms 이 고 sotimeout 은 100 ms 이 며 5s 보다 훨씬 낮 습 니 다.
3.    http client 소스 코드 를 보십시오. http client 의 시간 초과 설정 에 문제 가 없습니다.
4.    한 기계 에서 http client 의 debug 로 그 를 열 고 시간 초과 로 그 를 관찰 합 니 다. 문제 가 생 긴 요청 은 모두 인쇄 되 었 습 니 다.
5.  [DEBUG] HttpConnection Open connection to safe.i.t.sina.com.cn:80

로그 위 치 는 HttpConnection. java: 692
6.    코드 를 더 살 펴 보 니 socket 이 연결 되 기 전에 dns 를 분석 하 는 함수 가 시간 초과 시간 에 들 어 오지 않 았 습 니 다.
7.   ReflectionSocketFactory:124
8.   Object remoteaddr = INETSOCKETADDRESS_CONSTRUCTOR.newInstance(
9.           new Object[] { InetAddress.getByName(host), new Integer(port)});

10.  코드 를 더 추적 하면 마지막 으로 Inet6 Address Impl. lookup AllHostAddr (Stringhostname) 에 도착 합 니 다. 대응 하 는 실현 은 native 입 니 다.
11.jdk/src/solaris/native/java/net/Inet6AddressImpl.c:139
12.JNIEXPORT jobjectArray JNICALLJava_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
13.                                         jstring host) {
14.   ....
15.   error = (*getaddrinfo_ptr)(hostname, NULL, &hints, &res);
16.   ....
17. }
18. 
19.net_util_md.c:392
20.getaddrinfo_ptr = (getaddrinfo_f)
21. JVM_FindLibraryEntry(RTLD_DEFAULT, "getaddrinfo");

22.  getaddrinfo 의 시간 초과 시간 은 운영 체제 에 의 해 결정 되 며, 기본 5s, 다시 시도 2 회 입 니 다.
23.$man resolv.conf
24....
25.timeout:n
26.sets the amount of time the resolver will wait for a response from a remote name server before retrying the  query via  a different name server.  Measured in seconds, the default is RES_TIMEOUT (currently 5, see ).  The  maximum value for this option is silently capped to 30.
27. 
28.attempts:n
29.sets the number of times the resolver will send a query to its name servers before  giving  up  and  returning  an error  to  the calling application.  The default is RES_DFLRETRY (currently 2, see ).  The maximum value for this option is silently capped to 5.

30.  XX 기기 의 온라인 설정 을 보면 dns 는 원 격 서버 로 설정 되 어 있 으 며 시간 초과 가 수정 되 지 않 았 으 며, 설 치 된 dns 서버 가 각각 다 릅 니 다. 비교 해 보면 172 네트워크 dns 를 사용 하 는 기기 의 시간 초과 요청 이 약간 많은 것 으로 나 타 났 습 니 다.
31.  호스트 가 지정 한 dns 를 수정 한 후 시간 초과 요청 이 나타 나 지 않 았 습 니 다.
해결 하 다.
1.    dnsmasq 로 컬 캐 시 dns 를 사용 합 니 다.
2.    수정 / etc / resolv. conf, dns 분석 최대 시간 초과 조정.
3.    업무 자 는 Feature 방식 으로 http 인 터 페 이 스 를 호출 합 니 다.
4.    http client 4. x 는 native dns 가 아 닌 실현 방식 이 있 는 것 같 습 니 다. 시간 초과 (현재 client 버 전 은 3. x) 를 제어 할 수 있 습 니 다.
 

좋은 웹페이지 즐겨찾기