`
songzi0206
  • 浏览: 158781 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
Group-logo
All are from ...
浏览量:33800
Group-logo
Programming w...
浏览量:19676
社区版块
存档分类
最新评论

利用JFR监控WLS

    博客分类:
  • WLS
阅读更多

       前阵子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();
	}

 

            

 

0
0
分享到:
评论

相关推荐

    jfr.jar 包

    jfr.jar 非常好用的Jar包 用过 所以才上传的 赚取积分

    jfr工具包.rar

    JAR(Java Archive,Java 归档文件)[1]是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文件)。JAR 文件格式以流行的 ZIP 文件格式为基础。...

    84BallEmbedded_DDR2_H5PS1G63JFR(Rev1.9).pdf

    根据提供的文档信息,我们可以深入探讨有关H5PS1G63JFR系列1Gb DDR2 SDRAM的关键技术细节。此文档主要围绕84Ball FBGA(Fine Pitch Ball Grid Array)封装DDR2内存芯片的引脚定义和技术规范进行阐述。下面将详细介绍...

    H5MS2562JFR.pdf

    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 ...

    Java中JDK14的新特性之JFR,JMC和JFR事件流(推荐)

    总的来说,JFR和JMC在JDK 14中的更新加强了Java的监控和诊断能力,使得开发者能够更有效地管理和优化他们的Java应用程序。了解并熟练使用这些工具,对于提升Java应用的性能和稳定性至关重要。通过结合JFR的事件流...

    jvisualvm来JVM监控

    本文将详细探讨如何利用jvisualvm来进行有效的JVM监控。 一、jvisualvm简介 jvisualvm是Java Development Kit (JDK) 的一部分,通常位于`$JAVA_HOME/bin`目录下。它提供了一个直观的用户界面,集成了多种性能监控...

    jfr

    标题 "jfr" 指的是 Java Flight Recorder (JFR),这是Java平台上的一个强大的诊断和监控工具。它主要用于收集关于JVM(Java虚拟机)和应用程序运行时的详细信息,帮助开发者和性能调优专家深入理解应用的内部工作...

    Java飞行记录器JFR功能实现过程图解

    模板创建完成后,可以导出到一个文件中,并将此文件复制到需要监控的环境中。 2. 解锁JDK商业特性: 由于JFR是JDK的商业特性,因此在使用之前需要进行解锁。这可以通过执行JDK自带的命令行工具jcmd来完成,具体命令...

    java虚拟机监控

    8. **配置与插件**:jvisualvm允许用户自定义监控参数,并且可以通过安装插件扩展其功能,如添加对JMX、JFR(Java Flight Recorder)的支持,进一步增强监控能力。 总结起来,Java虚拟机监控是一项关键的开发和运维...

    jfr-datasource:用于Grafana的JFR数据源

    jfr数据源 这演示了如何在Grafana中使用简单的json数据源来读取JFR文件的事件。 用法 依存关系 为了支持本机映像,需要graalvm 20.3.0(Java 11版本),并通过环境变量GRAALVM_HOME设置其目录的路径。 可以从以下...

    后羿蛋白 - 5jfr2.rp

    后羿蛋白 - 5jfr2.rp

    jfr:以编程方式控制 Java Flight Recorder

    标题"jfr:以编程方式控制 Java Flight Recorder"指的是利用JFR的API来动态地启动、停止和配置记录过程,而不是通过命令行选项或默认配置。这种方法为开发者提供了更大的灵活性,可以基于运行时条件调整监控设置。 ...

    container-jfr-core

    容器-JFR-核心 核心库提供了方便的包装和无头的存根,用于使用JDK Mission Control API管理JFR 要求 建造: 玛文 JDK11 + 建造 mvn install编译该核心库,并将工件发布到本地Maven存储库,以供其他项目使用。

    JDK22 开发工具包!!!

    利用JFR监控应用程序的性能,根据其提供的数据进行调优。 4. **JDK命令行工具** JDK22包含了丰富的命令行工具,如JVisualVM、jconsole等,用于分析和诊断应用程序。 总之,JDK22不仅提供了许多新特性以提升开发...

    jfr2017yi_单目视觉定位_VINSNavigation_

    在这个主题中,我们主要关注如何利用单个摄像头进行实时定位和环境映射,以及视觉惯性里程计(Visual Inertial Odometry, VIO)在这一过程中的应用。 首先,我们要理解什么是单目视觉定位。单目视觉定位是指仅通过...

    tracebuffer计算器

    为了更好地利用这个工具,用户需要了解JDK 11的性能监控特性,尤其是JFR的配置和使用。此外,对Python编程和GUI开发的基本知识也是必要的,以便定制或扩展这个工具的功能。同时,理解如何解读调用堆栈和性能指标对于...

    JFR FileRenamer-开源

    一次重命名文件列表的 Java 应用程序,支持拖放、复制和粘贴、整个文件列表的全文编辑、搜索和替换的正则表达式、自动编号生成。

    Java Flight Recorder.pdf

    Java Flight Recorder(JFR)是一个功能强大的性能监控工具,能够帮助开发者对Java应用程序进行性能分析和故障排除。JFR最初是作为JRockit虚拟机的一部分,后来被集成到Oracle JDK中,自Java 7 Update 40起成为标准...

    Java任务控制.pdf

    3. **Java飞行记录器(JFR)**:JFR是一个低开销的监控工具,它在运行时记录JVM的详细信息,而不会显著影响应用程序的性能。记录的数据可以在JMC中进行分析,帮助开发者识别性能问题。JFR的记录可以通过配置来定制,如...

Global site tag (gtag.js) - Google Analytics