运行时:分析Go 1.13运行时/mgcsweep.go致命错误("错误:未使用的跨度在未清扫列表中")

dw1jzc5e  于 5个月前  发布在  Go
关注(0)|答案(6)|浏览(52)

你正在使用哪个版本的Go( go version )?

$ go version
go version go1.13.3 linux/amd64

这个问题在最新版本中是否重现?

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB="no"
GOOS="linux"
GOPATH="/root/go"
GOPRIVATE=""
GOPROXY="https://goproxy.cn,direct"
GOROOT="/usr/lib/golang"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build603283197=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

我们在生产环境中运行Docker容器,Docker Engine报告了一个错误,主进程在没有执行任何操作的情况下退出。错误信息如下:

从错误信息来看,这可能与运行时的内存清理操作有关。我们查看了相关的代码如下:

发生错误后,整个dockerd服务崩溃并转储了核心。我们根据错误日志做出了一些猜测,但我们还没有得出结论。
总结复现条件:

When the span is taken out of heap.sweepSpan, its status is mSpanFree.
The sweepgen of the span equals heap.sweepgen - 1, indicating that the span is being swept.

我们对此有一些猜测:

It is possible that when sweepone is executed concurrently, different threads take the same span from heap.sweepSpan.
It is possible that a span failed to be swept and was later inserted back into heap.sweepSpan with an incorrect state.
It is possible that the span returned by alloc_m was modified by another thread after being added to heap.sweepgen.

然而,当我们回顾代码时,所有这些猜测都被排除了,因为我们无法复现这个bug,所以到目前为止还没有取得进展。如果有人能帮助我们分析这个问题,我们将非常感激。如果需要更多信息,我们随时可以提供。

你期望看到什么?

Dockerd中没有GC panic错误。

你看到了什么?

如上所述,Dockerd中出现了GC panic错误。如果可能的话,请帮助我们分析这个问题。使用的Go版本相当旧。如果这个问题在更高版本中得到解决,我们想知道是如何解决的,以及是否可以提供任何相关的代码或补丁。

bvk5enib

bvk5enib2#

非常感谢您的回复。这两个问题看起来相似,但它们并不相同。在这个问题中,sweepgen的状态是span.sweepgen=heap.sweepgen-1,而您提到的bug不是这样。它的解决方案是修改判断条件,让span.sweepgen=heap.sweepgen+3被视为正常现象。然而,在我报告的bug中,sweepgen仍然是异常的。

8wigbo56

8wigbo563#

这个像 28003 吗?

@sten4eg 谢谢你的回复。我是 suoxc 的朋友。我们遇到了上面描述的问题
从日志中,我猜想 28003 不是同一个问题,因为:
runtime: bad span s.state=3 s.sweepgen=1115595 sweepgen=1115596
mspan.sweepgen == mheap.sweepgen - 1
但是 28003 是:
runtime: bad span s.state=3 s.sweepgen=7 sweepgen=4
mspan.sweepgen == mheap.sweepgen + 3
顺便说一下:
dockerd: 18.09
golang: 1.13.3

p5cysglq

p5cysglq4#

你好,@SuoXC ,根据Go的发布策略,我们为当前版本和两个之前的版本提供积极支持。你正在使用Go 1.13版本,这个版本已经超出了支持窗口几年。

你是否尝试过使用更新的Go版本,看看是否能解决你的问题?谢谢。

2skhul33

2skhul335#

你好,@SuoXC。根据Go的发布政策,我们为当前版本和两个之前的版本提供积极的支持。你正在使用的是Go 1.13版本,这个版本已经超出了支持窗口几年。

你是否尝试过使用更新的Go版本,看看是否能解决你的问题?谢谢。

我们理解,根据Go当前的维护政策,无法为旧版本提供支持。因此,我们尝试使用更高版本的Go编译Docker版本,看看是否能解决问题。然而,由于这个bug很少发生,直到现在我们才再次重现它。在这里提出这个问题的主要目的是确认社区是否有处理类似bug的经验。我们将继续尝试追踪并找出此问题的根本原因,看看它是否已在新版本中得到解决。如果没有,我们也可以通过分享我们的发现来回馈给Golang社区。

qlzsbp2j

qlzsbp2j6#

好的,SGTM,谢谢。我将把这个问题标记为"文档",以表明这是关于理解"Go 1.13出了什么问题"的问题,而不是关于当前版本Go的问题/问题。

相关问题