下载本文 PDF 版本 PDF

分布式系统调试

ShiViz 是一种新型分布式系统调试可视化工具。


Ivan Beschastnikh
Patty Wang
Yuriy Brun
Michael D. Ernst

分布式系统为软件开发者带来了独特的挑战。理解系统节点的并发活动,甚至理解系统的通信拓扑结构都可能非常困难。一种洞察系统活动的标准方法是分析系统日志。不幸的是,这可能是一个繁琐而复杂的过程。本文着眼于区分分布式系统与其他类型软件的几个关键特性和调试挑战。本文介绍了几种有前景的工具和正在进行的研究,以帮助解决这些挑战。

分布式系统特性与挑战

分布式系统与单机程序的不同之处在于,它们在为系统提供特殊功能方面具有积极作用,同时在软件开发和运维方面也带来了挑战。

异构性

分布式系统的节点可能包括手机、笔记本电脑、服务器级机器等等。节点资源和网络连接方面的这种硬件和软件多样性可以使分布式系统更健壮,但这种异构性迫使开发人员在开发和调试期间管理兼容性。

并发性

多个节点的同时运行导致了并发性,这可以使分布式系统优于集中式系统。然而,并发性可能会引入竞争条件和死锁,这些问题众所周知地难以诊断和调试。此外,网络引入了数据包延迟和丢失,加剧了理解和调试并发性的问题。

分布式状态

将系统状态分布在多个节点上可以消除单点故障并提高可扩展性,但分布式状态需要复杂的节点协调以同步跨节点的状态——例如,节点必须确保其本地状态一致。潜在的不一致性通过分布式算法来预防,例如那些保证特定数据一致性和缓存一致性风格的算法。开发人员可能会发现,当系统状态分布在许多节点上时,重建系统的全局状态非常困难甚至不可能。这使得错误诊断和验证变得复杂。

部分故障

状态和责任的分布使分布式系统能够变得健壮,并在各种故障中幸存下来。例如,谷歌的 Spanner 系统可以在整个数据中心发生故障时幸存下来。2 然而,实现这种容错能力需要开发人员理解复杂的故障模式。对于大多数分布式系统来说,容错不能是事后才考虑的事情;系统必须被设计为能够处理故障。这种故障弹性设计复杂且难以测试。

现有方法

以下概述了七种旨在帮助软件工程师验证和调试分布式系统的方法。

测试

测试套件执行一组特定的执行,以确保它们的行为正确。大多数分布式系统的测试都是使用手动编写的测试完成的,这些测试通常是为了响应故障而引入,然后被最小化。13 测试是检测错误的有效方法。然而,由于测试只执行有限数量的执行,它永远不能保证揭示所有错误。

模型检查

模型检查是穷尽测试,通常达到某个界限(执行中的消息或步骤数)。符号模型检查在数学上表示和探索可能的执行;显式状态模型检查更实用,因为它实际运行程序,控制其执行而不是试图抽象它。MoDist 执行黑盒模型检查,置换消息序列并更改进程相对于系统中其他进程的执行速度。17 MaceMC 是一种白盒技术,它通过添加对模型检查的编程语言支持来实现加速。6 所有模型检查工具的常见问题是可扩展性和环境建模,因此它们很少能实现保证。

定理证明

原则上,定理证明可以证明分布式系统没有缺陷。亚马逊使用 TLA+ 来验证其分布式系统。10 最近的两个系统可以构建经过验证的分布式系统实现。Verdi 使用 Coq 工具,由于 Curry-Howard 同构,其富有表现力的类型系统使类型检查等同于定理证明;然后,Coq 规范被编译成分布式系统的 OCaml 实现。15 相比之下,IronFleet 使用 TLA 和 Hoare 逻辑验证来类似地生成分布式系统的经过验证的实现。5 使用这些工具所需的巨大努力使得它们最适合小型关键核心的新实现。现有分布式系统需要其他技术。

记录与回放

记录与回放捕获系统的单次执行,以便稍后可以重放或分析此执行。这在调试非确定性行为时尤其有用。诸如 Friday4 或 D3S7 之类的记录与回放工具捕获所有非确定性事件,以便可以精确地重现执行。然而,记录复杂的执行可能非常昂贵,并且可能会改变底层系统的行为。

