首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
拉钩
V2EX  ›  Go

Golang 中 DNS 查询时 pure Go resolver 和 cgo resolver 耗时相差很大的原因

  •  
  •   rayhy · 6 天前 · 341 次点击

    我昨天在这里提了一个问题Golang 中 http.Get 的耗时比 curl 耗时大很多是什么原因?, V 友@zeyexe已经帮我解答了问题(太强了!),他说应该是 Golang 的 net 库中的不同resolver导致的差异。不同耗时可能是 Windows 默认走系统调用,可能有 cache 加速。

    今天想了下,即使是 cache 也不可能带来 pure Go resolver 和 cgo resolver 20s 左右的差异,就又花时间仔细探索了一下。

    探索过程记录在我的博客里了,限于篇幅,在这儿直接说我最后发现的原因:

    Go 版本 DNS 查询(pure Go resolver)在 Go 1.11 中出现了一个 bug(之前的版本没有这个 bug):不能正确处理/etc/resolv.conf中有 nameserver 不工作时的情形,不能“ fail fast ”,导致 timeout。这个 bug 经过 Go 开发人员在#133675#138175的讨论,已经在这个commit中修复,更新到 Go 1.11.1 就没有这个问题了。

    至于更细节的这个 bug 是怎么出现的,又是怎么修好的。我就不再探索了,毕竟,我只是一个刚看到《 The Go Programming Language 》第一章的小白:sweat_smile:。

    3 回复  |  直到 2018-12-08 22:35:24 +08:00
        1
    rayhy   6 天前
    @icexin , 因为话有点多,我就新开了一个帖子,没有在原贴中回复。再次感谢大佬的远程 debug,😁
        2
    azzwacb9001   4 天前
    嚯,厉害呀,摸到了官方 BUG🤣
        3
    rayhy   4 天前
    @azzwacb9001,哈,摸到最后是有点震惊。说起来这帖子几乎没人评论。。沉了的第一天伤心了一会儿 23333
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3590 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 23ms · UTC 08:17 · PVG 16:17 · LAX 00:17 · JFK 03:17
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1