go 运行时:在Linux的Docker容器中发生SIGSEGV崩溃,可能是net/http崩溃,

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

在Docker容器中运行了两个二进制文件,一个是开源项目(第一次崩溃),另一个是闭源项目(第二次崩溃)。
它们都以 signal SIGSEGV: segmentation violation 崩溃。
第一次崩溃以这些行开始:

0x2000: fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x0]
goroutine 301131 [running]:
runtime.throw({0xff4e03, 0x2})
/usr/local/go/src/runtime/panic.go:1198 +0x71 fp=0xc010903260 sp=0xc010903230 pc=0x4355b1
runtime.sigpanic()
/usr/local/go/src/runtime/signal_unix.go:719 +0x396 fp=0xc0109032b0 sp=0xc010903260 pc=0x44ba36
runtime: unexpected return pc for runtime.hexdumpWords called from 0x40
stack: frame={sp:0xc0109032b0, fp:0xc010903310} stack=[0xc010902000,0xc010904000)

第二次崩溃以这些行开始:

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x194b8 pc=0x436da4]
runtime stack:
runtime: unexpected return pc for runtime.acquireSudog called from 0xc00004be30
stack: frame={sp:0xc0003adf28, fp:0xc0003adf98} stack=[0xc0003ac000,0xc0003ae000)

你使用的Go版本是什么( go version )?

开源项目使用Go版本 1.17.6 运行。
闭源项目使用Go版本 1.14.4 运行。
两者都是 linux/amd64

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

我无法重现,这是一个我以前从未观察到的事件,我们在95个集群中有大约400个示例,每个示例的RPS超过100万。

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

go env 输出

$ go env

GO111MODULE=""

GOARCH="amd64"

GOBIN="/usr/local/bin"

GOCACHE="/root/.cache/go-build"

GOENV="/root/.config/go/env"

GOEXE=""

GOEXPERIMENT=""

GOFLAGS=""

GOHOSTARCH="amd64"

GOHOSTOS="linux"

GOINSECURE=""

GOMODCACHE="/go/pkg/mod"

GONOPROXY="github.example.org"

GONOSUMDB="github.example.org"

GOOS="linux"

GOPATH="/go"

GOPRIVATE="github.example.org"

GOPROXY=" [https://proxy.golang.org,direct](https://proxy.golang.org,direct) "

GOROOT="/usr/local/go"

GOSUMDB="sum.golang.org"

GOTMPDIR=""

GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"

GOVCS=""

GOVERSION="go1.17.6"

GCCGO="gccgo"

AR="ar"

CC="gcc"

CXX="g++"

CGO_ENABLED="1"

GOMOD="/workspace/go.mod"

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-build3473157175=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

我们在一个docker容器中运行了两个进程。一个进程是开源项目,它是一个具有一些额外功能的HTTP反向代理,如调用另一个HTTP端点进行authnz。第二个进程是闭源项目,它是一个HTTP服务器处理程序,用于验证JWT,这是由第一个进程调用的,以验证令牌。
在运行时,这两个进程都崩溃了。
这是一个单独的事件,我在第二次崩溃日志中找到了 https://github.com/golang/go/wiki/LinuxKernelSignalVectorBug ,但是我无法重现Bug测试 https://github.com/golang/go/wiki/LinuxKernelSignalVectorBug#bug-test. 我使用与内核相同的gcc版本进行测试。
Gcc版本:

gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

内核版本:

% uname -a
Linux ip-172-31-22-74 5.4.0-1063-aws #66-Ubuntu SMP Wed Jan 12 17:49:45 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
%  cat /proc/version_signature 
Ubuntu 5.4.0-1063.66-aws 5.4.157

我们不使用交换空间运行所有节点,例如:

% free
              total        used        free      shared  buff/cache   available
Mem:       15803320     1581248    12482748        3600     1739324    13949664
Swap:             0           0           0

第一次崩溃日志
go_1st_crash.log
第二次崩溃日志
go_2nd_crash.log

你期望看到什么?

没有崩溃

你看到了什么?

崩溃

os8fio9y

os8fio9y1#

根据题意,由于$x_{1} > x_{2}$,则有$f(x_{1}) < f(x_{2})$,

反之也成立,故函数$f (x)$在R上为减函数。

s8vozzvw

s8vozzvw2#

这看起来像是内存损坏。你尝试过在race检测器下运行你的程序吗?参见https://blog.golang.org/race-detector

w1jd8yoj

w1jd8yoj3#

完整的代码路径都会被测试,并且每次更改时运行go test -race。我认为它会出现,或者你认为go run -race应该显示它而不是测试?

1bqhqjot

1bqhqjot4#

我尝试使用go run -race运行它,但是当我仅仅使用curl时没有错误。如果我使用vegeta以500 rps的速度运行,我会得到

race: limit on 8128 simultaneously alive goroutines is exceeded, dying
exit status 66

@aclements 也许你想要检查崩溃日志文件,就像你在#42977中所做的那样,谢谢

相关问题