追踪

追踪跟踪数据在系统中的流动,甚至跨应用程序和协议,例如数据库、Web 服务器、域名服务器、负载均衡器或虚拟专用网络协议。12 例如,pivot tracing 动态检测基于 Java 的系统,以收集系统中不同点的用户定义指标,并整理结果数据,以提供跨多个执行的指标的组件间视图。8 Dapper 是 Google 使用的较低级别的追踪系统,用于追踪基础设施服务。14 追踪比记录和回放更有效,因为它专注于数据的特定子集,但它需要检测应用程序和协议以正确转发追踪元数据,而无需消耗它。

日志分析

日志分析是一种更轻量级的方法,适用于无法修改的系统。这是一种常见的黑盒方法,其中使用系统的控制台日志、调试日志和其他日志源来理解系统。例如,Xu 等人将机器学习应用于日志,以检测 Google 基础设施服务中的异常。16 来自真实系统的详细日志包含大量有价值的细节,但它们往往非常庞大,以至于程序员无法承受,因此无法直接从中受益。

可视化

分布式系统的复杂性激发了对这些系统进行可视化的工作,以使其对开发人员更加透明。例如,Theia 显示了一个视觉签名,总结了 Hadoop 执行的各个方面,例如执行的资源利用率。3 这些签名可用于发现异常并比较执行。Theia 等工具提供了系统行为的高级摘要。然而,它们并不能帮助开发人员理解系统中底层的通信模式,包括消息的分布式排序。

可视化分布式系统执行

如上所述,可视化分布式系统执行的能力可以帮助开发人员理解和调试他们的分布式系统。ShiViz 就是这样一种可视化工具,它将分布式系统执行显示为交互式时空图,明确地捕获系统中消息和事件的分布式排序。此图再现了执行日志中捕获的事件和交互,通过简洁的可视化使排序信息显式化。开发人员可以展开、折叠和隐藏图表的部分,以及搜索特定的交互模式。ShiViz 可以作为浏览器应用程序免费使用;任何开发人员都可以可视化日志,而无需安装软件或通过网络发送日志。

为了提供分布式系统执行的丰富而准确的可视化,ShiViz 显示了先发生关系。给定节点 n 上的事件 e,先发生关系指示所有在逻辑上先于 e 的事件。根据挂钟时间,其他事件可能已经在其他节点上发生,但节点 n 无法判断这些其他事件是在 e 之前还是之后发生,并且它们不影响 e 的行为。这种偏序可以排除哪些事件不会导致其他事件,识别并发事件,并帮助开发人员在脑海中重放部分执行。

Debugging Distributed Systems: FIGURE 1: Time-space diagram of an execution with three nodes

图 1 说明了一个包含一个事务管理器和两个副本的两阶段提交协议的执行。1 这个时空图是对底层先发生偏序的可视化,显示了一个包含三个节点的执行。带箭头的线条表示事件的偏序,每个事件都有一个关联的向量时间戳(在方括号中)。(参见下面的时间戳侧边栏。)

Debugging Distributed Systems: FIGURE 2: A ShiViz screenshot

图 2 显示了 ShiViz 可视化名为 Voldemort 的分布式数据存储系统执行的屏幕截图。11 屏幕中间是时空图,时间从上到下流动。顶部的彩色框代表节点,它们下面的垂直线是节点时间线。每个节点时间线上的圆圈代表该节点执行的事件。边连接事件,表示记录的先发生关系:图中位置较高的事件发生在图中位置较低的事件之前,并通过向下路径连接到该事件。ShiViz 使用操作增强了时空图,以帮助开发人员探索分布式系统执行和相应的日志。图 2 详细说明了其中一些操作。

分布式时间戳

