[摘要:1.题目描绘 我们正在对5个dubbo接心并收举行测试,统共线程数是64个,一直的挪用那些接心。视察到的非常浮现是TPS动摇较大,时下时低。 我们视察线程的运转状态是如许]
1.问题描述
我们在对5个dubbo接口并发进行测试,总共线程数是64个,不停的调用这些接口。观察到的异常显现是TPS波动较大,时高时低。
我们观察线程的运行状况是这样的:
上图红色部分是线程阻塞的情况。
我们查看线程栈的信息发现有20多个用户线程处于Blocked状态,blocked状态的代码如下:
"DubboServerHandler-192.168.183.17:20880-thread-200" daemon prio=10 tid=0x00007fc0e802b800 nid=0x6a8f waiting for monitor entry [0x00007fbf25bda000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.jd.com.caucho.hessian.io.SerializerFactory.getSerializer(SerializerFactory.java:164)
- locked <0x00000000c35af008> (a java.util.HashMap)
at com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:406)
at com. alibaba.com.caucho.hessian.io.CollectionSerializer.writeObject(CollectionSerializer.java:102)
at com. alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:408)
at com. alibaba.com.caucho.hessian.io.JavaSerializer$FieldSerializer.serialize(JavaSerializer.java:313)
这说明如果该服务在该并发下还是会出现用户线程阻塞在代码
at com.alibaba.com.caucho.hessian.io.SerializerFactory.getSerializer(SerializerFactory.java:164)处的情况,对于服务的稳定性和TPS都会造成一定的影响。
2.问题分析
根据上述日志的分析,我们定位到了线程锁部分的代码,我们打开该代码如下所示:
if (_cachedSerializerMap != null) {
synchronized (_cachedSerializerMap) {
serializer = (Serializer) _cachedSerializerMap.get(cl);
}
可以看到此处使用了HashMap,在并发读写map的代码的地方都添加了synchronized 关键字。而本问题也就是在该处BLOCKED了。如果并发较大的时候,线程释放锁的速度赶不上线程争夺资源的速度就会导致用户线程的锁定。
3.优化方案
在高并发的场景下,Hashmap+synchronized的锁的粒度太大,直接锁定了整个HashMap对象,那么我们可以用 ConcurrentHashMap来降低锁的粒度,这样并发处理能力就能够增强。
我在搜索类SerializerFactory的时候,也正好搜索到了hessian-4.0.7.jar中也有这个类,应该是dubbo从hessian里移植过来的另一个类。在这个版本里它就将HashMap替换为ConcurrentHashMap,
它替换之后的代码是这样的:
private ConcurrentHashMap _cachedSerializerMap;
private ConcurrentHashMap _cachedDeserializerMap;
Serializer serializer;
if (_cachedSerializerMap != null) {
serializer = (Serializer) _cachedSerializerMap.get(cl);
if (serializer != null)
return serializer;
}
它的区别就是使用ConcurrentHashMap ,去除了synchronized 关键字。
接下来我们也做这样的修改,替换jar包之后,再对服务进行一次压测,结果如下:
1.线程中无Blocked状态的用户线程。
2.TPS更加稳定。
TPS变得更加稳定,没有较大的波动。
从测试来看这种优化之后是有实际效果的,dubbo服务的并发能力明显增强了许多。
总结:
对于并发较高的dubbo服务,若希望提高并发处理能力,则应该做这样的优化。
摘自:http://www.ithao123.cn/content-8941250.html
分享到:
相关推荐
dubbo-hessian协议http请求demo
dubbo源码依赖hessian_lite,可以使用mvn install命令将jar包安装到本地的maven仓库
虽然阿里已经给我们打包好了核心框架的jar包,但在实际开发过程中,核心框架、管理控制台、简易监控中心、简易注册中心可能我们都需要用到,而且业务需求可能要修改dubbo源码,再次打包。基于以上原因我们需要构建...
整合 Dubbo + SpringMvc 4.3.1 的服务器maven工程样例,使用注解方式定义服务及IOC装配,采用Hessian协议传输 三个工程,在 cnetAdmin 和 cnetBlu 中,要引用 cnetCommon 工程。
dubbo源码编译时依赖的hessian-lite,由于阿里对部分链接的屏蔽无法解决这个依赖,所以需要用户先下载然后mvn install到本地来解决依赖问题
Dubbo依赖的RPC模式学习,RMI和Hessian
默认就是⾛ dubbo 协议,单⼀⻓连接,进⾏的是 NIO 异步通信,基于 hessian 作为序列化协议。使⽤的场景是:传输数据量⼩ (每次请求在 100kb 以内),但是并发量很⾼。 为了要⽀持⾼并发场景,⼀般是服务提供者就⼏...
Hessian Lite(Apache Dubbo专用版) Hessian-lite最初是的Apache dubbo嵌入版本。 然后,此模块与Dubbo分离。 所有分支:2.5.x,2.6.x(自2.6.3起)和2.7.x都依赖于它,请查看详细信息: 现在,我们正在尝试建立一...
java运行依赖jar包
Dubbo分布式服务架构,对于研究大型Web服务器的并发技术的同学们有帮助。
dubbo服务并发控制(executes),连接控制(accepts),路由规则测试,服务降级。 具体请参考:https://dubbo.gitbooks.io/dubbo-user-book/
nodejs 使用原生的 dubbo (dubbo head hessian body) 协议打通了 dubbo 的 rpc 方法调用 .
基于SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统 基于SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统 基于SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统 基于SpringBoot+...
SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统.zipSpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统.zipSpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统.zipSpringBoot+Zookeeper+Dubbo...
Dubbo 支持哪些协议,每种协议的应用场景,优缺点? dubbo: 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用, 以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化; rmi: 采用 JDK ...
需要安装zookeeper,默认端口,即可。 provider:运行RestProvider的main方法即可。 consumer:运行RestConsumer的main方法,在控制台,回车即可发一笔请求。
dubbo 服务提供方和服务消费方的代码
由于Dubbo将这些协议的实现进行了封装了,无论是服务端(开发服务)还是客户端(调用服务),都不需要关心协议的细节,只需要在配置中指定使用的协议即可,从而保证了服务提供方与服务消费方之间的透明。 另外,如果...
本套视频从分布式系统的基本概念出发,由浅入深,讲解了RPC原理,Dubbo基本使用,Dubbo高可用场景以及Dubbo原理,涉及了分布式系统中服务注册、服务发现、负载均衡、灰度发布、集群容错、服务降级等核心概念的讲解及...