在 Java Web 应用程序中搜索性能问题时,我想分析(通过采样)单个 Web session 。 Web 应用程序部署在 Java EE 应用程序服务器上(JBoss 或 WLS,因此不可能有 OpenJDK 特定的东西)
使用 JVisualVM 或 YourKit 等传统采样器只能让我一次分析所有正在运行的线程,因此不会显示与服务器上已经存在的基本负载分离的所述 Web session 的 CPU 使用情况。部分问题在于,网络 session 和单个线程之间(显然)没有技术联系,即每个请求都可能从应用程序服务器的线程池中获取不同的线程。
我的想法是实现一个采样器,并在每次从服务器收到新请求时注册与观察到的网络 session 关联的线程(请求完成后立即取消注册线程)。
第一个问题:您必须手动执行此操作还是已经有工具可以为您执行此操作?
第二个问题(因为我没有发现任何问题,并假设这是一个相当具体的问题):最好的方法是什么?
显然,人们会尝试尽量减少分析对应用程序性能的影响。同样明显的是,由于我需要将(技术)线程信息连接到特定于应用程序的数据(websession-ID),这似乎没什么,这可以通过 JVMTI 完成。
保留对应用内分析器进行编码的选项,其中线程通过 Thread.stackTrace 或 ThreadMXBean.getThreadInfo 进行采样。哪个更好?还有其他更好的选择吗?
最佳答案
JProfiler可以针对不同的 URL 或查询参数拆分调用树。
如果您可以为此目的修改 URL 或查询参数,那么您将能够将 session 与后台负载分开。例如,您可以添加一个查询参数 profile=true
,仅针对应分析的请求传递该参数。
免责声明:我的公司开发 JProfiler。
关于java - 分析单个 Web session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27982150/