典型的分布式系统日志不包含足够的信息来重新生成先发生关系,这也是分布式系统日志难以解释的原因之一。ShiViz 依赖于由另一个工具 ShiVector 增强的日志,以包含向量时钟时间戳,这些时间戳捕获事件之间的先发生关系。9 每个节点 α 维护一个逻辑时钟向量,分布式系统中的每个节点(包括自身)都有一个时钟。α 的第 i 个时钟是节点 i 当前逻辑时间的下界。节点 α 每次执行本地操作或发送或接收消息时,都会递增其向量时钟的第 α 个分量。每条消息都包含发送节点的当前向量时钟;收到消息后,接收节点将其向量时钟更新为其本地和接收到的时间戳的逐元素最大值。

ShiVector 是一种轻量级检测工具,它使用编码为向量时钟的偏序信息来增强分布式系统已记录的信息。ShiVector 介入系统中每个节点的通信和日志记录通道,以将向量时钟时间戳添加到每个记录的事件。

ShiViz 解析 ShiVector 增强的日志,以确定每个事件的:(1) 执行事件的节点;(2) 事件的向量时间戳;以及(3) 事件的描述。ShiViz 允许用户使用正则表达式自定义日志的解析,正则表达式可用于将其他信息或字段与每个事件关联。

 

理解分布式系统执行

ShiViz 帮助开发人员:(1)理解事件的相对顺序以及事件之间可能的因果关系链,这对于调试并发行为非常重要;(2)查询主机之间特定事件和交互模式;以及(3)识别成对和成组执行之间的结构相似性和差异性。时空图表示通过可视化事件排序和通信来支持第一个目标。下一节描述了支持第二个目标的两种搜索操作,以及对应于第三个目标的跨多个执行的操作。

 

关键字搜索和结构化搜索操作

ShiViz 实现了两种搜索操作:关键字搜索和结构化搜索。开发人员可以通过顶部搜索栏访问这两种类型(参见图 2)。

关键字搜索允许开发人员突出显示图中所有包含与查询匹配的字段的事件。例如,搜索 send 将突出显示图中所有字段值是 send 的事件。可以使用字段标识符和正则表达式进一步约束结果。例如,查询 node=alice && priority=CRITICAL* 将仅突出显示 alice 节点上优先级字段与正则表达式 CRITICAL* 匹配的事件。

在结构化搜索中,用户向 ShiViz 查询通过特定排序模式相关的任何事件集,ShiViz 会突出显示图中与此模式匹配的部分(事件及其互连)。ShiViz 包括几种预定义的模式

• 请求-响应。源节点发送请求,目标节点发回响应。

• 广播。一个节点向系统中的大多数其他节点发送消息。

• 收集。一个节点从大多数其他节点接收消息。

用户还可以组合一个自定义模式,该模式由节点、节点事件以及表示偏序的事件之间的连接组成。图 3 显示了这样一个自定义模式,描绘了在环中通信的三个节点:节点 1 仅与节点 2 通信;节点 2 与节点 3 通信;节点 3 与节点 1 通信。绘制此模式允许用户在执行中搜索此三节点环形通信的所有实例。ShiViz 自动将绘制的模式转换为文本表示(参见顶部的搜索栏),并且可以直接编辑、复制和粘贴文本表示。结构化搜索功能允许用户表达事件之间自定义的通信模式,并查询执行中指定模式的实例。在执行的特定点是否存在查询的子图可以帮助用户检测异常行为,从而帮助他们进行调试。

Debugging Distributed Systems: FIGURE 3: Structured search feature

比较执行

ShiViz 可以帮助用户理解系统的多次执行。当 ShiViz 解析多次执行时,用户可以选择单独查看执行或成对查看执行。

在成对视图中,用户可以通过突出显示差异来进一步比较两次执行。启用后,节点按名称进行比较。对于两次执行中都存在的节点,ShiViz 通过比较相应的事件描述来逐个比较它们的事件。在一次执行中存在但在另一次执行中不存在的节点或事件将重新绘制为菱形。

图 4 说明了在两阶段提交协议的日志上进行的这种成对比较。图中选择的两个事件解释了这两次执行之间的差异:左侧执行中的两阶段提交成功提交了一个事务,但右侧执行中的两阶段提交中止了一个事务。

Debugging Distributed Systems: FIGURE 4: Two two-phase commit protocol executions

显式突出显示差异为用户提供了快速检测异常事件或两次执行发散点的能力。前面描述的搜索功能可以应用于成对视图,以帮助开发人员检测跨跟踪的特定统一或区分特征,从而使他们能够更有效地设计和测试他们的系统。

 

