3

我正在使用 Jmeter 使用 Ant 插件进行负载测试。当前使用 JFR GUI 模式在测试期间为每个节点捕获服务器的 JVM 指标。每个节点启动很麻烦,有时会错过启动。有没有办法通过代码开始一起做?

客户详情

热点 JDK 1.8_131、Mac OS、Jmeter 4.0

服务器详情

热点 1.8.0_152、OEL、Tomcat

在互联网上,我可以选择在服务器节点中以编程方式启动 JFR,这对我不起作用。

4

1 回答 1

4

如果您有终端访问权限,则可以使用命令行工具 jcmd 创建脚本并开始录制。

$ jcmd <class/jarfile> VM.unlock_commercial_features
$ jcmd <class/jarfile> JFR.start

或者

$ jcmd (to list available pids)
$ jcmd <pid> VM.unlock_commercial_features
$ jcmd <pid> JFR.start

更多详细信息,请参见 示例 2-1 使用 jcmd 进行动态交互

如果您无法通过 SSH 访问服务器,或者不想在 shell 中执行此操作,则可以使用 JMX 并发送与诊断命令相同的命令。

在 JMC 中,在 Management/JMX 控制台中,您可以检查服务器上的 MBean。在那里,您将找到“com.sun.management / DiagnosticCommand”MXBean 以及您可以编写代码的操作。对象名称为 com.sun.management:type=DiagnosticCommand,您需要使用 jfrStart 调用它。

您可以像这样设置连接。

String host ="myHost";
int port = 1234;
HashMap map = new HashMap();
String[] credentials = new String[2];
credentials[0] = user;
credentials[1] = password;
map.put("jmx.remote.credentials", credentials);
String s = "/jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL url = new JMXServiceURL("rmi", "", 0, s);
JMXConnector c= JMXConnectorFactory.newJMXConnector(url, map);
c.connect();
MBeanServerConnection conn = c.getMBeanServerConnection();

如果您不关心安全性,可以将 map 设置为 null。然后您创建一个对象名称并调用您想要执行的操作,例如:

ObjectName on = new ObjectName("com.sun.management:type=DiagnosticCommand"); 
Object[] args = new Object[] {
    new String[] {
        "dumponexit=true",
        "filename=/recordings/rec.jfr",
        "duration=600s"
    }
};
String[] sig = new String[] {"[Ljava.lang.String;"};
conn.invoke(on, "jfrStart", args, sig);

在 JDK 9 及更高版本中,有一个FlightRecorderMXBean可用于远程访问(包括录制下载),但如果您卡在 JDK 8 上,我会执行上述操作。Oracle JDK 8 中也有一个 MBean,但它不受支持、未记录在案,并且需要黑魔法才能使其工作。

于 2019-04-19T05:54:35.287 回答