本文介绍了一个排查go程序重启故障的过程。
1. 错误日志

程序启动时会打印进程号,同时有系统signal信号捕捉程序,会将程序退出的所有能捕捉的信号都捕捉并打印,然后退出。
1.1不能被捕捉的信号
SIGKILL 9 Term 无条件结束程序(不能被捕获、阻塞或忽略)
SIGSTOP 17,19,23 Stop 停止进程(不能被捕获、阻塞或忽略)
kill -9 pid2. 排查方式
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