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