背景
一客戶反映屿聋,通過控制臺啟動hiveserver2一直卡住凛篙,但是在機器上查看進程已經(jīng)啟動
排查過程
在客戶的機器上完域,會啟動一個agent,用來從server端獲取指令并執(zhí)行旭贬,通過查看agent的日志怔接,的確是只有執(zhí)行的日志,沒有返回結果的日志稀轨,通過走讀golang的代碼扼脐,很有可能是執(zhí)行指令的協(xié)程中某個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的堆棧與執(zhí)行時間瓦侮。先看下協(xié)程的調(diào)用鏈的圖
image.png
果然有指令執(zhí)行阻塞了
企業(yè)微信截圖_de75c6d8-af3c-4e50-bdee-44689b497841.png
通過vim查看goroutine2,根據(jù)運行時間推算的確是阻塞的指令
企業(yè)微信截圖_eeca773b-57e7-451b-adc7-9a7adc954ae8.png
通過查看Cmd
的Start
方法佣谐,由于在之前給Cmd
的Stdout肚吏、Stderr
賦值了,會初始化一個Pipe(管道)狭魂,一頭連agent罚攀,一頭會去連接子進程
企業(yè)微信截圖_87c9900c-6992-4f45-b0d8-8a84bd044775.png
agent會從pr讀數(shù)據(jù),pw會給到子進程去寫數(shù)據(jù)雌澄。
企業(yè)微信截圖_bdb37179-6024-4014-8d82-027e50c1814d.png
當pipe關閉時坞生,該errch就會返回,現(xiàn)在看是pipe沒有關閉
企業(yè)微信截圖_68a017e9-8df4-418f-98f0-0d773ed5eafa.png
inode為94176617的pipe果然沒有關閉掷伙,查看客戶啟動hiveserver2的腳本
企業(yè)微信截圖_f767523d-e822-44d6-a89d-34826a19a43c.png
查看正常啟動hiveserver2的腳本
企業(yè)微信截圖_6a7fc099-4840-47e3-8842-52323de17fb7.png
少了個> /dev/null,客戶修改腳本后問題解決