聚类执行

为了帮助管理多次执行,ShiViz 支持将执行分组到集群中。用户可以按节点数量或通过与基本执行进行比较来聚类,使用前面描述的差异机制作为距离度量。集群结果以列出的执行名称的不同组呈现。

执行集群通过一次提供所有执行的概述来帮助检查和比较多次执行。用户可以快速浏览集群结果,以根据执行排序到的组来查看执行的相似之处或不同之处。聚类还可以通过允许用户检查与所需度量匹配的执行子集来帮助用户查明感兴趣的执行。可以通过在聚类结果之上执行关键字搜索或结构化搜索来进一步缩小此子集。如果集群中的执行名称的相应图包含与用户搜索查询匹配的实例,则会突出显示这些名称。

ShiViz 帮助开发人员可视化事件顺序、搜索通信模式以及识别潜在的事件因果关系。这可以帮助开发人员推理执行中事件的并发性、分布式系统状态和分布式故障模式,以及制定关于系统行为的假设并通过执行可视化来验证它们。同时,日志记录的通用性使得 ShiVector 和 ShiViz 广泛适用于部署在各种设备上的系统。

ShiViz 有一些局限性。ShiViz 显示了低级别的排序信息,这使得它不适合用于理解高级别的系统行为。ShiViz 可视化是基于逻辑排序而不是实时排序的,不能用于研究某些性能特征。ShiViz 工具被实现为仅客户端的浏览器应用程序,使其具有可移植性,并且适合分析敏感的日志数据。然而,这种设计选择也限制了它的可扩展性。

