2 个不稳定版本

0.2.0 2019年7月31日
0.1.0 2019年5月28日

#14 in #inspect

MIT 许可证

36KB
517

Timely Diagnostics

用于 timely dataflow 计算的诊断工具。Timely dataflows 是数据并行,可以从笔记本电脑上的单线程执行扩展到计算机集群的分布式执行。每个执行线程被称为 worker

此存储库中的工具具有共同的目标,即为任何规模的 timely dataflows 提供见解,以便理解数据流的结构和资源使用情况。

每个 timely worker 可以通过设置 TIMELY_WORKER_LOG_ADDR 环境变量来指示发布低级事件流到 TCP 套接字。为了处理这些日志流的巨大数量,此存储库中的诊断工具本身也是可扩展的 timely 计算。为了避免混淆,我们将被分析的 dataflow 的 worker 称为 source peers。我们将诊断计算的 worker 称为 inspector peers

此存储库包含一个库 tdiag-connect 和一个用于诊断工具的命令行界面 tdiag

tdiag-connect (在 /connect) 是一个库,用于由 inspector peers 从 source peers 获取事件流。

tdiag (在 /tdiag) 是所有诊断工具的统一命令行界面(目前只提供了一个,更多即将到来)。

开始使用 tdiag

tdiag Crates.io 是所有诊断工具的 CLI。通过 cargo 安装它

cargo install tdiag

所有诊断计算都需要您通过 source-peers 参数指定在源计算中运行的 worker 数量。这是为了知道何时所有源事件流都已连接。

graph - 可视化源数据流

为了更好地理解数据流计算内部发生的事情,可视化数据流的结构非常有价值。开始 graph 诊断

tdiag --source-peers 2 graph --out graph.html

您应该会看到一个通知,告知您 tdiag 正在等待通过 --source-peers(在本例中为两个)指定的连接数量。

在另一个shell中,启动您的源计算。在本例中,我们将分析 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 参数相匹配。

计算开始后,回到诊断shell,您现在应该会看到以下内容

$ 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 文件(在本例中为 graph.html)。在任何现代浏览器中打开该文件,您应该会看到您按回车键时的数据流图的渲染。对于 PageRank 计算,渲染应该类似于以下内容

PageRank Graph

您可以使用鼠标或触摸板来移动图表,并放大和缩小。

profile - 对源数据流进行性能分析

子命令 profile 报告每个作用域/操作符的总体运行时间。

tdiag --source-peers 2 profile

您应该会看到一个通知,告知您 tdiag 正在等待通过 --source-peers(在本例中为两个)指定的连接数量。

在另一个shell中,启动您的源计算。在本例中,我们将分析 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 参数相匹配。

计算开始后,回到诊断shell,您现在应该会看到以下内容

$ 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(在本例中为两个)指定的连接数量。

在另一个shell中,启动您的源计算。在本例中,我们将分析 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_ADDRDIFFERENTIAL_LOG_ADDR,以便源工作者连接到我们的诊断计算。参数 -w 指定了我们想要用多少工作者运行 PageRank 示例。因此,我们在这里指定的内容必须与启动 tdiag 时使用的 --source-peers 参数相匹配。

计算开始后,回到诊断shell,您现在应该会看到以下内容

$ 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

Crates.io Docs

tdiag-connect (在 /connect) 是一个库,用于由 inspector peers 从 source peers 获取事件流。

文档在docs.rs/tdiag-connect


lib.rs:

用于检查及时数据流计算的工具。

依赖关系

~6.5MB
~53K SLoC