nebula 并发多的时候 session过多 而导致排队

提问参考模版:

  • nebula 版本:3.4.0
  • 部署方式:分布式
  • 安装方式: RPM
  • 是否上生产环境:N
  • 硬件信息

  • 问题的具体描述
  • 在使用微服务的时候,点击第一次查询速度非常快,点击第二次就开始有延迟反应,并且这个时候在终端查询数据就会一直卡着不给结果。过了一会show sessions 会出现以下

    而后 修改代码 就使用一个session 来完成整个任务 但是session 还是挺多 不过是如下

    对比 会话是没怎么减少 不过基本都是空白的spaceName 不明白这是为什么。
    配置:线程工作数 设置96 因为 服务器核数是48核
    代码 是 nebula-python 最大连接数是10 而且用的 connectionPool
    这种情况下 如何进行修改配置 而提升并查询的性能呢

https://github.com/vesoft-inc/nebula-python/blob/c53a43ed41b246fc63bc781324e6040397ca67d6/nebula3/Config.py#L17C34

这个是 connetion 的 size 哈,如果用 sessionPool 是没关系的,用 session pool 设置这个 sessionpool 的 max size,默认是 30

https://github.com/vesoft-inc/nebula-python/blob/c53a43ed41b246fc63bc781324e6040397ca67d6/nebula3/Config.py#L82

那 SpaceName 是空白的session 表示的是什么 有影响没 怎么设置 才能不会出现那么多呢

session pool 就是这个 pool 里创建好的 session 用完了也不会 release 掉,这样后续的 execute 就不用每次都 auth 了,有一些在那里是符合预期的,只要不是你停止进程的时候没有 gracefully exit去正确释放 session pool 就行。

空白表示没有 use space 的session,你用 console 连进去,不 use space 就可以模拟一个这样的

1 个赞

但是出现的场景就是 刚开始session 就一两个 后来调动微服务 session 就变成三四十个甚至更多 不过 其中有三十多个都是 空白的spaceName 这样正常吗 不正常怎么进行抑制 还有就是 这些空的对于线程工作有影响吗 因为我发现 微服务调动第二次 第三次就开始特别慢 排队时间长

感觉不太正常,session pool 里的session 不会没有 use space

https://github.com/vesoft-inc/nebula-python/blob/c53a43ed41b246fc63bc781324e6040397ca67d6/nebula3/gclient/net/SessionPool.py#L332

可以贴一下你的 app 是怎么用的代码

你说 空白表示没有 use space 的session 用 console 连进去,不 use space 就可以模拟一个这样的
这个我试了 现在出现的是 如果我的studio页面掉了 需要重新进 这个时候就会创建一个空的spaceName 的会话 只要退出页面 重新登录就会有一个空的spaceName会话 这样有什么配置来防止这样吗?

啊,那估计就是 studio 的后端创建了一些 session 造成的哈,可能和你的代码没关系。

你用的什么版本 studio?

studio 和 nebula-console 在连接的时候如果没指定space 或者没用执行use space 好像一直都会有一个SpaceName 为"" 的session

可以把 --session_idle_timeout_secs=600 调短,让空闲的session 尽快过期掉,就不会有那么多了。

1 个赞

3.6.0

一个ip 连接创建一个就行了 但是现在只要掉了或者 重新连接 就会创造一个

不确定你代码怎么写的,如果你没有主动释放session,session 会一直存在,你可以复用(session pool 的原理)。如果没复用 而且又创建了,那么session 会越来越多

@hetao 咱们 studio 3.6.0 应该不会太累计 session 了吧哈?还是之后的版本修复这个问题的哈。

推荐更新到最新的 3.7.x 可能会好一些。

@Reid00 建议Idle 时间短一些的话会更激进地清理 idle session 哈。

如果确定了不是代码没有 release 好 session,问题就不大哈,不用担心

代码 已经由 connectionPool 改成 sessionPool 了 目前测试 因为 代码中 都是一个session 一直用 没有release 现在调用微服务 session 是没有以前那么多 除了 重新登陆studio 或者 console 时 会有一个新的空的session

OK, 那保证 sessionPool max 够用并发就行,

studio 为了支持长任务查询以及多查询,服务端自己维护了一个 sessionpool,会动态创建多个 session,不过空闲的 session 应该会在三秒后自动释放的 @wey

1 个赞

如果不够并发 那么SessionPool 最多能设多少个

我这边创建的空闲的 没有释放 是不是和 空闲释放时间参数有关 因为 还是8小时 我没改

是调用 studio 的服务产生的 session 么,studio 里因查询而创建的 session 一旦空闲 3s 就自动释放了,与其他服务的配置设置参数没啥关系,studio 也管不了 nebula console 产生的 session 哈

不是 我说的是sessionPool 里面的 默认是30个 如果并发太高 那这个连接池 最大能接受多少个 有没有个计算方式 或者比例啥的