A resolução de DNS é lenta apenas ao usar cURL para buscar dados

2

Eu tenho domínio 'engine02.prod.qc.offercal.com' no meu local bind9 .

Eu não acho que seja um problema de servidor DNS ou TTL, porque o benchmark é quase sempre assim (eu tentei por 2 minutos usando cada método):

curl -o /dev/null http://engine02.prod.qc.offercal.com:49157/void

        time_namelookup:  0.150
           time_connect:  0.151
     time_starttransfer:  0.152
                        ----------
             time_total:  0.152

curl -o /dev/null http://192.168.100.10:49157/void # use IP directly

                  time_namelookup:  0.000
           time_connect:  0.002
     time_starttransfer:  0.003
                        ----------
             time_total:  0.003

time dig @192.168.100.4 engine02.prod.qc.offercal.com

        real 0m0.009s
        user 0m0.004s
        sys  0m0.004s

time host engine02.prod.qc.offercal.com

        engine02.prod.qc.offercal.com has address 192.168.100.10
        real    0m0.011s
        user    0m0.006s
        sys     0m0.004s

Meu arquivo resolv.conf :

[root@gateway01 ~]# cat /etc/resolv.conf 
nameserver 192.168.100.4

Eu tenho lutado com esse problema por algum tempo, por favor ajude: D

    
por Andy Xu 08.02.2015 / 13:18

2 respostas

3

Acabei de acertar este problema recentemente ao construir o updown.io e o investiguei um pouco (obrigado @Dan pelo comando strace ). Aqui está o que eu encontrei:

Condição

No meu caso, o curl às vezes demorava 65ms para resolver e às vezes < 5ms. Parecia demorar 65 ms após um curto período de inactividade (alguns minutos) e < 5 ms após repetidas chamadas. Definitivamente soa como um problema de cache e TTL, obviamente. Mas meu disco tem um 86400s TTL (1 dia) e já estava em cache no meu resolvedor local e dig sempre demorou 1ms.

Medidas

Então, tentei executar o curl com strace para ver onde o tempo foi gasto, e foi isso que encontrei (removi alguns detalhes para esclarecer):

05:57:52.303 connect(3) = 0
05:57:52.303 sendmmsg(3, ["1
$ dig AAAA jarthon-architecte.com

;; AUTHORITY SECTION:
jarthon-architecte.com. 180 IN  SOA ns0.dnsmadeeasy.com. dns.dnsmadeeasy.com. 2008010120 43200 3600 1209600 180

;; Query time: 86 msec
;; SERVER: ::1#53(::1)
05:57:52.303 connect(3) = 0
05:57:52.303 sendmmsg(3, ["1
$ dig AAAA jarthon-architecte.com

;; AUTHORITY SECTION:
jarthon-architecte.com. 180 IN  SOA ns0.dnsmadeeasy.com. dns.dnsmadeeasy.com. 2008010120 43200 3600 1209600 180

;; Query time: 86 msec
;; SERVER: ::1#53(::1)
%pre%%pre%%pre%%pre%%pre%%pre%%pre%jarthon-architecte"..., "53%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%jarthon-architecte"...] , 2) = 2 05:57:52.303 poll([{fd=3, events=POLLIN}], 1, 5000) = 1 05:57:52.303 ioctl(3, FIONREAD, [56]) = 0 05:57:52.303 recvfrom(3, "110%pre%%pre%%pre%%pre%%pre%%pre%jarthon-architecte"...) = 56 05:57:52.304 poll([{fd=3, events=POLLIN}], 1, 4999) = 1 05:57:52.373 ioctl(3, FIONREAD, [96]) = 0 05:57:52.373 recvfrom(3, "5310%pre%%pre%%pre%%pre%%pre%%pre%jarthon-architecte"...) = 96 05:57:52.373 close(3) = 0
%pre%%pre%%pre%%pre%%pre%%pre%jarthon-architecte"..., "53%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%jarthon-architecte"...] , 2) = 2 05:57:52.303 poll([{fd=3, events=POLLIN}], 1, 5000) = 1 05:57:52.303 ioctl(3, FIONREAD, [56]) = 0 05:57:52.303 recvfrom(3, "110%pre%%pre%%pre%%pre%%pre%%pre%jarthon-architecte"...) = 56 05:57:52.304 poll([{fd=3, events=POLLIN}], 1, 4999) = 1 05:57:52.373 ioctl(3, FIONREAD, [96]) = 0 05:57:52.373 recvfrom(3, "5310%pre%%pre%%pre%%pre%%pre%%pre%jarthon-architecte"...) = 96 05:57:52.373 close(3) = 0

Esta é parte da resolução de DNS, o que podemos ver claramente aqui é que 2 mensagens são enviadas, uma resposta é recebida rapidamente, e outra é recebida após um atraso de 69ms. Eu pensei que esta segunda resposta é provavelmente a consulta IPv6 (AAAA), então eu tentei em dig:

%pre%

Ok, não há resposta óbvia, mas esse registro SOA tem um TTL de 180s, isso parece muito com o tempo que levou para passar de 5ms para 65ms em meus testes de curvas.

Explicação

O registro SOA é retornado pelo seu servidor DNS quando não há resposta e contém, entre outras coisas, o TTL negativo (último número na linha que você pode ver 180) que é o momento em que qualquer resolvedor pode armazenar respostas negativas (ausência de registro). Então, isso significa que, quando você consulta o registro AAAA, você precisa pressionar o servidor DNS pelo menos a cada 3 minutos apenas para ter certeza de que ainda não existe.

Corrigir

  1. Adicione um IPv6 ☺

  2. Se você gerencia o DNS, a solução mais fácil é aumentar esse valor. No meu caso, estou usando DNSMadeEasy, posso criar um registro SOA personalizado com um valor TTL mais alto e atribuí-lo aos meus domínios: link . Isso fará com que o curl seja resolvido mais rapidamente na maior parte do tempo, retornando ao nível de desempenho que temos em nosso registro A em cache.

  3. Se você é quem faz os cachos, mas não gerencia o DNS, provavelmente há maneiras de otimizar isso no nível do resolvedor de DNS, atendendo a respostas negativas obsoletas ao buscar os valores reais ou coisas assim, mas eu não olhei para isso ainda.

  4. Se você não se importa com o IPv6, também pode desativá-lo usando o sinalizador de linha de comando curl -4

por 22.07.2017 / 12:42
1

Se esta é uma versão mais nova do Debian (ou seja, Ubuntu 13+) você precisa ter seus servidores de nome DNS anexados ao final de / etc / network / interfaces após sua configuração de IP estático. A edição de resolv.conf só trará pesar sobre esses sabores do linux.

ie.

após a linha do gateway

dns-nameservers local.dns.ip.aqui outside.back.ip.aqui

    
por 08.02.2015 / 21:06