ShiViz 是一种开源工具,具有在线部署 (http://bestchai.bitbucket.org/shiviz/)。观看视频演示 ShiViz 的主要功能,请访问 http://bestchai.bitbucket.org/shiviz-demo/

致谢

我们感谢 Perry Liu 和 Albert Xing,他们帮助开发了 ShiViz;Jenny Abrahamson,她开发了最初的 ShiVector 和 ShiViz 原型;以及 Donald Acton 和 Colin Scott,他们帮助评估了 ShiViz。这项工作得到了 NSERC USRA、NSERC Discovery 资助以及美国国家科学基金会 CCF-1453474 和 CNS-1513055 资助的支持。本材料基于 DARPA 在协议号 FA8750-12-2-0107 下赞助的研究。美国政府被授权为政府目的复制和分发重印本,尽管其中可能有任何版权声明。

参考文献

1. Bernstein, P., Hadzilacos, V., Goodman, N. 1986. Distributed recovery. In Concurrency Control and Recovery in Database Systems, Chapter 7. Addison-Wesley; http://research.microsoft.com/en-us/people/philbe/chapter7.pdf.

2. Corbett, J. C., Dean, J., Epstein, M., Fikes, A., Frost, C., Furman, J. J., Ghemawat, S., Gubarev, A., Heiser, C., Hochschild, P., Hsieh, W., Kanthak, S., Kogan, E., Li, H., Lloyd, A., Melnik, S., Mwaura, D., Nagle, D., Quinlan, S., Rao, R., Rolig, L., Saito, Y., Szymaniak, M., Taylor, C., Wang, R., Woodford, D. 2012. Spanner: Google's globally distributed database. 10th Usenix Symposium on Operating Systems Design and Implementation; https://www.usenix.org/conference/osdi12/technical-sessions/presentation/corbett.

3. Garduno, E., Kavulya, S. P., Tan, J., Gandhi, R., Narasimhan, P. 2012. Theia: visual signatures for problem diagnosis in large Hadoop clusters. Proceedings of the 26th International Conference on Large Installation System Administration: 33-42; https://users.ece.cmu.edu/~spertet/papers/hadoopvis-lisa12-cameraready-v3.pdf.

4. Geels, D., Altekar, G., Maniatis, P., Roscoe, T., Stoica, I. 2007. Friday: global comprehension for distributed replay. Proceedings of the Fourth Usenix Conference on Networked Systems Design and Implementation; https://www.usenix.org/legacy/event/nsdi07/tech/full_papers/geels/geels.pdf.

5. Hawblitzel, C., Howell, J., Kapritsos, M., Lorch, J. R., Parno, B., Roberts, M. L., Setty, S., Zill, B. 2015. IronFleet: proving practical distributed systems correct. Proceedings of the 25th Symposium on Operating Systems Principles; http://sigops.org/sosp/sosp15/current/2015-Monterey/250-hawblitzel-online.pdf.

6. Killian, C., Anderson, J. W., Jhala, R., Vahdat, A. 2007. Life, death, and the critical transition:finding liveness bugs in systems code. Proceedings of the Fourth Usenix Conference on Networked Systems Design and Implementation; https://www.usenix.org/legacy/event/nsdi07/tech/killian/killian.pdf.

7. Liu, X., Guo, Z., Wang, X., Chen, F., Lian, X., Tang, J., Wu, M., Kaashoek, M. F., Zhang, Z. 2008. D3S: debugging deployed distributed systems. Proceedings of the Fifth Usenix Symposium on Networked Systems Design and Implementation: 423-437; http://static.usenix.org/event/nsdi08/tech/full_papers/liu_xuezheng/liu_xuezheng.pdf.

8. Mace, J., Roelke, R., Fonseca, R. 2015. Pivot tracing: dynamic causal monitoring for distributed systems. Proceedings of the 25th Symposium on Operating Systems Principles: 378-393; http://sigops.org/sosp/sosp15/current/2015-Monterey/122-mace-online.pdf.

9. Mattern, F. 1989. Virtual time and global states of distributed systems. Proceedings of the International Workshop on Parallel and Distributed Algorithms; http://homes.cs.washington.edu/~arvind/cs425/doc/mattern89virtual.pdf

10. Newcombe, C., Rath, T., Zhang, F., Munteanu, B., Brooker, M., Deardeuff, M. 2015. How Amazon Web Services uses formal methods. Communications of the 58(4): 66-73; http://cacm.acm.org/magazines/2015/4/184701-how-amazon-web-services-uses-formal-methods/fulltext.

11. Project Voldemort; http://www.project-voldemort.com/voldemort/.

12. Sambasivan, R. R., Fonseca, R., Shafer, I., Ganger, G. 2014. So, you want to trace your distributed system? Key design insights from years of practical experience. Parallel Data Laboratory, Carnegie Mellon University; http://www.pdl.cmu.edu/PDL-FTP/SelfStar/CMU-PDL-14-102.pdf.

13. Scott, C., Wundsam, A., Raghavan, B., Panda, A., Or, A., Lai, J., Huang, E., Liu, Z., El-Hassany, A., Whitlock, S., Acharya, H. B., Zarifis, K., Shenker, S. 2014. Troubleshooting blackbox SDN control software with minimal causal sequences. Proceedings of the Conference on SIGCOMM: 395-406; https://www.eecs.berkeley.edu/~apanda/papers/sts.pdf.

14. Sigelman, B. H., Barroso, L. A., Burrows, M., Stephenson, P., Plakal, M., Beaver, D., Jaspan, S., Shanbhag, C. 2010. Dapper, a large-scale distributed systems tracing infrastructure. Research at Google; http://research.google.com/pubs/pub36356.html.

15. Wilcox, J. R., Woos, D., Panchekha, P., Tatlock, Z., Wang, X., Ernst, M. D., Anderson, T. 2015. Verdi: a framework for implementing and formally verifying distributed systems. Proceedings of the 36th SIGPLAN Conference on Programming Language Design and Implementation: 357-368; https://homes.cs.washington.edu/~ztatlock/pubs/verdi-wilcox-pldi15.pdf.

16. Xu, W., Huang, L., Fox, A., Patterson, D., Jordan, M. 2010. Experience mining Google's production console logs. Proceedings of the Workshop on Managing Systems via Log Analysis and Machine Learning Techniques; http://iiis.tsinghua.edu.cn/~weixu/files/slaml10.pdf.

17. Yang, J., Chen, T., Wu, M., Xu, Z., Liu, X., Lin, H., Yang, M., Long, F., Zhang, L., Zhou, L. 2009. MoDist: transparent model checking of unmodified distributed systems. Proceedings of the Sixth Usenix Symposium on Networked Systems Design and Implementation: 213-228; https://www.usenix.org/legacy/event/nsdi09/tech/full_papers/yang/yang_html/.

Ivan Beschastnikh 致力于改进复杂系统的设计、实现和操作。他是英属哥伦比亚大学计算机科学系的助理教授,在那里他领导一个学生团队进行跨越分布式系统、软件工程、安全和网络的项目,特别关注程序分析。更多信息请访问他的主页:http://www.cs.ubc.ca/~bestchai/

Patty Wang 获得了英属哥伦比亚大学计算机科学和数学学士学位。她探索了帮助开发人员理解和比较多次分布式执行的方法,重点是总结跨跟踪的相似性和差异性。

Yuriy Brun 致力于自动化系统构建和创建自适应系统。他是马萨诸塞大学阿默斯特分校的助理教授。他于 2008 年获得南加州大学博士学位,然后在华盛顿大学担任了三年博士后研究员。他获得了美国国家科学基金会的 CAREER 奖、微软研究院 SEIF(软件工程创新基金会)奖、谷歌教师研究奖以及 IEEE TCSC(可扩展计算技术委员会)可扩展计算青年成就奖。更多信息请访问他的主页:http://people.cs.umass.edu/~brun/

Michael D. Ernst 研究如何使软件更可靠、更安全、更容易(也更有趣!)地生产。他的主要技术兴趣在于软件工程、编程语言、类型理论、安全、程序分析、错误预测、测试和验证。Ernst 是 Fellow,并获得了首届 John Backus 奖、NSF CAREER 奖、10 项最佳论文奖和其他荣誉。更多信息请访问他的主页:http://homes.cs.washington.edu/~mernst/

版权 © 2016 由所有者/作者持有。出版权已授权给 。

acmqueue

最初发表于 Queue 第 14 卷,第 2 期
数字图书馆中评论本文





更多相关文章

Marc Brooker, Ankush Desai - AWS 系统正确性实践
构建可靠和安全的软件需要一系列方法来推理系统正确性。除了行业标准的测试方法(如单元测试和集成测试)之外,AWS 还采用了模型检查、模糊测试、基于属性的测试、故障注入测试、确定性模拟、基于事件的模拟以及执行跟踪的运行时验证。形式化方法一直是开发过程的重要组成部分 - 也许最重要的是,形式化规范作为测试预言,为 AWS 的许多测试实践提供正确的答案。正确性测试和形式化方法仍然是 AWS 的关键投资领域,这些领域已经看到的投资回报加速了这一进程。


Achilles Benetopoulos - 数据中心计算机的中间表示
我们已经到了分布式计算无处不在的地步。内存应用程序数据大小正在超过单台机器的容量,因此需要将其分区到集群中;在线服务具有高可用性要求,只有将系统部署为多个冗余组件的集合才能满足这些要求;高持久性要求只能通过数据复制来满足,有时需要跨越广阔的地理距离。


David R. Morrison - 模拟:分布式系统中未被充分利用的工具
模拟在人工智能系统的出现中可以发挥巨大作用:我们需要一种高效、快速且经济高效的方式来训练人工智能代理在我们的基础设施中运行,而模拟绝对提供了这种能力。


Matt Fata, Philippe-Joseph Arida, Patrick Hahn, Betsy Beyer - 企业到云端:谷歌的虚拟桌面
超过四分之一的谷歌员工使用内部、数据中心托管的虚拟桌面。这种本地部署的产品位于公司网络中,并允许用户开发代码、访问内部资源,以及从世界任何地方远程使用 GUI 工具。在其最显著的功能中,虚拟桌面实例可以根据手头的任务调整大小,具有持久的用户存储,并且可以在公司数据中心之间移动,以跟随出差的谷歌员工。直到最近,我们的虚拟桌面都托管在谷歌公司网络上的商用硬件上,使用一个名为 Ganeti 的自研开源虚拟集群管理系统。如今,这项重要的且对谷歌至关重要的工作负载在 GCP (Google Compute Platform) 上运行。





© 版权所有。

© . All rights reserved.