From 779119baa8ca6ac79c99c8efccffd53406fbeae7 Mon Sep 17 00:00:00 2001 From: ethfoo Date: Wed, 6 Jul 2022 17:04:47 +0800 Subject: [PATCH] Feat troubleshot gonet (#79) * Feat: add cgoLookupIP problems --- docs/user-guide/troubleshot/problems.md | 83 +++++++++++++++++++++++++ nav.yml | 1 + 2 files changed, 84 insertions(+) create mode 100644 docs/user-guide/troubleshot/problems.md diff --git a/docs/user-guide/troubleshot/problems.md b/docs/user-guide/troubleshot/problems.md new file mode 100644 index 0000000..bf230ca --- /dev/null +++ b/docs/user-guide/troubleshot/problems.md @@ -0,0 +1,83 @@ +# 问题案例 + +## net.cgoLookupIP 导致segmentation violation + +**现象** + +可能在使用了比如unix sock source的时候,Loggie启动后crash,并有如下的日志: + +``` +fatal error: unexpected signal during runtime execution +[signal SIGSEGV: segmentation violation code=0x1 addr=0x47 pc=0x7f59b4528360] + +runtime stack: +runtime.throw({0x213b1a1, 0x7f59b423b640}) + /usr/local/go/src/runtime/panic.go:1198 +0x71 +runtime.sigpanic() + /usr/local/go/src/runtime/signal_unix.go:719 +0x396 + +goroutine 86 [syscall]: +runtime.cgocall(0x1a39d30, 0xc000510d90) + /usr/local/go/src/runtime/cgocall.go:156 +0x5c fp=0xc000510d68 sp=0xc000510d30 pc=0x40565c +net._C2func_getaddrinfo(0xc00030bc40, 0x0, 0xc000724fc0, 0xc0005bd990) + _cgo_gotypes.go:91 +0x56 fp=0xc000510d90 sp=0xc000510d68 pc=0x5c7bb6 +net.cgoLookupIPCNAME.func1({0xc00030bc40, 0xc0004d29c0, 0x4}, 0xc00030bb80, 0xc000510e50) + /usr/local/go/src/net/cgo_unix.go:163 +0x9f fp=0xc000510de8 sp=0xc000510d90 pc=0x5c98ff +net.cgoLookupIPCNAME({0x20f751c, 0x3}, {0xc00030bb80, 0xc00022b5e0}) + /usr/local/go/src/net/cgo_unix.go:163 +0x16d fp=0xc000510f38 sp=0xc000510de8 pc=0x5c914d +net.cgoIPLookup(0x358aed0, {0x20f751c, 0xc00030bbc0}, {0xc00030bb80, 0xc000510fb8}) + /usr/local/go/src/net/cgo_unix.go:220 +0x3b fp=0xc000510fa8 sp=0xc000510f38 pc=0x5c99bb +net.cgoLookupIP·dwrap·25() + /usr/local/go/src/net/cgo_unix.go:230 +0x36 fp=0xc000510fe0 sp=0xc000510fa8 pc=0x5c9e36 +runtime.goexit() + /usr/local/go/src/runtime/asm_amd64.s:1581 +0x1 fp=0xc000510fe8 sp=0xc000510fe0 pc=0x46ae81 +created by net.cgoLookupIP + /usr/local/go/src/net/cgo_unix.go:230 +0x125 +``` + +**原因** + +具体原因请参考:[go net](https://go.dev/src/net/net.go)。 + +``` +Name Resolution + +The method for resolving domain names, whether indirectly with functions like Dial +or directly with functions like LookupHost and LookupAddr, varies by operating system. + +On Unix systems, the resolver has two options for resolving names. +It can use a pure Go resolver that sends DNS requests directly to the servers +listed in /etc/resolv.conf, or it can use a cgo-based resolver that calls C +library routines such as getaddrinfo and getnameinfo. + +By default the pure Go resolver is used, because a blocked DNS request consumes +only a goroutine, while a blocked C call consumes an operating system thread. +When cgo is available, the cgo-based resolver is used instead under a variety of +conditions: on systems that do not let programs make direct DNS requests (OS X), +when the LOCALDOMAIN environment variable is present (even if empty), +when the RES_OPTIONS or HOSTALIASES environment variable is non-empty, +when the ASR_CONFIG environment variable is non-empty (OpenBSD only), +when /etc/resolv.conf or /etc/nsswitch.conf specify the use of features that the +Go resolver does not implement, and when the name being looked up ends in .local +or is an mDNS name. + +The resolver decision can be overridden by setting the netdns value of the +GODEBUG environment variable (see package runtime) to go or cgo, as in: + + export GODEBUG=netdns=go # force pure Go resolver + export GODEBUG=netdns=cgo # force cgo resolver + +The decision can also be forced while building the Go source tree +by setting the netgo or netcgo build tag. + +``` + +**解决办法** + +在Loggie 部署脚本里增加环境变量: + +```yaml + env: + - name: GODEBUG + value: netdns=go +``` \ No newline at end of file diff --git a/nav.yml b/nav.yml index d925bb7..0cc6d58 100644 --- a/nav.yml +++ b/nav.yml @@ -45,6 +45,7 @@ nav: - 运维排障: - 日志采集快速排障指南: user-guide/troubleshot/log-collection.md + - 问题案例: user-guide/troubleshot/problems.md - 组件配置: - Overview: reference/index.md