Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

高并发下,很多线程卡在UUID.randomUUID上的问题 #504

Closed
e001432124 opened this issue May 19, 2023 · 6 comments
Closed

高并发下,很多线程卡在UUID.randomUUID上的问题 #504

e001432124 opened this issue May 19, 2023 · 6 comments

Comments

@e001432124
Copy link

当前使用版本(必填,否则不予处理)

使用版本:
jdk8
springboot 2.3.2
dynamic-datasource-spring-boot-starter:3.6.1
mybatis-plus-boot-starter:3.5.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

压测过程中,高并发情况下,很多线程卡在UUID.randomUUID这里

重现步骤(如果有就写完整)

报错信息

DubboServerHandler-10.2.129.109:21883-thread-991"#1173 daemon prio=5 os prio=0 tid=0x000
java.lang.Thread.State:BLOCKED (on object monitor)
at sun.security.provider.SecureRandom.engineNextBytes (SecureRandom.java:215)
waiting to lock <0x0000000080a96d00>(a sun.security.provider.SecureRandom)
at java.security.SecureRandom.nextBytes (SecureRandom.java:468)
at iava.util.UUID.randomUUID(UUID.java:145)
at com.baomidou.dynamic.datasource.tx.LocalTxUtil.startTransaction (LocalTxUtil.java
at com.baomidou.dynamic.datasource.tx.TransactionalTemplate.doExecute (Transactional
at com.baomidou.dynamic.datasource.tx.TransactionalTemplate.execute(TransactionalTem
at com.baomidou.dynamic.datasource.aop.DynamicLocalTransactionInterceptor.invoke(Dyn
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMe
at com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor.invoke
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMet
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.jav
at com.sun.proxy.$Proxy258.insertByNewTransaction (Unknown Source)
at com.core.tran.service.aop.command.ServerRecvTranlogCommand.aftExecute(ServerRecvTra
at com.core.tran.service.aop.command.ServerRecvTranlogCommand.aftExecute (ServerRecvTra
at com.core.tran.service.aop.CoreServiceAspect.aftExecute (CoreServiceAspect.java:191)
at com.core.tran.service,aop.CoreServiceAspect.around (CoreServiceAspect.java:149)
at sun.reflect.GeneratedMethodAccessor1308.invoke (Unknown Source)
at sun reflect Delegatingmethodeccessorimnlinvoke(nelenatinnNethodeccessortmol iava:43

@ZeYuYang1024
Copy link

看你的报错信息,出现了阻塞,建议使用ThreahLocal的SecureRandom实例
具体代码如下
`
private static final ThreadLocal random = ThreadLocal.withInitial(SecureRandom::new);

public static UUID fastUUID() {
Random rnd = random.get();
return new UUID(rnd.nextLong(), rnd.nextLong());
}

`

@e001432124
Copy link
Author

意思是我自己去改下at com.baomidou.dynamic.datasource.tx.LocalTxUtil.startTransaction (LocalTxUtil.java
这里的随机数代码 重新实现一下自己获取随机数的逻辑吗 然后自己打mybatis的包?

@topherli
Copy link

环境跟你差不多,高并发测试,运行2个小时后,sql操作严重耗时,mysql的cpu才0.7%,内存5.6%

@topherli
Copy link

环境跟你差不多,高并发测试,运行2个小时后,sql操作严重耗时,mysql的cpu才0.7%,内存5.6%

意思是我自己去改下at com.baomidou.dynamic.datasource.tx.LocalTxUtil.startTransaction (LocalTxUtil.java 这里的随机数代码 重新实现一下自己获取随机数的逻辑吗 然后自己打mybatis的包?

@miemieYaho miemieYaho transferred this issue from baomidou/mybatis-plus May 25, 2023
@huayanYu
Copy link
Member

欢迎各位大佬PR

@ZPZP1
Copy link
Contributor

ZPZP1 commented Jun 7, 2023

问题的原理在这里:https://heapdump.cn/article/4421829。这是UUID的一个bug在高版本的JDK已经修复了,主要是因为高并发下当操作系统中缺少“熵”时,随机数的生成将减慢。当速度变慢时,调用此“java.util.UUID#randomUUID()”API 调用的应用程序线程将被置于 BLOCKED 状态,它们将无法继续前进。使用线程私有的SecureRandom来避免锁竞争

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants