Python的socket.getaddrinfo/mercurial未使用持久DNS缓存

4
我曾经在通过一个调制解调器/ISP 连接时,在我的Ubuntu机器上进行DNS查找非常缓慢。我按照指示(例如这里)使用持久性DNS缓存,因此我不会重复进行DNS查找,一切都变得更快了。然而,我注意到,在mercurial上拉/推回repos时,即使是传输非常小的更改也非常缓慢。深入研究后,我发现所有时间都被_socket.getaddrinfo占用,即DNS查找。为什么即使所有Web浏览器都使用/etc/pdnsd.conf中的信息来使用旧的DNS查找,Python套接字却没有这样做。如何让mercurial使用缓存的查找? 更新 这也可能是因为getaddrinfo尝试获取ipv4和ipv6地址,并且仅在无法找到ipv6地址之后返回答案。但我不确定如何检查这一点,即延迟是由于ipv6,非持久性还是两者都有。

更新

可能与ipv6请求有关,如此处中所建议的那样,我将在有机会时进行检查。

2个回答

1
感谢 Python 列表上的这篇文章,看起来如果您使用 BIND,则 Python 的 getaddrinfo 将使用缓存的 DNS 查找。安装 BIND 并启动后,重复的 DNS 查找将是瞬间完成的。

我认为所提及的电子邮件现在已经移到了 https://mail.python.org/pipermail/python-list/2011-July/607822.html - jamesc

1

Python的socket.getaddrinfo()使用操作系统的getaddrinfo()(通过libc)。这与Python 完全 无关。如果pdns已经配置为在解析链中,则不同的解析速度源于不同的请求。请仔细查看哪些确切的 getaddrinfo() 请求是快速的,哪些是慢的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接