如何识别关键代码路径
在回答“如何识别关键代码路径?”问题之前 让我回答另一个相关的问题:“为什么要标识关键代码路径?”
有两个答案:
- 性能优化
- 准确的烟雾测试
性能优化
在大多数应用程序中,我们已经观察到不到5%的应用程序代码占90%以上的代码执行。 因此,如果您可以优化这5%的代码,则可以显着提高整个应用程序的性能。 这是最好的投资回报率。 不分析其余95%的代码,可以节省大量时间。
准确的测试套件
您可以编写针对性强的单元测试,以练习关键的代码路径并使您的应用程序防弹。 实际上,这些测试可以充当应用程序的冒烟测试。 它可以集成到您的CI / CD管道中。 这种准确的测试套件可减少总体测试执行时间 。 它还可以减少后端系统中的测试数据设置时间。
Now let's get back to our original question: How to identify critical code path? This is where thread dumps come in handy.
线程转储
线程转储是给定时刻应用程序中正在运行的所有线程的快照。 它包含有关每个线程的详细信息,包括其堆栈跟踪。 以下是在线程转储中为“ InvoiceGeneratedQC-A99-6”线程提供的信息。
图1:线程的堆栈跟踪
上述堆栈跟踪告诉您“ InvoiceGeneratedQC-A99-6”线程的代码执行路径。 该线程已按顺序(1 – 9)执行了9种方法,如图1所示。
线程首先执行java.lang.Thread.run()方法,然后继续执行java.util.concurrent.ThreadPoolExecutor $ Worker.run()方法,然后继续执行其他方法,直到com.buggycompany.rt .util.ItinerarySegmentProcessor.setConnectingFlight()。
如果多个线程执行相同的代码执行路径,则该代码路径将成为您的关键路径 。 您可以对所有线程的堆栈跟踪进行分组,将它们组合在一起以形成一个单一的调用堆栈树,然后您就可以确定关键的代码执行路径。
调用堆栈树
诸如fastthread.io之类的工具可以将所有线程的堆栈跟踪分组,并生成一个调用堆栈树。 您可以在该树上下钻并向上浏览以查看关键代码路径。 以下是“ fastThread.io”生成的示例调用堆栈树。 欢迎您到这里查看实时报告中的调用堆栈树 。
无花果2:调用堆栈树
您可以继续向下钻取以查看代码执行路径。 图3在“调用堆栈树”图中显示了特定分支的深入版本。
图3:深入的调用堆栈树
调用堆栈树向您显示已执行的代码的类名称,方法名称和行以及已执行该代码行的多个线程。
图4:来自调用堆栈树的单个元素
从“调用堆栈树”中的上述元素,可以确定buggyCompanyCallable.java中的call()方法由9个线程执行。 由于9个线程正在执行此方法,因此可以将其归类为关键代码路径。
请注意,调用堆栈树将包含来自Java,外部框架和库的代码,因为您的应用程序也会执行这些代码。 在编写重点测试或优化关键代码路径的性能时,您可以忽略该外部代码或将其设置为低优先级,因为您对其的控制极少。
在测试环境中镜像生产流量非常困难(如果不是不可能的话)。 当您需要确定生产中的关键代码执行路径时,理想的是从生产环境而不是测试或其他较低环境中捕获线程转储。
在高峰时间段捕获线程转储是理想的。 在这里您可以观察到应用程序代码练习的最大可能性。
由于线程转储是特定时间点的快照,因此理想的是捕获至少3 – 5个线程转储,以查看一些代码执行路径的可能性。 有多个捕获线程转储的选项。
使用您最喜欢的选项捕获线程转储。
翻译自: https://jaxenter.com/identify-critical-code-path-150940.html