没有合适的资源?快使用搜索试试~ 我知道了~
JAVA下单接口优化实战TPS性能提高10倍
15 下载量 194 浏览量
2020-08-26
15:55:34
上传
评论
收藏 128KB PDF 举报
温馨提示


试读
2页
今天小编就为大家分享一篇关于JAVA下单接口优化实战TPS性能提高10倍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
资源推荐
资源详情
资源评论














JAVA下单接口优化实战下单接口优化实战TPS性能提高性能提高10倍倍
今天小编就为大家分享一篇关于JAVA下单接口优化实战TPS性能提高10倍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看
看吧
概述概述
最近公司的下单接口有些慢,老板担心无法支撑双11,想让我优化一把,但是前提是不允许大改,因为下单接口太复杂了,如果改动太大,怕有风险。另外开发成本和测试成本也非常大。对于这
种有挑战性的任务,我向来是非常喜欢的,因为在解决问题的过程中,可以学习到很多东西。
当时我只是知道下单接口慢,但是没人告诉我慢在哪里,也即是说,哪些瓶颈导致下单接口慢了。其实没人知道也没关系的,因为我们可以通过压测来找到具体的瓶颈。
下面会详细介绍一下,在本次压测中遇到的问题以及如何解决,期间用了什么工具。
用到的工具和环境用到的工具和环境
工具工具
Jmeter
JAVA自带的jvisualvm
JMX
nmon
环境环境
腾讯云Mysql
腾讯云2核4g的服务器1台
找瓶颈找瓶颈
下单属于写接口,大部分情况下,瓶颈都出在DB里,程序可能都在等待DB锁的释放。为了验证这个想法,我们可以使用Jmeter和jvisualvm来验证一下。
为了监控服务器和服务器中JAVA进程,我们需要开启JMX,可以在JAVA进程启动的时候,添加如下几个参数:
JMX_OPTS="-Dcom.sun.management.jmxremote.port=7969 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=xx.xx.xx.xx"
nohup java ${JMX_OPTS} -jar xxxxx.jar
Djava.rmi.server.hostname填写JAVA进程所在服务器的IP地址,-Dcom.sun.management.jmxremote.port=7969是指定JMX监控端口的,这里是7969。
重新启动进程后,打开本地的(我用的是Window10)jvisualvm,添加JMX配置。配置成功后,可以点击线程那个tab,因为我们要做线程dump,观察线程的执行情况。
好了,现在我们可以使用Jmeter来对下单接口进行压测了。可以先用50线程并发压,执行时间是1分钟。
在压测的过程中,做一下线程dump,同时利用nmon观察应用服务器CPU的负载情况。
负载很低,将线程并发调整到100后,CPU还是上不去,这样的话,初步可以判断,代码里有锁。
通过观察dump文件,发现如下信息:
- locked <22f6e7f3> (a com.mysql.cj.core.io.ReadAheadInputStream)
- at com.sun.proxy.$Proxy231.reduceSkuStock(Unknown Source)
触发这个lock的业务代码是reduceSkuStock方法。通过阅读代码,发现reduceSkuStock被包在一个大事务里面。
@Transactional(rollbackFor = {Exception.class})
createOrder() {
//1、扣减库存
reduceSkuStock();
//2、创建订单
insertOrder();
//3、其他写操作
。。。。
}
库存记录通常存在一张独立的库存表,由于创建订单的方法,是一个大事务,这样就会导致某条库存记录只有当整个createorder()方法执行完后,数据库行锁才会被释放,在这个期间,其他线程是无
法对这条库存记录进行写操作的。因此我们可以在reduceSkuStock()中,再开一个事务,操作完这条库存记录后,赶紧释放锁,这样应该可以提高一些性能。为了验证是否是因为事务的原因导致下单
接口慢,我们可以直接将createOrder()方法的事务去掉,再压测一下。
压测结果发现,下单接口的TPS提高了一倍,CPU也上去了不少,但是仍然不够理想,代码里,应该还有其他的锁。再次做线程dump,又发现了一个锁。
- locked <438be230> (a org.apache.http.pool.AbstractConnPool$2)
- at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
导致锁的代码是HttpClient的execute方法,该方法在执行的时候,一直在等待获取HTTP连接,通过查看源代码,发现居然没有使用连接池,醉了。赶紧加上如下代码:
PoolingHttpClientConnectionManager pool = new PoolingHttpClientConnectionManager();
资源评论


weixin_38715879
- 粉丝: 4
- 资源: 922
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
