健康)状况

健康)状况

我在本地有域名“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

答案1

我最近在构建 updown.io 时遇到了这个问题,并对其进行了一些调查(感谢 @Dan 提供的strace命令)。以下是我发现的内容:

健康)状况

在我的案例中,curl 有时需要 65 毫秒才能解决,有时则不到 5 毫秒。短暂不活动(几分钟)后似乎需要 65 毫秒,重复调用后则不到 5 毫秒。这听起来显然是缓存和 TTL 问题。但我的记录有 86400 秒的 TTL(1 天),它已经缓存在我的本地解析器上,而 dig 总是需要 1 毫秒。

措施

因此我尝试运行 curl 来strace查看时间都花在了哪里,以下就是我发现的结果(为了清楚起见,删除了一些细节):

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 条消息,一条响应很快收到,另一条响应在延迟 69 毫秒后收到。我认为第二个响应可能是 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 记录有 180 秒的 TTL,这看起来很像我在 curl 测试中从 5 毫秒到 65 毫秒所花费的时间。

解释

当没有答案时,DNS服务器会返回SOA记录,其中包含负TTL(您可以看到该行的最后一个数字是180),这是允许任何解析器缓存负响应(记录缺失)的时间。因此,这意味着当您查询AAAA记录时,您必须至少每3分钟访问一次DNS服务器,以确保它仍然不存在。

使固定

  1. 添加 IPv6 ☺

  2. 如果您正在管理 DNS,最简单的解决方法是增加此值,在我的情况下,我使用 DNSMadeEasy,我可以创建具有更高 TTL 值的自定义 SOA 记录并将其分配给我的域:http://help.dnsmadeeasy.com/managed-dns/records/soa-start-authority-record/。这将使 curl 在大多数情况下解析速度更快,回到我们在正确缓存的 A 记录上的性能水平。

  3. 如果您是进行卷曲但不管理 DNS 的人,那么可能有方法可以在 DNS 解析器级别进行优化,通过在获取真实值或类似内容时提供陈旧的负面响应,但我还没有研究过这一点。

  4. 如果你不关心 IPv6,你也可以使用curl命令行标志禁用它-4

答案2

如果这是较新版本的 debian(即 ubuntu 13+),则需要将 dns-nameservers 附加到静态 ip 配置后的 /etc/network/interfaces 末尾。编辑 resolv.conf 只会给您在这些版本的 Linux 上带来麻烦。

IE。

网关线之后

dns 名称服务器 local.dns.ip.here outside.back.ip.here

相关内容