文档章节

dubbo服务中的hessian序列化工厂使用hashmap加锁在高并发场景下的问题

杨武兵
 杨武兵
发布于 2015/06/12 17:30
字数 696
阅读 1.7K
收藏 5

精选30+云产品,助力企业轻松上云!>>>

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服务,若希望提高并发处理能力,则应该做这样的优化。

杨武兵

杨武兵

粉丝 292
博文 61
码字总数 123254
作品 1
昌平
架构师
私信 提问
加载中
此博客有 2 条评论,请先登录后再查看。
dubbo接口调用过程中,部分字段值丢失

在工作中,遇到了调用远程dubbo接口,字段值丢失的情况。排查后,发现调用前后的代码无误,主要原因是在接口调用时使用hessian序列化,出现了子类与父类重复字段,导致字段值丢失。 解决办法...

请把小熊还给我_m
2019/10/31
111
2
Dubbo 序列化协议 5 连问,你接得住不?

来源 | www.toutiao.com/i6745361206137061895/ 1)dubbo 支持哪些通信协议? 2)支持哪些序列化协议? 3)说一下 Hessian 的数据结构? 4)PB 知道吗? 5)为什么 PB 的效率是最高的? 面试...

JAVA葵花宝典
05/23
0
0
Dubbo 支持哪些序列化协议?

面试题 dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的? 面试官心理分析 上一个问题,说说 dubbo 的基本工作原理,那是你必...

osc_apxdqf08
2019/04/22
3
0
Dubbo 支持哪些序列化协议?

面试题 dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的? 面试官心理分析 上一个问题,说说 dubbo 的基本工作原理,那是你必...

深山老猿
06/05
8
0
Dubbo 序列化协议 5 连问,你接得住不?

作者:yanglbme,来源:https://dwz.cn/ZE2O4lHu 1)dubbo 支持哪些通信协议? 2)支持哪些序列化协议? 3)说一下 Hessian 的数据结构? 4)PB 知道吗? 5)为什么 PB 的效率是最高的? 面试...

Java技术栈
04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MetadataException:无法加载指定的元数据资源 - MetadataException: Unable to load the specified metadata resource

问题: All of a sudden I keep getting a MetadataException on instantiating my generated ObjectContext class. 突然间,我在实例化生成的ObjectContext类时不断收到MetadataException 。......

fyin1314
今天
8
0
如何使用Java获取当前日期/时间 - How to get the current date/time in Java

问题: 用Java获取当前日期/时间的最佳方法是什么? 解决方案: 参考一: https://stackoom.com/question/LiRU/如何使用Java获取当前日期-时间 参考二: https://oldbug.net/q/LiRU/How-to-g...

富含淀粉
今天
14
0
SUSE收购Rancher Labs:押注云原生市场

导读:Gartner预测,到2024年,成熟的经济体中采用云原生应用程序和基础架构将使容器管理的使用率超过75%的大型企业,而2020年还不到35%。 7月8日,全球最大的独立开源公司SUSE获得收购Ran...

开源村OSV
今天
19
0
一文看尽飞桨PaddlePaddle最新升级:5大优势,更低门槛使用深度学习

本文作者:杨蕊1002 飞桨(PaddlePaddle)是国内唯一功能完备的端到端开源深度学习平台,集深度学习训练和预测框架、模型库、工具组件、服务平台为一体,其兼具灵活和效率的开发机制、工业级...

百度开发者中心
2019/07/17
16
0
Emacs和Vim之间的差异 - Differences between Emacs and Vim

问题: Without getting into a religious argument about why one is better than the other, what are the practical differences between Emacs and Vim? 在没有就为什么一个比另一个更好......

法国红酒甜
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部