2 个不稳定版本
0.2.0 | 2019 年 7 月 31 日 |
---|---|
0.1.0 | 2019 年 5 月 28 日 |
#13 在 #timely-dataflow
用于 tdiag
10KB
137 行
Timely Diagnostics
Timely Dataflow 计算的诊断工具。Timely Dataflow 是数据并行且可从笔记本电脑上的单线程执行扩展到计算机集群的分布式执行。每个执行线程称为 worker。
此存储库中的工具具有共同的目标,即为任何规模的 timely dataflow 提供见解,以了解数据流的结构和资源使用情况。
可以通过设置 TIMELY_WORKER_LOG_ADDR
环境变量来指示每个 timely worker 通过 TCP 套接字发布低级事件流。为了处理这些日志流的巨大数量,此存储库中的诊断工具本身也是可以扩展的 timely 计算。为了避免混淆,我们将被分析的 dataflow 的 worker 称为 source peers
。我们将诊断计算的 worker 称为 inspector peers
。
此存储库包含一个库,tdiag-connect
,以及用于诊断工具的命令行界面,tdiag
。
tdiag-connect
(在 /connect
) 是一个库,用于由 inspector peers 从 source peers 获取事件流。
tdiag
(在 /tdiag) 是所有诊断工具的统一命令行界面(目前只有一个可用,更多即将到来)。
开始使用 tdiag
tdiag
是所有诊断工具的 CLI。通过 cargo 安装它
cargo install tdiag
所有诊断计算都需要您通过 source-peers
参数指定在源计算中运行的 worker 数量。这是为了知道所有源事件流何时连接。
graph
- 可视化源数据流
为了更好地了解数据流计算内部发生的情况,可视化数据流的结构可能非常有价值。启动 graph
诊断
tdiag --source-peers 2 graph --out graph.html
您应该会看到一个通知,告知您 tdiag
正在等待通过 --source-peers
指定的连接数量(在这个例子中是两个)。
在另一个壳中,启动您的源计算。在这种情况下,我们将分析Timely PageRank 示例。从timely-dataflow/timely
子目录中,运行
env TIMELY_WORKER_LOG_ADDR="127.0.0.1:51317" cargo run --example pagerank 1000 1000000 -w 2
最重要的是,env TIMELY_WORKER_LOG_ADDR="127.0.0.1:51317"
将使源工作者连接到我们的诊断计算。参数-w
指定了我们想用多少个工作者运行 PageRank 示例。因此,我们在这里指定的内容必须与启动tdiag
时使用的--source-peers
参数相匹配。
一旦计算开始运行,返回诊断壳,您现在应该看到以下内容
$ tdiag --source-peers 2 graph --out graph.html
Listening for 2 connections on 127.0.0.1:51317
Trace sources connected
Press enter to generate graph (this will crash the source computation if it hasn't terminated).
在任何时候,按指令输入。这将生成一个完全自包含的 HTML 文件,路径由--out
指定(此示例中的graph.html
)。在任何现代浏览器中打开该文件,您应该会看到在您按回车键时的数据流图的渲染。对于 PageRank 计算,渲染应类似于以下内容
您可以使用鼠标或触摸板移动图形,以及放大和缩小。
profile
- 源数据流分析
子命令profile
报告每个作用域/运算符的聚合运行时间。
tdiag --source-peers 2 profile
您应该会看到一个通知,告知您tdiag
正在等待通过--source-peers
指定的连接(在此例中为两个)。
在另一个壳中,启动您的源计算。在这种情况下,我们将分析Timely PageRank 示例。从timely-dataflow/timely
子目录中,运行
env TIMELY_WORKER_LOG_ADDR="127.0.0.1:51317" cargo run --example pagerank 1000 1000000 -w 2
最重要的是,env TIMELY_WORKER_LOG_ADDR="127.0.0.1:51317"
将使源工作者连接到我们的诊断计算。参数-w
指定了我们想用多少个工作者运行 PageRank 示例。因此,我们在这里指定的内容必须与启动tdiag
时使用的--source-peers
参数相匹配。
一旦计算开始运行,返回诊断壳,您现在应该看到以下内容
$ tdiag --source-peers 2 profile
Listening for 2 connections on 127.0.0.1:51317
Trace sources connected
Press enter to stop collecting profile data (this will crash the source computation if it hasn't terminated).
在任何时候,按指令输入。这将生成每个作用域/运算符的运行时间汇总。请注意,作用域的汇总(用[scope]
表示)包括所有包含运算符的时间。
[scope] Dataflow (id=0, addr=[0]): 1.17870668e-1 s
PageRank (id=3, addr=[0, 3]): 1.17197194e-1 s
Feedback (id=2, addr=[0, 2]): 3.56249e-4 s
Probe (id=6, addr=[0, 4]): 7.86e-6 s
Input (id=1, addr=[0, 1]): 3.408e-6 s
诊断微分数据流
子命令differential
将仅与使用微分数据流的及时数据流相关的诊断工具分组。要启用自己的计算中的微分日志记录,请将以下片段添加到您的代码中
if let Ok(addr) = ::std::env::var("DIFFERENTIAL_LOG_ADDR") {
if let Ok(stream) = ::std::net::TcpStream::connect(&addr) {
differential_dataflow::logging::enable(worker, stream);
info!("enabled DIFFERENTIAL logging to {}", addr);
} else {
panic!("Could not connect to differential log address: {:?}", addr);
}
}
将此片段包含在可执行文件中后,您可以使用以下任何工具来分析计算中与微分相关的特定方面。
differential arrangements
- 跟踪微分排列的大小
具有状态性的微分数据流运算符通常会维护称为arrangements
的索引输入跟踪。您将想要了解这些跟踪如何在您的计算执行过程中增长(通过累积新的输入)和缩小(通过压缩)大小。
tdiag --source-peers differential arrangements
您应该会看到一个通知,告知您tdiag
正在等待通过--source-peers
指定的连接(在此例中为两个)。
在另一个壳中,启动您的源计算。在这种情况下,我们将分析Differential BFS 示例。从微分数据流存储库内部,运行
export TIMELY_WORKER_LOG_ADDR="127.0.0.1:51317"
export DIFFERENTIAL_LOG_ADDR="127.0.0.1:51318"
cargo run --example bfs 1000 10000 100 20 false -w 2
在分析微分数据流(与纯及时计算相比)时,必须设置TIMELY_WORKER_LOG_ADDR
和DIFFERENTIAL_LOG_ADDR
,以便源工作者连接到我们的诊断计算。参数-w
指定了我们想用多少个工作者运行 PageRank 示例。因此,我们在这里指定的内容必须与启动tdiag
时使用的--source-peers
参数相匹配。
一旦计算开始运行,返回诊断壳,您现在应该看到以下内容
$ tdiag --source-peers 2 differential arrangements
Listening for 2 Timely connections on 127.0.0.1:51317
Listening for 2 Differential connections on 127.0.0.1:51319
Will report every 1000ms
Trace sources connected
ms Worker Op. Id Name # of tuples
1000 0 18 Arrange ([0, 4, 6]) 654
1000 0 20 Arrange ([0, 4, 7]) 5944
1000 0 28 Arrange ([0, 4, 10]) 3790
1000 0 30 Reduce ([0, 4, 11]) 654
1000 1 18 Arrange ([0, 4, 6]) 679
1000 1 20 Arrange ([0, 4, 7]) 6006
1000 1 28 Arrange ([0, 4, 10]) 3913
1000 1 30 Reduce ([0, 4, 11]) 678
2000 0 18 Arrange ([0, 4, 6]) 654
2000 0 18 Arrange ([0, 4, 6]) 950
2000 0 20 Arrange ([0, 4, 7]) 5944
2000 0 20 Arrange ([0, 4, 7]) 6937
2000 0 28 Arrange ([0, 4, 10]) 3790
输出中的每一行指定了测量时间、工人和操作员ID、安排的名称以及它维护的元组数量。默认情况下,每秒将报告更新的尺寸,这可以通过output-interval
参数来控制。
tdiag-connect
库
tdiag-connect
(在 /connect
) 是一个库,用于由 inspector peers 从 source peers 获取事件流。
lib.rs
:
从timely / differential获取适合诊断的跟踪的辅助工具。
依赖关系
约3.5MB
约65K SLoC