知识卡片
标记目标25%
内容
(书中 Go 1.14)后台标记协程目标占用约 25% CPU;P 数较小或不能整除(如 P≤3)时改用按时间比例调度,让每个 P 只花部分时间执行标记,避免偏离 25% 太多。GC 因此不是”空闲时顺便做”,而是主动预留计算预算换取低暂停;25% 目标值和调度公式是该版本实现细节。
参考来源
- 位置:《Go语言底层原理剖析》第20章《深入垃圾回收全流程》20.2.1节《计算标记协程的数量》
- 结论依据:原文明确"目前,Go语言规定后台标记协程消耗的CPU应该接近25%",并说明"一种简单的想法是根据当前逻辑处理器P的数量来计算,开启的协程数量应该为0.25P。为什么startCycle函数的计算过程如此复杂呢?这是因为需要处理当协程数量过小(例如P≤3)、不为整数(0.25P)的情况",用 fractionalUtilizationGoal 按时间比例补偿,因此可以推出"标记阶段主动预留约25% CPU、P较小时按时间比例调度"的结论。
- 原始内容:在标记准备阶段,会计算当前后台需要开启多少标记协程。目前,Go语言规定后台标记协程消耗的CPU应该接近25%,其核心代码位于startCycle函数中。一种简单的想法是根据当前逻辑处理器P的数量来计算,开启的协程数量应该为0.25P。为什么startCycle函数的计算过程如此复杂呢?这是因为需要处理当协程数量过小(例如P≤3)、不为整数(0.25P)的情况。