标准营销型网站定做价格,东莞人才招聘网最新招聘2022,商业网站的建设与维护,哈尔滨市香坊区建设局网站经验总结
1. 如果总的CPU占用率偏高#xff0c;且基本都被业务线程占用时#xff0c;CPU占用率过高的原因跟JVM参数大小没有直接关系#xff0c;而跟具体的业务逻辑有关。
2. 当设置JVM堆内存偏小时#xff0c;GC频繁会导致业务线程停顿增多#xff0c;TPS下降#xff…
经验总结
1. 如果总的CPU占用率偏高且基本都被业务线程占用时CPU占用率过高的原因跟JVM参数大小没有直接关系而跟具体的业务逻辑有关。
2. 当设置JVM堆内存偏小时GC频繁会导致业务线程停顿增多TPS下降最后CPU占用率也低了
3. 当设置JVM堆内存偏大时GC次数下降TPS上升CPU占用率立刻上升。
4. Dom4J 这个xml解析工具性能很强大但在处理节点和层级都较多的xml文本时整体解析效率依然会成为业务处理瓶颈。
一、背景说明
最近新项目上线需要对项目中的一个HTTP接口进行压力测试以保证接口性能稳定性。该接口涉及到的主要业务是接收HTTP请求获取请求中的xml报文参数并将xml报文解析后存入MySQL数据库。接口业务流程如下 该业务接口部署的服务器配置和部署MySQL组件的服务器配置一致都是4核8G50G普通硬盘并且处于同一个内网网段我们预估的性能指标要达到200并发500TPS。 在压力测试过程中我们重点关注TPS、GC次数、CPU占用率和接口响应时间等指标。 二、测试过程
完成项目部署后我们开始编辑jemeter测试脚本设置压力测试的标准为200个并发线程在10秒内全部启动持续压测时间15分钟接着开始启动jemeter脚本进行测试。
1、第一次压力测试
1JVM配置
垃圾收集策略包括老年代启用CMS垃圾收集算法新生代启用ParNew垃圾收集算法新生代最大存活周期为15次minorGCFullGC时使用CMS算法并开启CMS中的并行标记。
JVM内存分配最大/最小堆内存为512MBEden和Survivor比例为8:2永久代初始化64MB最大128MB。
JVM配置参数如下 -XX:UseConcMarkSweepGC -XX:UseParNewGC -XX:MaxTenuringThreshold15 -XX:ExplicitGCInvokesConcurrent -XX:CMSParallelRemarkEnabled -Xms512m -Xmx512m -XX:SurvivorRatio8 -XX:PermSize64m -XX:MaxPermSize128m
2性能指标监控
top命令观察java线程的CPU占用率(us表示用户进程sy表示系统进程) jemeter工具输出的TPS和接口响应时间 jstat -gcutil {pid} {period_time} 输出GC情况 我们根据上述指标监控的情况可以看出目前CPU占用率很高每个CPU上的业务线程都占用了90%以上的CPU时间年轻代GC次数频繁平均每秒钟有8次左右但TPS目前只有400左右。
一开始看到这个情况我们以为是JVM堆内存分配的不足导致GC频繁从而引起CPU的高占用率。所以我们调大了堆内存参数并进行第二次压力测试。
现在我也找了很多测试的朋友做了一个分享技术的交流群共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源没人解答问题坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化性能安全测试开发等等方面有一定建树的技术大牛
分享他们的经验还会分享很多直播讲座和技术沙龙
可以免费学习划重点开源的
qq群号110685036 2、第二次压力测试
1JVM配置
JVM内存分配最大/最小堆内存为2048MBEden和Survivor比例为8:2永久代初始化512MB最大512MB。 JVM配置参数如下 -XX:UseConcMarkSweepGC -XX:UseParNewGC -XX:MaxTenuringThreshold15 -XX:ExplicitGCInvokesConcurrent -XX:CMSParallelRemarkEnabled -Xmx2048m -Xms2048m -Xmn1024m -XX:NewSize640m -XX:MaxNewSize640m -XX:SurvivorRatio8 -XX:PermSize512m -XX:MaxPermSize512m
2性能指标监控
top命令观察java线程的CPU占用率(us表示用户进程sy表示系统进程) jemeter工具输出的TPS和接口响应时间 jstat -gcutil {pid} {period_time} 输出GC情况: 根据上述指标监控的情况可以看出这次JVM参数调整后随着堆内存扩大年轻代GC次数降低了平均每秒有2次左右TPS提高到600左右。但是CPU占用率依然很高且都为业务进程占用。
从这个性能结果来看堆内存的增大可以降低GC频率提高TPS。但CPU占用率几乎没有变化可能的原因预计有两个 第一、业务逻辑中存在耗CPU的计算操作 第二、业务代码存在锁导致大量线程在等待锁。
根据这个猜测我们决定打印出JVM线程快照看下能否找到线程等待锁的相关信息。 jstack -l {pid} /log_dir/stack_log.txt 命令输出线程快照信息到指定的目录文件。 在线程快照文件里查找状态为BLOCKED的线程记录发现出现较多BLOCKED状态的线程是 从线程快照来看大量xml解析线程处于BLOCKED状态xml解析的业务处于阻塞状态降低了接口处理效率。
接着我们把接口代码中其他逻辑代码屏蔽只留下xml解析代码发现CPU占用率依然在90%以上而一旦把xml解析代码屏蔽留下其他业务代码CPU占用率马上降低到了70%TPS上升GC次数下降并保持稳定。
从上面这些处理的结果来看CPU占用率过高的原因跟JVM参数大小没有直接关系而跟xml参数解析有关因为xml参数报文包含十几个节点层级也较多解析后生成的都是比较复杂的大对象。
当设置JVM堆内存偏小时GC频繁会导致业务线程停顿TPS下降最后CPU占用率也低了 当设置JVM堆内存偏大时GC次数下降TPS上升CPU占用率立刻升高到95%以上。
由于我们对xml参数解析使用的是dom4j的方法所以没办法在xml解析上面进行优化只能在JVM参数和并发数上进行处理。
最终为了平衡CPU占用率、TPS、GC三个方面的指标考虑业务实际场景我们设置JVM堆内存为1.5G限制TPS为200。
END今天的分享就到此结束了点赞关注不迷路