Gitlab 在運作過程中發現其 RPC 處理程序 Gitaly 的 latency 日漸增加, CPU 的使用率也顯著提高, 原以為是 resource leaking 問題 (這也是許多工程師第一時間也都會這樣認為, 這也是想分享這篇的一個點), 然而透過 pprof 與 cAdivisor(cgroup 分析工具) 分析發現並沒有 leak 的現象, 最後追蹤到了 SIGABRT thread dump 中發現問題在於 syscall.ForkLock 而該 問題指向了 clone() 的方式, 而這問題在於 Go 1.8 中使用的 fork 方式會複製 parent process memory space, 因此當系統逐漸增大後 fork cost 就會變高, 而在 Go 1.9 後便改採用 posix_spawn 來避免此問題
問題的排除, 除了過程引人入勝外, 其面對問題的思考與處理過程也是能作為借鏡
沒有留言:
張貼留言