使用Chrome Trace Viewer来观察调度

StarRocks增加了Pipeline功能之后,所有的query被拆解成为pipeline/operators,在固定大小的线程池上面进行调度。因为pipeline driver不在和线程绑定,那么就比较难观察pipeline driver具体执行的情况:什么时候被调度,什么时候开始,什么时候结束等等。

我司同学为了方便观测调度情况,增加了 [[Enhancement] introduce query debug trace for BE by silverbullet233 · Pull Request #7649 · StarRocks/starrocks](https://github.com/StarRocks/starrocks/pull/7649) 这个PR. 有了这个PR之后,就可以看到IOTask以及Pipeline Driver的执行情况,主要实现原理就是跟踪pipeline driver执行情况进行打点,query结束的时候输出成为json. 这个json文件可以被Chrome Trace Viewer读取展示,可以比较直观地看到调度细节。

不过之前同学记录的trace, 是以Pipeline Driver为视角进行的(应用角度),而不是以Thread为视角进行的(资源角度)。所以我在这个PR的基础上进行了扩展 [[Enhancement] extend query trace by dirtysalt · Pull Request #12982 · StarRocks/starrocks](https://github.com/StarRocks/starrocks/pull/12982) 以资源角度来观察,就可以从资源的角度去进行思考和优化。比如下图中,可以看到在IOThread上,有许多chunk source执行之间是存在空隙的,如果这些空隙可以缩短的话,那么整个处理时间也可以缩短。

Pasted-Image-20231225105411.png

我觉得这是一个非常强大的功能,Chrome Trace Viewer也是非常强大的工具。网上可用的资料不是特别多,我整理了一下几个有帮助的链接,尤其是第一个:

我这里尝试整理了一下大致的格式。整个JSON最外层如下 `{"traceEvents":[ events ]}`. 我这里面只使用了两类event:

Normal Event有两类标注方式, 使用 `ph` 字段区分:

Meta Event 主要是为了标记进程/线程名字