系统监控本身是一种守护方式来确保有些事情必须要处理。
系统监控的用途
现在很多编程框架都是基于 epoll 来实现异步方式,但是我们有个程序对 epoll 做检查,这种检查要不自己执行,要么写个定时器定期的扫描,然后看看有哪些句柄是返回的。只不过这东西在 Go 的 runtime 是系统监控做这件事。
runtime 三大组件,内存分配器、垃圾回收器、goroutine 调度。实际上除此之外还有系统监控这样一个任务再后台一直在跑,它做些什么事呢?
强制垃圾回收
第一个作用确保垃圾回收肯定被执行,因为垃圾回收器可能会因为某种原因没办法触发,最简单的例子在高峰期的时候分配很多对象,这些对象都是活着,垃圾回收完了以后这些黑色对象是 1GB,按照 Go 语言理论,回收完了以后存活的对象是 1GB,下次回收这预值设置成 2GB,可是低峰期的时候存活的对象可能就是 100MB,很难达到 2GB,就一直触发不了垃圾回收,这就会造成有一大堆对象不被回收,导致内存开销一直居高不下,而垃圾回收器又触发不了。
系统监控程序会定期的检查上次垃圾回收器什么时候执行的,如果发现已经有很长时间没有执行垃圾回收操作了,它就强制执行一次回收。确保当这个预值触发不了的时候总有其他的机制来保障垃圾回收得以正常运行。这是一种保障,也称之为守护。