一. 前言
在Presto的UI中,可以看到每一个查询的每一个算子的各种汇总的统计信息,比如输入输出数据量,端到端时间,阻塞时间等,如下所示:
本文主要介绍在Presto中,Blocked Time的含义以及在Presto中Block Time是怎么实现的。
二. Blocked Time
-
Blocked Time顾名思义为算子计算过程中的阻塞时间,此时间是从Operator的isBlocked接口返回的ListenableFuture开始计算,直到ListenableFuture done的时间差值。
-
Blocked Time的时间是系统时间,也就是System.nanoTime的人为感知的时间。
-
Presto UI上汇总的Blocked Time是该pipeline中所有该Operator的时间总值。比如假如有10个TableScan Operator,那Blocked Time为10个TableScan Operator的阻塞时间的总和,因此该时间可能会比整个查询端到端的时间还会大。
三. Presto 中Blocked Time的计算
- 算子如果处于阻塞状态,Operator的isBlocked接口返回后台进程的ListenableFuture句柄,如下为其中一个Operator的样例:
2. Driver的Operator管理进程如果发现Operator处于阻塞状态,将启动一个BlockedMonitor后台 进程,BlockedMonitor会记录此Operator阻塞的开始时间。
3. Driver的Operator管理进程将BlockedMonitor注册到1中的ListenableFuture,等到1中的ListenableFuture完成后(也即阻塞解除),调用2中的run方法,记录Blocked的结束时间与开始时间的时间差,求取时间差,也即2图示中的blockedWallNanos变量,此变量就是operator的阻塞时间。