getSession耗时过多,导致查询很慢

  • nebula 版本:2.5.1
  • 部署方式:分布式
  • 安装方式: RPM
  • 是否为线上版本:Y
  • 硬件信息
    • 磁盘: SSD
    • CPU、内存信息
  • 问题的具体描述
  • 相关的 meta / storage / graph info 日志信息(尽量使用文本形式方便检索)

getSession耗时过多,导致查询很慢, 甚至有些需要20ms 占据整个查询时间的90%以上,查询时延基本都在1~2ms内,速度较快。如下是查询过程中的log:

{Gql} {查询时延 resp.getLatency()} {getSession耗时} {all cost 全部查询时间}

use beekeeping_risk_control; GO FROM  "12001122610252655822" OVER account_htl_uid |limit 10;resp.getLatency(): 542 ; get session cost 19; all cost :19

use beekeeping_risk_control; GO FROM  "932f2627228bf0fa95ac56cbbb0dad02ca984a7142662345fd418f1813339f5b" OVER mhdnamcdt_htl_mobile |limit 5;resp.getLatency(): 2529 ; get session cost 17; all cost :21

use beekeeping_risk_control; GO FROM  "1839TWP8455" OVER uid_htl_mobile reversely|limit 8;resp.getLatency(): 1445 ; get session cost 28;all cost :31

请问怎么能把连接池获取session这一时间降下来? 目前连接20ms,查询2ms,总体查询太慢,对实时查询影响很大。感谢:pray:

什么客户端 ,具体的版本号多少。然后贴一下硬件配置。

建立连接的动作是比较耗时的,你可以在初始化连接池时就设定minSize, 这样在查询getSession时就会从连接池中直接拿connect然后进行认证。

此外,getSession时会进行一次用户名密码的认证,如果你不是多并发查询,可以就用你拿到的session进行后续查询,不然release 后再次getSession 还是会重新进行认证的。

1 个赞

客户端版本:2.5.1client java

三台机器分布在2个机房
:每台 64 core/ 320GB内存 / 11760GB SSD

尝试后发现,只要getSession就会耗时很多。我这边是一条数据过来多线程查询几种边,我尝试维护一个连接好的池,直接取出来进行执行sql的话,看看是否可以避免由于getSession造成的耗时。

getSession 时会进行用户名密码的认证,这个动作在服务端是加锁的,你多线程情况下是会比较慢的。

也可以在业务层维护一个session池, 使用的时候就不要进行session的release了。

1 个赞

呜呜,解决了 :rofl: 并发查询一跳40ms->4ms暴风感动 ,感谢作者 感谢nebula :sob: 不过这样一直持续使用一个会不会有什么隐患 比如server端重启是否会有影响

你好,我也遇到了类似的问题,请问您后来具体是怎么解决的呢?

在NebulaPool 基础上维护一份已经连接好的Session list反复用

重启服务端的话, 你要确保自己代码里面 getSession时 要给isConnected 参数传一个true。 这样客户端内部会给你做自动的socket重连的。

2 个赞

跨机房部署的话,会大幅影响network性能

不跨机房很难容灾啊 一个机房断电/故障 就全完了

目前生产基本都是跨机房部署 万兆网还行吧

你跨机房的网络延迟至少是5-10ms左右了,对于一个分布式系统而言,对性能的影响太大了。

在2个机房部署两套系统,做sync会比较好。

不是很了解你们机房的情况,在机房内万兆很普遍,但是机房出口也是万兆吗? 即使是万兆,延迟也没法跟同机房内比。

你的性能波动我认为有可能跟跨机房部署有关,如果在本机房内的query还好,有些partition在另一个机房的话性能就会变差

1 个赞

三台机器三副本的情况下每个机器都有完全partition数据吧 不会存在跨机房请求

不过后续加机器的话的确需要考虑这个问题 目前是一个机房2台 一个机房一台 ;之后要加的话应该是变成3+3 两套nebula做同步提供服务 感谢作者 :kissing_heart:

最后好奇下你们机房出口多大,延迟能做到多少 :sweat_smile:

问了下 ,目前我们的这两个机房都在一起 ,没有地理隔离 ,具体数值不清楚。不过目前其他服务也都是跨机房部署满足容灾,两套sync这种,延迟应该没啥大影响。 现在的系统主要得益于正好每台机器都有全部的数据。所以也没啥影响顶多是机器间数据同步的时候跨机房延迟高一点。

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。