前阵子Jenkins上builds起伏很大,有些UnitPerfTes的耗时很大,一度使得WLS集群表现很糟糕,于是我希望为UnitPerfTest框架加上JRockit Flight Recording(JFR)模块,具体是这样的:
1)在每个节点开始跑 Task之前能启动该节点上的一个JFR;
2)当task跑完之后结束JFR;
3)从每一个节点产生的JFR report 传回到启动Task所在的JVM,也就是我们Jenkins Server上
JFR是JRockit Missing Controll的东西(目前新版的Hotspot JDK已经也支持了),查了下wiki到也容易,首先JFR是事件驱动的,所有的数据收集都是通过事件触发实现的,所以客户端如果想定制自己的JFR report的话可以注册相关的事件,并且disable不感兴趣的事件。所以第一件事是搞清楚到底有哪些事件,通过一小段代码就可以打印出如下事件以及属性(附event文件):
try { FlightRecorderClient fr = new FlightRecorderClient(); FlightRecordingClient rec = fr.createRecordingObject("tmp"); for (CompositeData pd : fr.getProducers()) { if (!PRODUCER_URI.equals(pd.get("uri"))) continue; CompositeData events[] = (CompositeData[]) pd.get("events"); // Go through all registered events and enable them for (CompositeData d : events) { int id = (Integer) d.get("id"); 。。。。。。。 } } } catch (Exception e) { // Add proper exception handling. e.printStackTrace(); }
所以接下来就很好搞了,定义几个常用的事件模板,比如nomal_event_setting,mem_event_setting,lock_event_setting分别用来配置一般测试,着重找mem问题的测试和着重找cpu/锁等问题的测试配置,在node启动之前,创建FJR设定关注的事件 并启动:
public static FlightRecordingClient createFlightRecordingClient(final String recordingName) throws NamingException, JMException, IOException, NoSuchRecordingException, NoSuchEventException { MBeanServerConnection server = ServerConfiguration.getInstance().getServerRuntimeServer(); FlightRecorderClient frc = new FlightRecorderClient(server); FlightRecordingClient flightRecording = frc.createRecordingObject(recordingName); //Disable all the events for (CompositeData pd : frc.getProducers()) { CompositeData[] events = (CompositeData[]) pd.get("events"); for (CompositeData event : events) { Integer id = (Integer) event.get("id"); flightRecording.setEventEnabled(id, false); flightRecording.setStackTraceEnabled(id, false); } } return flightRecording; } public static void startFlightRecording(FlightRecordingClient frc, List<JFREventSetting> events) throws NoSuchEventException { if (frc.isStarted()) { logger.warn("The FlightRecording has already started in current thread."); } else { //Set all the event values for (JFREventSetting event : events) { frc.setEventEnabled(event.getId(), event.isEnabled()); frc.setStackTraceEnabled(event.getId(), event.isStackTraceEnabled()); frc.setPeriod(event.getId(), event.getPeriod()); frc.setThreshold(event.getId(), event.getThreshold()); } frc.start(); } }
测试结束停止JFR:
public static void stopFlightRecording(final FlightRecordingClient frc) throws IOException { if (frc == null) { logger.warn("Stop Flight Recording Warning: There is no FlightRecording in current thread context."); return; } if (frc.isStopped()) { logger.warn("The FlightRecording has already stopped in current thread."); } else { frc.stop(); } }
最后我们需要把JFRReport从WLS Node传回到Jenkins Server,所以实现一个RemoteStream来完成:
public interface RemoteOutputStream extends Remote{
public void close() throws IOException, RemoteException;
public void flush() throws IOException, RemoteException;
public void write(byte[] b) throws IOException, RemoteException;
public void write(byte[] b, int off, int len) throws IOException, RemoteException;
public void write(int b) throws IOException, RemoteException;
}
public class RemoteOutputStreamImpl implements RemoteOutputStream{
public RemoteOutputStreamImpl(OutputStream out)
{
if (out == null) {
throw new IllegalArgumentException("OutputStream cannot be null.");
}
this.out = out;
}
@Override
public void close() throws IOException
{
out.close();
}
/* (non-Javadoc)
* @see oracle.oats.common.utilities.wls.rmi.RemoteOutputStream#flush()
*/
@Override
public void flush() throws IOException
{
out.flush();
}
/* (non-Javadoc)
* @see oracle.oats.common.utils.rmi.RemoteOutputStream#write(byte[])
*/
@Override
public void write(byte[] b) throws IOException
{
out.write(b);
}
/* (non-Javadoc)
* @see oracle.oats.common.utils.rmi.RemoteOutputStream#write(byte[], int, int)
*/
@Override
public void write(byte[] b, int off, int len) throws IOException
{
out.write(b, off, len);
}
/* (non-Javadoc)
* @see oracle.oats.common.utils.rmi.RemoteOutputStream#write(int)
*/
@Override
public void write(int b) throws IOException
{
out.write(b);
}
}
public class RemoteOutputStreamWrapper extends OutputStream{
//封装一个RemoteOutputStream,略
}
所以这样就远程的传回来就可以简单的copy下stream就ok了:
public static void copyStream(InputStream in, OutputStream out) throws IOException { if (!(in instanceof BufferedInputStream || in instanceof ByteArrayInputStream)) { in = new BufferedInputStream(in); } if (!(out instanceof BufferedOutputStream || out instanceof ByteArrayOutputStream)) { out = new BufferedOutputStream(out); } byte[] buf = new byte[32768]; int len = 0; while ((len = in.read(buf)) != -1) { out.write(buf, 0, len); } out.flush(); }
相关推荐
jfr.jar 非常好用的Jar包 用过 所以才上传的 赚取积分
JAR(Java Archive,Java 归档文件)[1]是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文件)。JAR 文件格式以流行的 ZIP 文件格式为基础。...
FEATURES SUMMARY ● ●● ●Mobile DDR SDRAM - Double data rate architecture: two data transfer per clock cycle ● ●● ●Mobile DDR SDRAM INTERFACE - x16 bus width - Multiplexed Address (Row ...
jfr数据源 这演示了如何在Grafana中使用简单的json数据源来读取JFR文件的事件。 用法 依存关系 为了支持本机映像,需要graalvm 20.3.0(Java 11版本),并通过环境变量GRAALVM_HOME设置其目录的路径。 可以从以下...
后羿蛋白 - 5jfr2.rp
jfr
JFR是一个基于事件的低开销的分析引擎,具有高性能的后端,可以以二进制格式编写事件,而JMC是一个GUI工具,用于检查JFR创建的数据文件。本文给大家介绍Java中JDK14的新特性之JFR,JMC和JFR事件流的相关知识,感兴趣...
84Ball FBGA封装 DDR2引脚定义
容器-JFR-核心 核心库提供了方便的包装和无头的存根,用于使用JDK Mission Control API管理JFR 要求 建造: 玛文 JDK11 + 建造 mvn install编译该核心库,并将工件发布到本地Maven存储库,以供其他项目使用。
一次重命名文件列表的 Java 应用程序,支持拖放、复制和粘贴、整个文件列表的全文编辑、搜索和替换的正则表达式、自动编号生成。
主要介绍了Java飞行记录器JFR功能实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
JDK Flight Recorder自定义事件 “使用JDK Flight Recorder自定义事件监视REST API”随附的示例代码。 它显示了如何将自定义事件类型与JDK Flight Recorder和Mission Control结合...# JFR datasource for Grafana mvn
JFR-laboratorio-git
sbt-jfr sbt-jfr是一个sbt插件,用于通过命令行参数配置 。 用法 将以下设置添加到您的project/plugins.sbt : addSbtPlugin( " nl.zolotko.sbt " % " sbt-jfr " % " latest.release " ) 的例子build.sbt有两个...
视觉惯性里程计、视觉实时定位与地图构建、单目相机解决方案
#资源达人分享计划#
JFR Java Feed Reader (jFR) 是一个基于 Java 的 Feed Reader(惊喜!),用于解析 Atom 和 RSS 提要。 jFR 仍在进行中,所以要小心。
JFR 以编程方式控制 Java Flight Recorder。 关于如何在 JVM 运行时开始飞行记录的概念验证。
集装箱-JFR 也可以看看 用于核心库的提供了方便的包装和无头的存根,以便通过JDK Mission Control内部使用JFR。 用于OpenShift运算有助于在OpenShift集群中轻松设置ContainerJFR,并将ContainerJFR API作为...