本文介绍了一个排查go程序重启故障的过程。

1. 错误日志

程序启动时会打印进程号,同时有系统signal信号捕捉程序,会将程序退出的所有能捕捉的信号都捕捉并打印,然后退出。

1.1不能被捕捉的信号

SIGKILL 9 Term 无条件结束程序(不能被捕获、阻塞或忽略)
SIGSTOP 17,19,23 Stop 停止进程(不能被捕获、阻塞或忽略)

kill -9 pid

2. 排查方式

1.1 查看日志

日志中加入了捕捉信号量的程序,会将程序退出的所有能捕捉的信号都捕捉并打印,然后退出

通过错误日志可以看到,捕捉不到,所以基本上可以推测,应该是信号SIGKILL或SIGSTOP的问题。

1.2 strace监控当前进程

strace -T -tt -e trace=all -p pid

但这只能确认这是SIGKILL的问题,具体什么原因,还是无法得知。

1.3 Taming the OOM killer

dmesg -T | grep -E -i -B100 pid

果然,真的是Out Of Memory 错误。

1.4 go tool pprof

AdminPort = 8098
curl http://localhost:8098/prof?command=get%20memprof
go tool pprof bdms mem-43964.memprof