8年经验之谈 —— 记一次接口压力测试与性能调优!

经验总结

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核8G,50G普通硬盘,并且处于同一个内网网段,我们预估的性能指标要达到200并发,500TPS。
在压力测试过程中,我们重点关注TPS、GC次数、CPU占用率和接口响应时间等指标。

二、测试过程

完成项目部署后,我们开始编辑jemeter测试脚本,设置压力测试的标准为200个并发线程,在10秒内全部启动,持续压测时间15分钟,接着开始启动jemeter脚本进行测试。

1、第一次压力测试

(1)JVM配置

垃圾收集策略包括:老年代启用CMS垃圾收集算法,新生代启用ParNew垃圾收集算法,新生代最大存活周期为15次minorGC,FullGC时使用CMS算法,并开启CMS中的并行标记。

JVM内存分配:最大/最小堆内存为512MB,Eden和Survivor比例为8:2,永久代初始化64MB,最大128MB。

JVM配置参数如下:
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+ExplicitGCInvokesConcurrent
-XX:+CMSParallelRemarkEnabled -Xms512m -Xmx512m -XX:SurvivorRatio=8 -XX:PermSize=64m -XX:MaxPermSize=128m

(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、第二次压力测试

(1)JVM配置

JVM内存分配:最大/最小堆内存为2048MB,Eden和Survivor比例为8:2,永久代初始化512MB,最大512MB。
JVM配置参数如下:
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+ExplicitGCInvokesConcurrent
-XX:+CMSParallelRemarkEnabled -Xmx2048m -Xms2048m -Xmn1024m -XX:NewSize=640m -XX:MaxNewSize=640m
-XX:SurvivorRatio=8 -XX:PermSize=512m -XX:MaxPermSize=512m

(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今天的分享就到此结束了,点赞关注不迷路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/142250.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

P6入门:项目初始化5-项目支出计划Spending Plan

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

JAVA弑神大阵之装饰者大阵

架构说明 构成简述: 总接口: 装饰者跟被装饰者都要来实现他(或者理解成父接口),作用:对被装饰者做转换 被装饰者: 此处实现总接口。什么都不需要动,他只是被增强的功能&#xff0…

Python 框架学习 Django篇 (十) Redis 缓存

开发服务器系统的时候,程序的性能是至关重要的。经过我们前面框架的学习,得知一个请求的处理基本分为接受http请求、数据库处理、返回json数据,而这3个部分中就属链接数据库请求的响应速度最慢,因为数据库操作涉及到数据库服务处理…

算法笔记-贪心1

算法笔记-贪心 什么是贪心算法分配饼干例题理解二分割字符串最优装箱整数配对最大组合整数分配区间问题买股票的最佳时机区间选点 问题什么是贪心算法 分配饼干例题 //贪心算法 //保证局部最优,从而使最后得到的结果是全局最优的 #include<iostream> #include<a…

微前端时代:打造高效、灵活的前端开发体系

❝ 本篇文章全文约 1.5 万字&#xff0c;目的是系统化地介绍微前端及其核心技术&#xff0c;并介绍了什么是微前端以及为什么我们需要它。我们还讨论了在众多微前端框架中如何选择适合自己系统的框架&#xff0c;并分享了一些业界使用微前端的实践案例。最后&#xff0c;我们提…

LeetCode(11)H 指数【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 274. H 指数 1.题目 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &a…

注册并实名认证华为开发者账号流程

文 | Promise Sun 1. 打开华为开发者网址&#xff1a; https://www.harmonyos.com 2.注册华为开发者账号&#xff1a; 1&#xff09;注册时可以选择手机号或者邮箱两种方式注册&#xff0c;建议选择手机号注册。 2&#xff09;根据提示填写信息注册即可。 3.开发者实名认证&am…

STM32与RTOS的整合:实时操作系统在嵌入式开发中的应用

随着各种嵌入式系统应用的日益复杂和对实时性要求的提高&#xff0c;使用实时操作系统&#xff08;RTOS&#xff09;成为嵌入式开发中的一种重要选择。STM32微控制器作为一种强大的嵌入式处理器&#xff0c;与各种RTOS相结合&#xff0c;能够提供更高效、可靠并且易于维护的系统…

nodejs+vue+python+PHP+微信小程序-安卓-房产中介管理信息系统的设计与实现-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

(只需三步)Vmvare tools安装教程,实现与windows互通复制粘贴与文件拖拽

首先确保Ubuntu是联网的&#xff0c;如果连不上网可以参考我的这个联网教程&#xff0c;也很简单 &#xff08;只需三步&#xff09;虚拟机上vm的ubuntu不能联上网怎么办-CSDN博客 第一步&#xff1a;卸载之前的tools,确保没有残留 sudo apt-get autoremove open-vm-tools 第…

多态

文章目录 多态概述多态的实现多态的特点多态的转型重写什么是重写重写示例 重载和重写的区别 面向对象三大特性&#xff1a;封装、继承、多态。 封装隐藏了类的内部实现机制&#xff0c;可以在不影响使用的情况下改变类的内部结构&#xff0c;同时也保护了数据。对外界而已它的…

机器视觉行业,日子不过了吗?都进入打折潮,双11只是一个借口,打广告出新招,日子不好过是真的

我就不上图了&#xff0c;大家注意各个机器视觉公司公众号&#xff0c;为什么打折&#xff1f;打广告也只是宣传手段&#xff0c;进入打折潮&#xff0c;内卷严重&#xff0c;价格战变成白刃战&#xff0c;肯定日子不好过了。

蓝桥杯第三场双周赛(AK)

题目非常典型&#xff0c;很适合学算法。 1111 第 3 场算法双周赛 - 蓝桥云课 双十一的祈祷 题意&#xff1a;求的个位数。 思路&#xff1a;只需要求个位数&#xff0c;因此此题等效于求 ,可用快速幂或者直接看出为1。 #include <bits/stdc.h> using namespace std; …

c语言-数据结构-链表分割

链表分割实际上是给定一个值&#xff0c;遍历链表把链表中小于该值的节点与大于该值的节点分开&#xff0c;一般是将小于该值的节点放到链表的前面部分&#xff0c;大于该值的节点放在链表的后面部分。 链表分割示意图如下&#xff1a; 思路&#xff1a; 首先创建两条带哨兵位节…

酷开系统 | 酷开科技:打造精彩纷呈的电影盛宴

对于许多人来说&#xff0c;观看电影是一种享受、一种放松、一种逃避现实的方式。而现在&#xff0c;酷开科技作为行业内领军企业&#xff0c;为我们带来了一种全新的居家观影体验&#xff0c;让电影不仅是一种娱乐方式&#xff0c;更是科技的展现。 酷开科技致力于为观众带来…

Java Stream 的常用API

Java Stream 的常用API 遍历&#xff08;forEach&#xff09; package com.liudashuai;import java.util.ArrayList; import java.util.List;public class Test {public static void main(String[] args) {List<Person> userList new ArrayList<>();userList.ad…

数据可视化模板案例:制造业提高生产力的关键

一、模板背景 在这个信息爆炸的时代&#xff0c;数据对于企业的成功至关重要。制造业作为全球经济的重要组成部分&#xff0c;如何有效利用数据提高生产效率、降低成本、优化决策&#xff0c;已成为行业关注的焦点。 二、方案思路 配⾊ - 科技蓝&#xff0c;贴合⼯业主题。 …

RDkit | 安装报错及使用

关于RDKit的学习及介绍&#xff1a; RDKit安装 基础教程&#xff1a;[Getting Started with RDKit in Python] RDkit四&#xff1a;数据处理过程中smiles编码的清洗统一化 reticulate-R Interface to Python 在RStudio中加载 rdkit.Chem和rdkit.Chem.rdmolops 时&#xff0c;报…

Linux 本地zabbix结合内网穿透工具实现安全远程访问浏览器

前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 本地zabbix web管理界面限制在只能局域…

Android R.fraction

来源 我是在看Android10原生代码&#xff0c;绘制状态栏蓝牙电量相关类中第一次看到R.fraction的&#xff0c;如类BatteryMeterDrawable <fraction name"battery_button_height_fraction">10%</fraction> mButtonHeightFraction context.getResources(…