2018年7月19日 星期四

一個 Go 1.9 的修正如何對 Gitaly 服務加速了 30x

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 來避免此問題
問題的排除, 除了過程引人入勝外, 其面對問題的思考與處理過程也是能作為借鏡

沒有留言:

在 ARM 平台上使用 Function Multi-Versioning (FMV) - 以使用 Android NDK 為例

Function Multi-Versioning (FMV) 過往的 CPU 發展歷程中, x86 平台由於因應各種應用需求的提出, 而陸陸續續加入了不同的指令集, 此外也可能因為針對市場做等級區隔, 支援的數量與種類也不等. 在 Linux 平台上這些 CPU 資訊可以透過...