sysmon

寒江蓑笠翁大约 1 分钟

sysmon

sysmon是一个普通的函数,直译为系统监控,去掉注释部分也就200来行代码。它会在程序引导阶段时被分配一个单独的线程来启动,之后会在后台不断地监控Go程序运行时的状态,并作出相应的处理。关于它启动这部分的代码可以在runtime.main函数中查看到:

func main() {
    ...
	mp := getg().m
	mainStarted = true
	systemstack(func() {
        newm(sysmon, nil, -1)
    })
    ...
}

系统监控本身只是一个for循环,每一轮循环的间隔时间为20微秒,随着程序空闲指数的上升,间隔时间最多会提升至10毫秒。在每一轮循环中,它主要做了下面几件事情:

  • 辅助协程调度,抢占长时间运行的协程
  • 检查内存情况,并判断是否需要进行垃圾回收