大佬们,请教一下关于 JDK-8075484 这个 bug 的问题

264 天前
 Lighfer

背景

近期用户的生产环境下遇到一个很神奇的问题,并发数起来( 7 个 pod ,1000 并发)访问就会很慢,同一个接口有时候 300 多 ms ,有时候七八秒,数据库(华为 GaussDB ,基于 PG )。 用 arthas 跟了一下,发现慢在 org.postgresql.core.PGStream.receiveChar(),即使是一条简单的select 'x'有时候都能执行一两秒。 数据库那边反馈是 SQL 执行都很快,网络也排查过没问题(华为驻场工程师排查)。

疑问

然后从psjdbc项目找到下面这个 issue 里面有人提到 JDK-8075484 和我们遇到的问题比较能对上,jstack 看到了最终都是卡在at java.net.SocketInputStream.socketRead0 但是网上查到的关于 jdk 这个 bug 说的都是直接卡,我们遇到的情况是偶尔慢,但不会卡住不返回

求助

找了一天多了没有其他思路来排查这个问题了,想请教以下两个问题:

  1. JDK-8075484 这个 bug 是否有老哥遇到过是慢而不是卡住?
  2. 各位老哥有什么思路可以继续排查吗?

环境信息

系统:华为欧拉 CPU:32 核 aarch64 ,生产环境 CPU 压力很小 内存:64G 网络:万兆

压测时 vmstat 可以看到 in 和 cs 都在 4w~6w ,pidstat 可以看到都是我们的服务线程产生的

为什么不直接换 JDK 验证

因为客户的生产环境用的华为平台,我们是上传 jar 吧,平台自动成容器镜像运行,华为的驻场工程师明确说了改不到 jdk 的版本。

https://i.imgur.com/Z4l37Go.jpg

https://i.imgur.com/tYdUjym.jpg

2143 次点击
所在节点    Java
12 条回复
devopsdogdog
264 天前
1. 数据库最大连接数?
2. 单机的话,网络参数是否有调优
3. 驻场的话 不要信。开个 1 两天 慢 sql 记录 ,对吧程序和数据库的执行时间
devopsdogdog
264 天前
补一点 k8s dns 解析慢导致。
impossibleshen
264 天前
华为驻场的话不要信,自己记录一下,多半是华为的问题;
以前信创还遇到过用华为 os 莫名其妙杀进程,换成 debain 屁事儿没有,稳定运行
nothingistrue
264 天前
具体情况不是很了解。但并发量起来后才变慢、变慢但是最终会完成、跟踪到执行 SQL 阶段慢的背景,看起来很像是数据库单点阻塞,应该先从数据库那里找问题。此外,这里是用 PG 的 JDBC 驱动去连接 PG 的衍生数据库,JDBC 驱动兼容性上也可能有问题。
nothingistrue
264 天前
可以先写个脚本,用 GaussDB 的原生连接方式,高并发的去 select 'x' ,比较一下用 PG JDBC 驱动连接方式高并发 select 'x' 的情况。如果一样,那就只是数据库的问题,交给华为去处理。如果明显不一样,那就很有可能是 JDBC 驱动的问题,还是交给华为去处理,因为 JDBC 驱动是数据库厂商负责的。
sujin190
264 天前
如果 jdk 的 Socket 有 bug 那么你 http 请求也会有问题吧,搞个没数据库的查询监控下就能知道吧,如果只是数据库查询有问题 http 请求没问题那很大概率就不是 jdk 的问题了,看你这个是卡在了最底层的 socket read 了,那么要么就是真的数据库查询慢,或者就是网络配置有问题了,但如果网络配置有问题提的话一般就算低谷是并发不高也会偶现的,不会只在并发高时出现吧,这个也监控分析下看看呗

话说虽然不能改 jdk 版本,但是 postgresql 的 driver 应该项目引入的吧,或许也可以升级新版本试试,你刚才提到的那个 issue 用的是 42.2.5 落后不少版本了

@devopsdogdog #2 socket connect 已经连接成功的话就不是 dns 的问题了
Lighfer
264 天前
@devopsdogdog 感谢老哥提供思路,数据库连接数很足,目前根据 arthas 已经确定就是 sql 发出去等响应这个过程慢,操作系统的东西我们没有权限改,所以就很尴尬,驻场是让他们当场抓慢 SQL 的,他们说没有,虽然我也还是怀疑= =
Lighfer
264 天前
@nothingistrue 感谢老哥提供思路,我们正在出 demo 了,看看能不能稳定复现
Lighfer
264 天前
@sujin190 感谢老哥,http 请求我们也想办法监控一下,之前没没有联想到如果是 jdk 的问题,http 也应该一起慢
Pantheoon
264 天前
大概率 GaussDB 的 bug
arloor
264 天前
@Lighfer jdbc 用的 socket 是 java.net 包下的 BIO ,验证 HTTP 的时候,要看下是不是用 BIO ,如果用的 NIO 的 SocketChannel 那种就不是一回事了。
Lighfer
264 天前
@devopsdogdog
@impossibleshen
@nothingistrue
@sujin190
@Pantheoon
@arloor
感谢各位老哥帮助,已经确定不是程序问题也不是 jdk 的问题了,目前在华为的环境下可以稳定复现每隔 63.8 秒左右就一定会有出现数据库查询慢,即使是简单的 select 1 也是,即使不使用 java 而是其他数据库工具也会,具体是高斯数据库的问题还是他们私有云平台的问题就让他们排查去了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/980834

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX