mirror of https://github.com/loggie-io/docs.git
parent
dce4a7f98a
commit
779119baa8
|
@ -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
|
||||
```
|
Loading…
Reference in New Issue