AdguardTeam / dnsproxy

Simple DNS proxy with DoH, DoT, DoQ and DNSCrypt support
Apache License 2.0
2.44k stars 247 forks source link

{bug} panic: net/http: internal error: connCount underflow #278

Closed Potterli20 closed 1 year ago

Potterli20 commented 2 years ago

Sep 28 12:59:27 potter dnsproxy[91339]: panic: net/http: internal error: connCount underflow Sep 28 12:59:27 potter dnsproxy[91339]: goroutine 799711 [running]: Sep 28 12:59:27 potter dnsproxy[91339]: net/http.(Transport).decConnsPerHost(0xc026a3c000, {{0x0, 0x0}, {0xc028963d00, 0x5}, {0xc01a26b0e0, 0xd}, 0x0}) Sep 28 12:59:27 potter dnsproxy[91339]: /usr/local/go/src/net/http/transport.go:1476 +0x592 Sep 28 12:59:27 potter dnsproxy[91339]: net/http.(Transport).roundTrip(0xc026a3c000, 0xc01c105000) Sep 28 12:59:27 potter dnsproxy[91339]: /usr/local/go/src/net/http/transport.go:605 +0x88b Sep 28 12:59:27 potter dnsproxy[91339]: net/http.(Transport).RoundTrip(0xc01c105000?, 0xa090c0?) Sep 28 12:59:27 potter dnsproxy[91339]: /usr/local/go/src/net/http/roundtrip.go:17 +0x19 Sep 28 12:59:27 potter dnsproxy[91339]: net/http.send(0xc01c104f00, {0xa090c0, 0xc026a3c000}, {0x92f3e0?, 0x4b6c01?, 0xcdaf60?}) Sep 28 12:59:27 potter dnsproxy[91339]: /usr/local/go/src/net/http/client.go:251 +0x5f7 Sep 28 12:59:27 potter dnsproxy[91339]: net/http.(Client).send(0xc01d3f9c20, 0xc01c104f00, {0x0?, 0x40e75f?, 0xcdaf60?}) Sep 28 12:59:27 potter dnsproxy[91339]: /usr/local/go/src/net/http/client.go:175 +0x9b Sep 28 12:59:27 potter dnsproxy[91339]: net/http.(Client).do(0xc01d3f9c20, 0xc01c104f00) Sep 28 12:59:27 potter dnsproxy[91339]: /usr/local/go/src/net/http/client.go:715 +0x8fc Sep 28 12:59:27 potter dnsproxy[91339]: net/http.(Client).Do(...) Sep 28 12:59:27 potter dnsproxy[91339]: /usr/local/go/src/net/http/client.go:581 Sep 28 12:59:27 potter dnsproxy[91339]: github.com/AdguardTeam/dnsproxy/upstream.(dnsOverHTTPS).exchangeHTTPSClient(0xc000030500, 0xc0122c9440, 0xc0122c9440?) Sep 28 12:59:27 potter dnsproxy[91339]: /root/dnsproxy/upstream/upstream_doh.go:169 +0x3db Sep 28 12:59:27 potter dnsproxy[91339]: github.com/AdguardTeam/dnsproxy/upstream.(dnsOverHTTPS).exchangeHTTPS(0xc000030500, 0xc0242a86c0?) Sep 28 12:59:27 potter dnsproxy[91339]: /root/dnsproxy/upstream/upstream_doh.go:144 +0xaa Sep 28 12:59:27 potter dnsproxy[91339]: github.com/AdguardTeam/dnsproxy/upstream.(*dnsOverHTTPS).Exchange(0xc000030500, 0xc0122c9440) Sep 28 12:59:27 potter dnsproxy[91339]: /root/dnsproxy/upstream/upstream_doh.go:106 +0xe5 Sep 28 12:59:27 potter dnsproxy[91339]: github.com/AdguardTeam/dnsproxy/upstream.exchangeAsync({0xa0afa0, 0xc000030500}, 0x10?, 0x0?) Sep 28 12:59:27 potter dnsproxy[91339]: /root/dnsproxy/upstream/parallel.go:117 +0x58 Sep 28 12:59:27 potter dnsproxy[91339]: created by github.com/AdguardTeam/dnsproxy/upstream.ExchangeParallel Sep 28 12:59:27 potter dnsproxy[91339]: /root/dnsproxy/upstream/parallel.go:45 +0x18c

Potterli20 commented 2 years ago

目前我在使用的时候出现的问题

ameshkov commented 2 years ago

谢谢你,我们会想一想,这不是我们的问题,是golang内的bug。不过,我们需要处理这样的,避免崩溃。

@ainar-g what do you think, should we just handle panics in dnsproxy?

