我想知道在分布式系统中追踪性能瓶颈的可能方法。我知道X-Trace及其后代(例如Dapper)之类的工具,但我对方法而不是特定工具更感兴趣。
换句话说,给定一个没有明显瓶颈的分布式系统,你如何研究和提高它的性能?
我使用了一种既有优点又有缺点的方法。优点是它可以工作 - 它发现问题,当它们被修复时,会产生很好的性能。缺点是这是大量的手工工作。
我什至写了一本书,并附上了这个方法。工作是收集带有时间戳的事件日志并将它们合并到一个公共时间线中。然后仔细检查它,通过异步代理网络跟踪相关消息的流动。您正在寻找的是不必要的消息周期,或不一定发生的延迟。例如,在查看这张图片时,由于任务“将状态发布到 DB”,消息的接收被延迟。理解这一点后,实际上可以在单独的线程上进行发布。
老实说,这是一个很好的问题,对于什么是最好的方法没有达成共识。最基本的方法之一是日志记录,您基本上只是将一堆系统事件转储到一个文件中,您可以解析这些日志以找到事件之间的时间,以确定它们需要多长时间。另一种方法是跟踪(由 Xtrace 使用)。在跟踪中,您跟踪请求的生命周期。例如,如果您向使用微服务架构的服务发送请求,您将跟踪请求通过系统微服务时的线程、进程 ID 和延迟。
棘手的部分是弄清楚你想在请求的跟踪中跟踪什么,这将取决于你的分布式系统试图完成什么。例如,对性能感兴趣的一个明显指标是延迟,因此您将衡量请求在每个服务上花费的时间。另一个有趣的指标是争用,因此您可以在请求通过系统时测量 CPU 中的争用。许多这些分析工具的问题之一是它们为您提供系统或请求的总体指标,但是当您想要找到性能问题时,您想要确定请求是否是异常值。因此,必须将请求的延迟、争用和内存消耗与系统中的其他类似请求进行比较,以确定它是否异常。