web-dev-qa-db-ja.com

DNSの解決は、cURLを使用してデータをフェッチする場合にのみ遅くなります

ローカルにドメイン「engine02.prod.qc.offercal.com」がありますbind9

DNSサーバーやTTLの問題ではないと思います。ベンチマークはほとんどの場合次のようになっているからです(各方法を使用して2分間試しました):

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

僕の resolv.confファイル:

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

私はしばらくの間この問題に苦しんでいます、助けてください:D

2
Andy Xu

最近、updown.ioをビルドしているときにこの問題が発生し、少し調査しました(straceコマンドを@Danに感謝します)。これが私が見つけたものです:

状態

私の場合、カールの解決に65ミリ秒かかることもあれば、5ミリ秒未満になることもありました。短時間の非アクティブ状態(数分)後は65ミリ秒かかり、繰り返し呼び出した後は5ミリ秒未満であるように見えました。間違いなくキャッシュのように聞こえ、TTL問題は明らかです。しかし、私のレコードには86400s TTL(1day)があり、ローカルリゾルバーとDigに常にキャッシュされています。 1msかかりました。

対策

そこで、straceでcurlを実行して、時間が費やされた場所を確認しました。これが私が見つけたものです(わかりやすくするために詳細をいくつか削除しました)。

05:57:52.303 connect(3) = 0
05:57:52.303 sendmmsg(3, ["1\26\1\0\0\1\0\0\0\0\0\0\22jarthon-architecte\3"..., "\0253\1\0\0\1\0\0\0\0\0\0\22jarthon-architecte\3"...] , 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, "1\26\201\200\0\1\0\1\0\0\0\0\22jarthon-architecte\3"...) = 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, "\0253\201\200\0\1\0\0\0\1\0\0\22jarthon-architecte\3"...) = 96
05:57:52.373 close(3) = 0

これはDNS解決の部分です。ここではっきりとわかるのは、2つのメッセージが送信され、1つの応答が非常に迅速に受信され、もう1つが69ミリ秒の遅延後に受信されることです。この2番目の応答はおそらくIPv6クエリ(AAAA)だと思ったので、Digで試してみました。

$ 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)

明らかに答えはありませんが、このSOAレコードのTTLは180秒です。これは私のカールテストで5ミリ秒から65ミリ秒にかかった時間と非常によく似ています。

説明

SOAレコードは、応答がない場合にDNSサーバーによって返され、特に負のTTL(180を表示できる行の最後の番号)が含まれます)これは、リゾルバーが否定応答(レコードの不在)をキャッシュできる時間です。つまり、AAAAレコードを照会するときは、DNSサーバーに少なくとも3分ごとにアクセスして、まだそこにないことを確認する必要があります。 。

修正

  1. IPv6を追加する☺

  2. DNSを管理している場合、最も簡単な修正はこの値を増やすことです。私の場合、DNSMadeEasyを使用しているので、カスタムSOAレコードをより高いTTL値を設定し、ドメインに割り当てます: http://help.dnsmadeeasy.com/managed-dns/records/soa-start-authority-record/ 。これにより、カールの解決が速くなります。ほとんどの場合、適切にキャッシュされたAレコードのパフォーマンスのレベルに戻ります。

  3. あなたがカールを作っているがDNSを管理していない場合は、実際の値などをフェッチしながら古い否定的な応答を提供することで、DNSリゾルバーレベルでこれを最適化する方法がおそらくありますが、私は見ていませんまだそれに。

  4. IPv6を気にしない場合は、curlコマンドラインフラグ-4を使用して無効にすることもできます。

3
BigBourin

これがdebianの新しいバージョン(つまりubuntu 13+)である場合は、静的IP構成の後にdns-nameserversを/ etc/network/interfacesの最後に追加する必要があります。 resolv.confを編集すると、これらの種類のLinuxにのみ悲しみが生じます。

すなわち。

ゲートウェイラインの後

dns-nameservers local.dns.ip.hereoutside.back.ip.here

1
Aihngel Tech