Python的socket.getaddrinfo/mercurial未使用持久DNS缓存
我之前在Ubuntu电脑上用某个调制解调器和网络服务提供商连接时,DNS查询速度非常慢。我按照一些说明(比如这里的)设置了持久的DNS缓存,这样就不用重复进行DNS查询,结果一切都快多了。不过,我发现用Mercurial拉取或推送代码库时,即使是很小的改动,传输速度也慢得让人受不了。深入调查后,我发现所有的时间都花在了_socket.getaddrinfo
上,也就是DNS查询上。奇怪的是,虽然所有的网页浏览器都使用/etc/pdnsd.conf
里的信息来进行旧的DNS查询,但Python的socket却不这样做。我该怎么让Mercurial使用缓存的查询结果呢?
更新
这可能是因为getaddrinfo尝试获取IPv4和IPv6地址,并且只有在找不到IPv6地址后才返回结果。我不太确定怎么检查这个,也就是说,延迟是因为IPv6、非持久性,还是两者都有。
更新
这可能和IPv6请求有关,正如这里的回答所提到的,我得找机会检查一下。
2 个回答
1
Python的socket.getaddrinfo()其实是用操作系统里的getaddrinfo(),这个和Python本身没有关系。如果pdns已经设置好在解析链里,那么不同的解析速度是因为不同的请求造成的。你需要仔细看看哪些具体的getaddrinfo()请求是快的,哪些是慢的。
1
感谢这篇在python列表上的帖子,看起来如果你使用BIND的话,Python的getaddrinfo函数会使用缓存的DNS查询。安装并启动BIND后,重复的DNS查询就会变得非常快。