
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-clients
1000
-> 에서30000
26214400
버퍼 오류를 중지하는 것 보다 더 높은 값으로 UDP 버퍼링 ::
net.core.rmem_max
net.core.rmem_default
로컬 포트 범위는 에서 까지이며
32768 61000
DNS1024 61000
에 사용할 수 있는 최대 포트 수는 다음과 같습니다.
net.ipv4.ip_local_port_range
기타 변경 사항::
txqueuelen
1000
-> 에서20000
ulimits
100000으로 변경되었습니다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
파일을 에 로드한 후 Wireshark
Azure DNS가 응답을 다시 보냈지 resolver
만 이미 클라이언트에 응답을 resolver
보낸 것을 확인했습니다.SERVFAIL
응답을 받기 전에 연결이 종료되는 이유는 무엇입니까? 현재 는 몇 초 net.netfilter.nf_conntrack_udp_timeout
동안 그대로 유지되지만 5초 후에 클라이언트로 전송됩니다 .30
resolver
SERVFAIL
다음은 :: 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)
결론에서 볼 수 있듯이 ServFail
5번의 시도 후에 전송됩니다.
여기까지 오셨다면 이 긴 질문을 읽어주셔서 감사합니다. 너무 무리한 질문인 건 알지만 병목 현상이 무엇인지 알 수 없으니 힌트를 주시면 감사하겠습니다.
원래 슈퍼유저에 게시됨여기
답변1
그래서 내 질문에 대답하겠습니다.
실제로 Azure 속도는 초당 쿼리 수를 1000
VM별로 제한합니다.
문서화되어 있습니다.여기. 어떤 sysctl
조정을 하든 이 속도 제한으로 인해 Azure에서 여전히 문제가 발생합니다.