最近做压测的时候发现大报文总是tps很低,但是服务端用arthas测试正常,想着应该是jmeter的问题,这个又需要翻看源码,顺便记录下

下载和运行

在github仓库下载jmeter的源码,公司用的是jmeter3.1.x,就下载该版本的。
导入过程参考这篇博文,老版本,使用到ant,就下了个ant,ant确实效率低下,相较于maven存放依赖,ant管理项目的话还要下载jar包,idea右侧ant的download_jars来下载jar包,感觉下载超级慢,从maven中央仓库下载的… 下载完了之后,就可以install了,不再报错。

怎么修改ant的设置从其他仓库下载jar包

ant毕竟太老了,看了下build.xml里,有个maven.home的地方,不过没细瞅,就下载完了,以后碰到再看。

运行报错

  • 内容:
    WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(…) returned error code 5.
  • 原因:
    注册表的问题,不影响运行,参考这篇博文

源码跟踪

压测大报文,性能相关的地方是载入jmx文件的过程,和最终传输到服务端这两个地方。参考这篇博文
相应的类和方法搜索,加对照源码,锁定为

  • org.apache.jmeter.gui.action.Load loadProjectFile 读取文件
  • org.apache.jmeter.save.SaveService loadTree 读取hashtree
  • org.apache.jmeter.NewDriver main 入口
  • org.apache.jmeter.JMeter runNonGui
  • org.apache.jmeter.engine.StandardJMeterEngine runTest
  • org.apache.jmeter.engine.JMeterEngine configure

具体流程梳理:

先进入org/apache/jmeter/NewDriver.java,反射调用JMeter的start方法

JMeter的start方法调用startNonGui方法

该方法调用runNonGui方法

private void startNonGui(String testFile, String logFile, CLOption remoteStart, boolean generateReportDashboard)throws IllegalUserActionException, ConfigurationException {// add a system property so samplers can check to see if JMeter// is running in NonGui modeSystem.setProperty(JMETER_NON_GUI, "true");// $NON-NLS-1$JMeter driver = new JMeter();// TODO - why does it create a new instance?driver.remoteProps = this.remoteProps;driver.remoteStop = this.remoteStop;driver.parent = this;PluginManager.install(this, false);String remoteHostsString = null;if (remoteStart != null) {remoteHostsString = remoteStart.getArgument();if (remoteHostsString == null) {remoteHostsString = JMeterUtils.getPropDefault("remote_hosts", //$NON-NLS-1$"127.0.0.1");//$NON-NLS-1$}}if (testFile == null) {throw new IllegalUserActionException("Non-GUI runs require a test plan");}driver.runNonGui(testFile, logFile, remoteStart != null, remoteHostsString, generateReportDashboard);}

runNonGui方法为真正核心代码,包括加载jmx和engine的操作

HashTree tree = SaveService.loadTree(f);
...
if (!remoteStart) {JMeterEngine engine = new StandardJMeterEngine();engine.configure(tree);long now=System.currentTimeMillis();println("Starting the test @ "+new Date(now)+" ("+now+")");engine.runTest();engines.add(engine);
}

engine为JMeterEngine接口,实现类为StandardJMeterEngine

问题诊断

用阿里巴巴的arthas进行诊断,步骤:

  1. 将arthas直接安装到jmeter的bin目录下,方便诊断
  2. 解压后先用jmeter开始压测
  3. 根据jmeter默认端口4445查看pid,命令lsof -i:4445
  4. 启动arthas,命令/app/aimUpload/jdk1.8/bin/java -jar arthas-boot.jar pid号
  5. 正常显示图标后,针对要诊断的类和方法用trace或tt测试,如trace org.apache.jmeter.gui.action.Load loadProjectFile -n 3
  6. 检查耗时是否正常,了解耗时点在哪个方法上。
  7. 真正耗时点是业务代码… com.asiainfo.utils.srvcaller.CenterClient call

现状

collector有问题,

jmeter源码解读相关推荐

  1. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

  2. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  3. linux下free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  4. nodeJS之eventproxy源码解读

    1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...

  5. PyTorch 源码解读之即时编译篇

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 作者丨OpenMMLab 来源丨https://zhuanlan.zhihu.com/ ...

  6. Alamofire源码解读系列(九)之响应封装(Response)

    本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...

  7. Feflow 源码解读

    Feflow 源码解读 Feflow(Front-end flow)是腾讯IVWEB团队的前端工程化解决方案,致力于改善多类型项目的开发流程中的规范和非业务相关的问题,可以让开发者将绝大部分精力集中在 ...

  8. spring-session源码解读 sesion

    2019独角兽企业重金招聘Python工程师标准>>> spring-session源码解读 sesion 博客分类: java spring 摘要: session通用策略 Ses ...

  9. 前端日报-20160527-underscore 源码解读

    underscore 源码解读 API文档浏览器 JavaScript 中加号操作符细节 抛弃 jQuery,拥抱原生 JS 从 0 开始学习 GitHub 系列之「加入 GitHub」 js实现克隆 ...

最新文章

  1. LiveVideoStackCon2021音视频技术大会北京站Day2
  2. php 获取路由参数,路由参数 · ThinkPHP5.0完全开发手册 · 看云
  3. 详解Paint的各种set方法
  4. Unity c#中Attribute用法详解
  5. 关于redis的db的使用几号db的问题
  6. C# DateTime 日期加1天 减一天 加一月 减一月 等方法
  7. onenote使用python开发_如何充分利用 OneNote,发挥它的全部价值和潜力?
  8. Clock saver for Mac(博朗手表时钟屏保)
  9. Java,设计,功能权限和数据权限,用户、角色、权限和用户组
  10. 利用Vue制作一个简单的走马灯
  11. linux 全选 编辑文本_强烈推荐:Linux终端文本编辑器Micro
  12. 百度地图 ( 一 ) 显示地图
  13. AutoHotKey 新手入门教程
  14. 科技论文写作投稿相关
  15. vc++ 调用winapi调节屏幕亮度
  16. 入侵FBI(www.fbi.gov)核心网络全过程
  17. [刷题]leetcode\278_第一个错误的版本
  18. hiho1353零一背包
  19. 警惕!QQ盗号又出新招 不改密码只转移QQ币
  20. 销毁session的四种方法

热门文章

  1. win10触摸键盘TabTip软件特性
  2. 【计算方法】解线性方程组的直接法
  3. NoesisGUI入门及初步使用感想
  4. MNI模板和Talairach模板的区别
  5. 研究生最全文献查询、下载网站汇总,汇集各个专业权威国外网站!
  6. Raspberry Pi 4和 Raspberry Pi 4B的区别_用树莓派搭建私人简易网盘 2/5 树莓派4B初始设置...
  7. 疯狂英语(Chapter one)
  8. 实现不同的导航条,看直播app开发怎么做
  9. 设备健康管理软件如何帮助企业优化设备维保计划?
  10. 应用程序迁移_加速绿色IT-关于应用程序迁移和重新托管的实用指南