높은 DNS QPS 처리량 달성

높은 DNS QPS 처리량 달성

DNS Resolver VM의 최대 QPS(초당 쿼리)를 찾으려고 합니다.

168.63.129.16우리는 Azure에서 호스팅되는 인프라를 보유하고 있으며, VM(바인딩 기반)이 Azure 기본 DNS( ) 및 온프레미스 DNS를 쿼리하는 확인자 역할을 합니다 . 확인자에 대한 쿼리를 캐싱하지 않으며 각 A 레코드의 TTL은 300초입니다.

로드를 트리거하기 위해 dnsperf&를 ​​사용하고 있습니다 (A 레코드만 해당). resperf이제 최대 100K QPS의 DDOS 공격을 견딜 수 있는 DNS 확인자를 준비하고 있습니다. 내 확인자와 Azure 기본 DNS 확인자 간의 쿼리 속도 제한과 같은 문제에 직면하고 있습니다. 결과적으로 QPS가 증가하면 확인자는 SERVFAIL클라이언트에 응답을 다시 반환합니다. 그러나 SERVFAIL리졸버와 온프레미스 기반 DNS 간의 응답은 나타나지 않았습니다 .

Azure DNS를 대상으로 하는 동안 확인할 수 있는 최대 QPS는 약 2100입니다. Azure에서 수행한 속도 제한이 있는지 온라인에서 많이 검색했지만 관련된 항목을 찾을 수 없습니다. 어떻게든 Azure 인프라 규모에 비해 2K QPS가 매우 낮기 때문에 확인자 VM이 병목 현상을 겪을 것으로 예상됩니다.

몇 가지 사항(커널 sysctl 변경)이 최종적으로 변경되었지만 약간 개선되었지만 많이는 개선되지 않았습니다.

바인딩 구성 변경 ::

  • recursive-clients1000-> 에서30000

26214400버퍼 오류를 중지하는 것 보다 더 높은 값으로 UDP 버퍼링 ::

  • net.core.rmem_max
  • net.core.rmem_default

로컬 포트 ​​범위는 에서 까지이며 32768 61000DNS 1024 61000에 사용할 수 있는 최대 포트 수는 다음과 같습니다.

  • net.ipv4.ip_local_port_range

기타 변경 사항::

  • txqueuelen1000-> 에서20000

  • ulimits100000으로 변경되었습니다

  • net.netfilter.nf_conntrack_max훨씬 더 높은 값으로 변경되었습니다.

위 내용 외에도 VM 크기를 (1 코어, 2GB RAM) -> (4 코어, 8GB RAM) 에서 늘렸습니다. 증가 후 패킷 오류는 사라졌으나(체크 netstat -s) 오류가 개선되지 않았습니다 SERVFAIL.

tcpdump오류 패턴을 확인할 수 있도록 했습니다 SERVFAIL. 오류가 발생한 경우 확인자는 Azure DNS에 쿼리를 5번(각각 1초마다) 보내려고 시도하지만 Azure DNS로부터 아무 응답도 듣지 못하여 SERVFAIL클라이언트에 응답을 다시 보냅니다. pcap파일을 에 로드한 후 WiresharkAzure DNS가 응답을 다시 보냈지 resolver만 이미 클라이언트에 응답을 resolver보낸 것을 확인했습니다.SERVFAIL

응답을 받기 전에 연결이 종료되는 이유는 무엇입니까? 현재 는 몇 초 net.netfilter.nf_conntrack_udp_timeout동안 그대로 유지되지만 5초 후에 클라이언트로 전송됩니다 .30resolverSERVFAIL

다음은 :: tcpdump동안의 로그 입니다 .ServFail

reading from file dns4.pcap, link-type EN10MB (Ethernet)
10.0.0.10.57710 > 10.0.0.11.domain: [udp sum ok] 1612+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.44513 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0x8cfd!] 52637+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=4096 DO (77)
10.0.0.11.32378 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0x3950!] 20672+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=512 DO (77)
10.0.0.11.59973 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0xe2e5!] 15199+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=512 DO (77)
10.0.0.11.29976 > 168.63.129.16.domain: [bad udp cksum 0xbec2 -> 0x051b!] 47104+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.43442 > 168.63.129.16.domain: [bad udp cksum 0xbec2 -> 0xe791!] 41199+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.domain > 10.0.0.10.57710: [bad udp cksum 0x2a89 -> 0x5e30!] 1612 ServFail q: A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. 0/0/0 (66)

결론에서 볼 수 있듯이 ServFail5번의 시도 후에 전송됩니다.

여기까지 오셨다면 이 긴 질문을 읽어주셔서 감사합니다. 너무 무리한 질문인 건 알지만 병목 현상이 무엇인지 알 수 없으니 힌트를 주시면 감사하겠습니다.

원래 슈퍼유저에 게시됨여기

답변1

그래서 내 질문에 대답하겠습니다.

실제로 Azure 속도는 초당 쿼리 수를 1000VM별로 제한합니다.

문서화되어 있습니다.여기. 어떤 sysctl조정을 하든 이 속도 제한으로 인해 Azure에서 여전히 문제가 발생합니다.

관련 정보