Go开发团队更新执行环境的关注(Trace)组件,不仅大幅降低执行关注的CPU开销,还通过定期分割关注文件控制关注文件大小,进而增加了关注的可扩展性。此外,新的更新还支持持续关注功能,并提供关注读取器API,使得关注数据更容易共享与访问。

Go的runtime/trace组件是一组工具,目的在于协助开发者进一步理解与排除程序故障,其允许开发者关注每个goroutine的活动,并通过go tool trace指令,可视化并探索关注里的数据。开发者能够于程序中加入特定的标注,包括任务、区域和日志,将程序的逻辑流程、性能表现和错误处理,与底层诸如程序的执行时机、资源使用和调用堆栈等执行细节相关联,使开发者更能监控和分析程序,解决性能瓶颈等问题。

虽然Go的执行关注可提供丰富的资讯,但也存在一些长期问题,像是关注成本偏高,会对程序的执行性能造成明显的影响,因此难以用在生产环境中。关注也难以扩展,当关注产生的数据量太大,将导致关注文件难以分析。

另外,启动关注的时机也不够明确,开发者往往不清楚何时启动关注,才能确定捕捉到特定的错误行为,造成关注分析困难。而且因为缺乏解析执行关注的公共组件,因此也只有资深的Go开发者有能力进行程序化分析关注。

开发团队开始着手解决这些问题,在之前的Go版本,关注在许多应用程序会导致10-20% CPU执行开销,这使得关注被限制在特定的使用场景,而不能像CPU分析那样持续使用,开发团队解释,这是因为在启动执行关注时,执行环境会生成许多事件,这些事件大多数附加了堆栈关注,这些堆栈关注对于识别goroutine在执行的任务非常有用,但是成本也很高。

开发团队指出,关注的大部分成本发生在回溯,因此通过优化回溯效率,关注执行环境的CPU开销已经大幅降低至1-2%,如此开发者便可以频繁地使用关注来监控和诊断应用程序,且不会对性能产生太大的影响。

另外,在新版本中,关注分析变得可扩展。过去关注文件的格式和事件的设计讲究有效性,但是需要工具来解析和保留整个关注状态,数百MiB的关注可能需要数GiB的内存来分析,而新的关注功能进行了调整,通过定期分割正在生成的关注文件,使每一个关注文件的大小降低,而由于关注文件变小,分析工具便不需要一次性加载庞大的关注文件到内存中,因此也降低了所需要的内存。

之前的关注事件,是写入各自线程自己的缓存位置,这代表事件的出现并不符合真实顺序,而新的方法会在分割关注文件时重新同步,因此也让事件更容易按真实顺序重组,减少了分析工具的负担。整体来说,新的分割机制让关注数据更容易管理且分析,开发者也能更快地找到感兴趣的事件,让性能分析更有效。

Go关注现在也支持持续关注记录(Flight Recording),可让程序一直保持在关注状态,记录近期发生的事,而这项功能也是因为关注分割技术的导入,才使得持续关注变得可行。而随着开发团队重写关注实例,也提供了一个新的关注读取器API,让开发者更容易访问关注数据。