Potterli20 commented 2 years ago

谢谢你,我们会想一想,这不是我们的问题,是golang内的bug。不过,我们需要处理这样的,避免崩溃。

@ainar-g what do you think, should we just handle panics in dnsproxy?

因为我这里是使用dns分流加速文件,只要是请求多了,就无法解析域名,运行是正常的,但用jour就出现这样的问题。

ameshkov commented 2 years ago

其实,有可能是和 #279 一样的 bug。来我关闭这里的 Issue,请看看 #279 修理后的情况。如果这个 bug 重复发生,请就重开这个 Issue。

Potterli20 commented 2 years ago

其实,有可能是和 #279 一样的 bug。来我关闭这里的 Issue,请看看 #279 修理后的情况。如果这个 bug 重复发生,请就重开这个 Issue。

这个问题我也有复现过,但给我感觉是两种不一样,但同一个http问题 一个是解密 一个是http2突然回到http1.0不是1.1

ameshkov commented 2 years ago

不是不是,#279 都是 DoH upstream 的问题,不在于 http 版。

Potterli20 commented 2 years ago

不是不是,#279 都是 DoH upstream 的问题,不在于 http 版。

好叭,等你们修复。

ameshkov commented 2 years ago

It still happens even after fixing #279?

Potterli20 commented 2 years ago

It still happens even after fixing #279?

yes

Potterli20 commented 2 years ago

也很容易出现假死状态,正常运行,正常日记,就是无法解析域名

ameshkov commented 2 years ago

哪个 golang 版?

Potterli20 commented 2 years ago

哪个 golang 版?

是1.19.1 即使是quic-go最新版也是

ameshkov commented 2 years ago

试试 go 1.18,我想知道是不是 go 1.19.1 的新bug

Potterli20 commented 2 years ago

试试 go 1.18,我想知道是不是 go 1.19.1 的新bug

好的,我这两天试一下看看

Potterli20 commented 2 years ago

目前用是没有问题,要等一天或者两天才出现的问题

ameshkov commented 2 years ago

没问题,我等

Potterli20 commented 2 years ago

没问题,我等

哦,想起来了,我提这个问题是本地上游dns分流文件的,而搭建的doq和dot的机子使用1.19.1的golang是正常,没有这个日记

Potterli20 commented 2 years ago

Screenshot_2022-10-02-11-57-34-996_com.github.android.jpg Screenshot_2022-10-02-11-57-43-194_com.github.android.jpg

Potterli20 commented 2 years ago

这个和连接数有关 #280 问题是没有了(在go 1.18.6上),但是连接数超多会无法关闭,并会出现假运行

Potterli20 commented 2 years ago

我问题我会重新开 目前已经正常

Potterli20 commented 1 year ago

没问题,我等

你好,quic-go最大限制10000的窗口请求,而dnsproxy不会去关闭窗口,我请求一多就会处理不过来。 https://github.com/lucas-clemente/quic-go/blob/master/internal/protocol/params.go#L15

Potterli20 commented 1 year ago

经过这个的调整,已经没有出现问题 Screenshot_2022-12-04-11-07-28-933_com.github.android.jpgScreenshot_2022-12-04-11-07-36-433_com.github.android.jpg

ameshkov commented 1 year ago

@Potterli20 谢谢你研究这个问题。请试试用 fix-278 branch 看看是不是修理这个问题。

我认为只增加 dohMaxConnsPerHost 是够的。

Potterli20 commented 1 year ago

@Potterli20 谢谢你研究这个问题。请试试用 fix-278 branch 看看是不是修理这个问题。

我认为只增加 dohMaxConnsPerHost 是够的。

是的,修改了dohMaxConnsPerHost好很多,目前我运行了一天没有问题,很少出现问题。还有一个问题是,我修得越大就越好?目前我的dns分流已经在50m大小,有20个上游dns

ameshkov commented 1 year ago

理论上,dohMaxConnsPerHost=1就够了。http2能用一个连接运行很多请求。但是你的问题可能是golang的bug,我们不用增加dohMaxConnsPerHost太多,只需要增加得规避这个bug。

Potterli20 commented 1 year ago

理论上,dohMaxConnsPerHost=1就够了。http2能用一个连接运行很多请求。但是你的问题可能是golang的bug,我们不用增加dohMaxConnsPerHost太多,只需要增加得规避这个bug。

明白明白,我明早试一试,因为我自己修改值为10

Potterli20 commented 1 year ago

理论上,dohMaxConnsPerHost=1就够了。http2能用一个连接运行很多请求。但是你的问题可能是golang的bug,我们不用增加dohMaxConnsPerHost太多,只需要增加得规避这个bug。

是的,已经缓解了很多了