背景
一客户反映,通过控制台启动hiveserver2一直卡住,但是在机器上查看进程已经启动
排查过程
在客户的机器上,会启动一个agent,用来从server端获取指令并执行,通过查看agent的日志,的确是只有执行的日志,没有返回结果的日志,通过走读golang的代码,很有可能是执行指令的协程中某个chan没有返回卡住了
1. 获取agent的goroutine
wget http://localhost:8666/debug/pprof/goroutine
wget http://localhost:8666/debug/pprof/goroutine?debug=2 -O goroutine2
第一个wget用来通过 go tool pprof
来进行分析,第二个就是文本,可以查看每个routine的堆栈与执行时间。先看下协程的调用链的图
果然有指令执行阻塞了
通过vim查看goroutine2,根据运行时间推算的确是阻塞的指令
通过查看Cmd
的Start
方法,由于在之前给Cmd
的Stdout、Stderr
赋值了,会初始化一个Pipe(管道),一头连agent,一头会去连接子进程
agent会从pr读数据,pw会给到子进程去写数据。
当pipe关闭时,该errch就会返回,现在看是pipe没有关闭
inode为94176617的pipe果然没有关闭,查看客户启动hiveserver2的脚本
查看正常启动hiveserver2的脚本
少了个> /dev/null,客户修改脚本后问题解决