跳至主要內容

文章

精選

Linux 明明只給 2 CPU,為什麼 Go 還開 5 個 P?深入 Go Runtime 與 cgroup 的階層限制

Go Runtime × Linux cgroup v2 × GOMAXPROCS Go 1.25 開始加入 container-aware GOMAXPROCS :在 Linux 上,Runtime 不再只看機器有多少 logical CPUs,也會把 cgroup 的 CPU bandwidth limit 納入預設 parallelism 的計算。直覺上,如果 Linux 將一個程式限制在約 2 CPU 的 throughput,Go 應該也會把預設 GOMAXPROCS 壓到 2。 但我在追查 cgroup 行為時遇到一個反直覺的情況: Linux kernel 確實只讓整棵 subtree 得到約 2 CPU 的平均 throughput,Go 1.25、1.26、1.27 卻都可以在同一棵 hierarchy 的 child 裡得到 GOMAXPROCS=5 。 kernel view: effective CPU throughput ≈ 2 CPUs Go runtime view: runtime.NumCPU() = 5 GOMAXPROCS = 5 問題不在於 Linux 沒有限制成功,也不是 GODEBUG 沒有打開。真正的差異在更底層: Linux 的 CPU bandwidth enforcement 是 hierarchical 的,而目前 Go Runtime 的 cgroup CPU-limit observation 只追蹤 process 所在的 leaf cgroup。 本文核心: 這不是要證明「Go 的 container support 整體是錯的」。Go 1.25 的 container-aware GOMAXPROCS 解決了很實際的 production 問題;本文處理的是它目前一個已知的 observation boundary: visible ancestor 有更嚴格 quota,而 leaf 本身沒有 local limit 時,Kernel 與 Runtime 可能對「有效 CPU throughput」得到不同的答案。 本文會一路追到下面幾層: CPU quota 與 GOMAXPROCS 為什麼不是同一件事 cpu.m...

最新文章

電信業的 GitOps 革命:Silva、Netbox Operator、Porch 三招顛覆網路管理!

雲原生與開源生態如何促進電信產業 AI-Native 和永續發展?

Nephio 與 AI Cloud O-RAN 自動化的關鍵技術解析 (Nephio and AI: Key Technologies for Cloud O-RAN Automation)

B5G 未來的關鍵,在於「智慧」而非「速度」!

Nephio 驅動 5G 專網的智慧化 orchestration:從多廠商整合到雲原生自動化的未來展望

電信產業如何透過 Nephio 來處理複雜的 Network Function(Workload)?

全光網路 IOWN GF 架構是什麼?

從邊緣端到雲端的 Orchestration (編排/協調) 挑戰

Google Distributed Cloud 升級:AI 應用、數據處理與數位主權的全方位解決方案

應變網路行動車簡介 #運作原理說明 #數位發展部