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

发布于 2024-11-19 02:34:20 字数 895 浏览 0 评论 0原文

当我通过一台调制解调器/ISP 连接时,我的 Ubuntu 机器上的 DNS 查找速度非常慢。我按照说明进行操作(例如 此处< /a>) 使用持久 DNS 缓存,这样我就不会重复进行 DNS 查找,一切都变得更快。然而,我注意到,当在 Mercurial 上拉/推存储库时,即使传输非常小的更改也非常缓慢。深入观察,我发现所有时间都被 _socket.getaddrinfo 占用,即 DNS 查找。为什么即使所有 Web 浏览器都使用 /etc/pdnsd.conf 中的信息来使用旧的 dns 查找,但 python 套接字却不这样做。如何让 Mercurial 使用缓存查找?

更新

也可能是因为getaddrinfo尝试同时获取 ipv4 和 ipv6 地址,只有在找不到 ipv6 地址后才返回答案。我不确定如何检查这一点,即延迟是否是由于 ipv6、非持久性或两者兼而有之。

更新

它可能与ipv6请求有关,如答案中所建议的这里,一旦有机会我就必须检查一下。

I used to have very slow DNS lookups on my Ubuntu machine when connecting through one Modem/ISP. I followed instructions (such as those here) to use persistent DNS caching so I don't do repeated DNS look ups, and everything became much faster. However, I noticed that when pulling/pushing repos on mercurial, it was painfully slow to even transfer very small changes. Looking deeper, I found that all the time was taken by _socket.getaddrinfo, i.e., DNS lookups. Why is it that even though all web browsers use the info in /etc/pdnsd.conf to use old dns lookups, pythons sockets do not. How can I get mercurial to use cached lookups?

Update

It might also be because getaddrinfo tries to get both ipv4 and ipv6 addresses, and only returns the answer after it fails to find the ipv6 address. I am not sure how to check this though, i.e., whether the delay is due to ipv6, non-persistence or both.

Update

It might be related to ipv6 requests, as suggested in the answer here, I will have to check that once I get a chance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一城柳絮吹成雪 2024-11-26 02:34:20

感谢Python列表上的帖子,看来如果你使用 BIND,那么 python 的 getaddrinfo 使用缓存的 DNS 查找。安装 BIND 并启动它后,重复的 DNS 查找将立即完成。

Thanks to this post on the python list, it seems if you use BIND, then python's getaddrinfo uses cached DNS lookups. After installing BIND and starting it, then repeated DNS lookups are instantaneous.

情绪操控生活 2024-11-26 02:34:20

Pythons socket.getaddrinfo() 使用操作系统的 getaddrinfo() (通过 libc)。 – 这与 Python 完全无关。如果 pdns 已配置在解析链中,则不同的请求会产生不同的解析速度。 – 仔细观察哪些确切 getaddrinfo() 请求快,哪些慢。

Pythons socket.getaddrinfo() uses the OS’s getaddrinfo() (over libc). – This has nothing to do with Python at all. If pdns is already configured to be in the resolution-chain, then different resolution-speeds are rooted by different requests. – Look more closely at which exact getaddrinfo() requests are fast, which are slow.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文