golang 降低GC c触发频率

降低GC 频率

  • main 申请一大块内存 造成 heap 很大的假象
  • 由于虚拟内存的技术的存在只有使用时候才会CPU汇编指令才会交换为物理内存
  • 由于程序存在期间不释放内存,也不使用 gc 判断的时候会被误导,因此不会触发GC
  • 可以使用 debug.SetGCPercent(xxx)/GOGC 调整百分比

调整GC

  • ballast[1]: 压舱石技术 twitch.tv工程师实现
    • 虚拟内存让你GC很难达达阀值
  • GOGC tuner[2]: 通过自动调整GOGC
  • uber工程师提供的一项技术 但是没有开源

系统触发gc

  • 调用 runtime.GC
  • runtime.mallocgc
  • runtime.sysmon 定时调用

runtime.sysmon

  • 检查死锁
  • 强占调度
  • GC
  • 运行 timer

GC 变更

  • go 1.13 固定64个bucket 执行异步任务
  • go 1.14 使用 runtime.sysmon 将 timer放在p上 减少了上下文切换锁竞争
    • 遍历所有的p的timer 知道找到一个timer
    • 如果超过10ms 进行下一轮 poll 网络
    • 如果timer到期直接启动新的M 处理 timer
posted @ 2022-07-11 15:06  vx_guanchaoguo0  阅读(330)  评论(0编辑  收藏  举报