MyPerf4J: GitHub地址
一个极快的Java接口性能监控和统计工具。受perf4j和TProfiler启发而来。
致力于成为可在生产环境长时间使用的性能监控和统计工具!
如果觉得写得还行,请给个star :) 。
多语言文档
- English WIKI 
- 中文 
背景
- 我需要一个能统计接口响应时间的程序 
- perf4j现有的统计结果不能满足我的需求 
需求
- 能统计出接口的RPS、Avg、Min、Max、StdDev、TP90、TP95、TP99、TP999等性能指标 
- 可配置,可以指定统计某些类、某些方法,也可以指定不统计某些类、某些方法 
- 不占用过多的内存、不影响程序的正常响应 
- 性能指标的处理可以定制化,例如:日志收集、上报给日志收集服务等 
内存
- 前提条件 - 服务上有1024个需要监控的接口 
- 每个接口的绝大部分响应时间在300ms以内,并且有100个不相同的大于300ms的响应时间 
- 不开启指针压缩 
- 非核心数据结构占用2MB 
 
- rough模式 - 只记录响应时间小于1000ms的请求 
- 2 * 1024 * (1000 * 4B) + 2MB ≈ 10MB 
 
- accurate模式 - 记录所有的响应时间 
- 2 * 1024 * (300 * 4B + 100 * 90B) + 2MB ≈ 22MB 
 
压测
- 配置说明 - CPU Intel(R) Core(TM) i7-7920HQ CPU@3.10GHz 
- RAM 16GB 2133MHz LPDDR3 
 - 操作系统 macOS High Sierra 10.13.3 
- JDK 1.8.0_161 
- JVM参数 -server -Xmx4G -Xms4G -Xmn2G 
- 机器配置 
 
- 测试方法 - 对空方法进行压测 
- 为了避免由于空方法执行过快导致多个线程高度竞争资源(竞争AbstractRecorder中的AtomicIntegerArray)进而导致压测结果出现明显的性能下降,通过轮询的方式执行8个空方法,然后把8个方法的RPS相加得出结果 
- 时间片为10s,每次压测中间停顿20s,并且执行 - System.gc();
 
- MyPerf4J-ASM - 线程数 - 每线程循环数 - RPS - 1 - 1000000000 - 13815816 - 2 - 1000000000 - 16199712 - 4 - 1000000000 - 33060632 - 8 - 1000000000 - 55981416 
- 压测结论 - MyPerf4J-ASM是通过ASM框架修改类的字节码,在方法前后插入两行方法,不产生多余的对象,在整个压测过程中不会触发任何的GC(除了代码中执行的 - System.gc();)!!!
 - MyPerf4J-ASM在单线程下每秒可支持138万次的方法调用!平均每次方法调用耗时72.3ns!!!能够满足绝大部分人的要求,不会对程序本身的响应时间造成影响! 
 - 从压测结果来看: 
- 高性能原因: 
 
使用
- 在JVM启动参数里加上: -javaagent:/your/path/to/MyPerf4J-ASM-${MyPerf4J-version}.jar 
- 在JVM启动参数里加上:-DMyPerf4JPropFile=/your/path/to/myPerf4J.properties,并在 - /your/path/to/myPerf4J.properties中加入以下几个配置项:- #配置Record模式,可配置为accurate/roughRecorderMode=accurate#配置时间片,单位为ms,最小30s,最大600sMillTimeSlice=10000#需要监控的package,可配置多个,用英文';'分隔IncludePackages=cn.perf4j.demo#不需要监控的package,可配置多个,用英文';'分隔ExcludePackages=org.spring;#可配置多个方法名,用英文';'分隔ExcludeMethods=equals;hash#是否排除私有方法,true/falseExcludePrivateMethod=true#通用的方法执行时间阈值,单位为msProfilingTimeThreshold=1000#在一个时间片内,超过方法执行时间阈值的次数,仅在RecorderMode=accurate时有效ProfilingOutThresholdCount=10 
- 执行命令 - mvn clean package
- 运行你的程序 
- 输出结果 - MyPerf4J Performance Statistics [2018-06-22 20:37:30, 2018-06-22 20:38:00]Api[2/3] RPS Avg(ms) Min(ms) Max(ms) StdDev Count TP50 TP90 TP95 TP99 TP999 TP9999 TP99999 TP100UserServiceImpl.getId1 90 4.31 4 8 0.08 2793 4 5 6 8 8 8 8 8UserServiceImpl.getId2 90 0.00 0 0 0.00 2793 0 
作者:怪盗_7003
链接:https://www.jianshu.com/p/841896f61358
共同学习,写下你的评论
评论加载中...
作者其他优质文章
 
                 
             
			 
					