高并发执行FIND PATH语句,Storage服务崩溃。

提问参考模版:
nebula 版本:v2.6.2
部署方式:分布式
安装方式:容器
是否为线上版本:Y
硬件信息
磁盘( 推荐使用 SSD)SSD

并发量在100 情况下,执行FIND NOLOOP PATH FROM *** TO *** OVER **** BIDIRECT UPTO 4 STEPS | LIMIT 200 storage多次复现以下问题:

代码 / 终端输出 / 日志…
*** Aborted at 1669627289 (Unix time, try 'date -d @1669627289') ***
*** Signal 11 (SIGSEGV) (0x0) received by PID 1 (pthread TID 0x7fdc90bff700) (linux TID 157) (code: 128), stack trace: ***
/usr/local/nebula/bin/nebula-storaged(_ZN5folly10symbolizer17getStackTraceSafeEPmm+0x31)[0x214c2c1]
/usr/local/nebula/bin/nebula-storaged(_ZN5folly10symbolizer21SafeStackTracePrinter15printStackTraceEb+0x1b)[0x214412b]
/usr/local/nebula/bin/nebula-storaged[0x2142467]
/lib64/libpthread.so.0(+0xf62f)[0x7fdcdb59f62f]
/lib64/libc.so.6(abort+0x297)[0x7fdcdb1f9bc7]
/usr/local/nebula/bin/nebula-storaged(_ZN6google10LogMessage4FailEv+0xc)[0x217c38c]
/usr/local/nebula/bin/nebula-storaged(_ZN6google10LogMessage9SendToLogEv+0x235)[0x2181165]
/usr/local/nebula/bin/nebula-storaged(_ZN6google10LogMessage5FlushEv+0xbd)[0x217c05d]
/usr/local/nebula/bin/nebula-storaged(_ZN6google15LogMessageFatalD1Ev+0x8)[0x217c8b8]
/usr/local/nebula/bin/nebula-storaged(_ZNK6nebula5Value6getStrB5cxx11Ev+0x6f)[0x185301f]
/usr/local/nebula/bin/nebula-storaged(_ZN6nebula7storage21GetNeighborsProcessor17runInSingleThreadERKNS0_4cpp219GetNeighborsRequestElb+0x98e)[0xfd6f9e]
/usr/local/nebula/bin/nebula-storaged(_ZN6nebula7storage21GetNeighborsProcessor9doProcessERKNS0_4cpp219GetNeighborsRequestE+0x37c)[0xfd910c]
/usr/local/nebula/bin/nebula-storaged(_ZTv0_n32_N6apache6thrift11concurrency14FunctionRunner3runEv+0x96)[0x1d345d6]
/usr/local/nebula/bin/nebula-storaged(_ZN6apache6thrift11concurrency13ThreadManager4Impl6Worker3runEv+0x152)[0x1e65722]
/usr/local/nebula/bin/nebula-storaged(_ZN6apache6thrift11concurrency13PthreadThread10threadMainEPv+0xcc)[0x1e6937c]
/lib64/libpthread.so.0(+0x7ea4)[0x7fdcdb597ea4]
/lib64/libc.so.6(clone+0x6c)[0x7fdcdb2c0b0c]
(safe mode, symbolizer not available)

什么数据集可以帮助我们复现?

私有数据集,不太方便提供给你们。

因为2.6.2 社区版默认已经不在维护了。
能否试一下3.3的版本?如果数据量不大的话可以重新导入一下。
或者大致什么样的数据集?类似twitter2010?一定要大并发嘛?还是大query就可以。
这样方便我们对这个问题复现和增加case。

换版本可能不行;数据集比较简单,就类似于记录同行人之间的关系;并发要求不是特别高,大query查询时延要求比较高一些。

E1128 19:28:18.800129 78 QueryInstance.cpp:108] Used memory hits the high watermark(0.800000) of total system memory.
E1128 19:28:19.301630 60 QueryInstance.cpp:108] Used memory hits the high watermark(0.800000) of total system memory.
E1128 19:28:22.394899 57 QueryInstance.cpp:108] N5folly13BrokenPromiseE: Broken promise for type name nebula::Status
E1128 19:28:23.391170 48 QueryInstance.cpp:108] N5folly13BrokenPromiseE: Broken promise for type name nebula::Status

graphd服务也会崩溃

刚刚翻看了这段代码的历史,应该是已经修改,我去找修改的作者确认下修改原因。

请问有结论了吗?

找修改的人确认了下,这个逻辑似乎是计算层保证下发请求都是str()类型的,没复现场景的情况下暂时不太好确定为什么出现这种异常。

你部署的版本都是一致的吗?space vid类型呢?至于水位这个,你可以稍微放松水位阈值来试试。

vid 是string类型;
还有想请问一下,我如果想提升FIND PATH语句的查询效率,减低查询时间可以通过增加节点来实现吗?我现在测了几轮,通过增加graph节点的cpu核数只能增加集群语句并发处理能力,但单条语句的最优性能并没有增加,请问我可以通过什么方式可以提升集群数据查询性能?

单条语句的瓶颈不在cpu,不是很好通过配置改变的方式提升。
但是最近版本对单条语句的优化会有一定提升,你可以看看新版本的性能测试。

因为业务使用的比较多,升级不是很容易。单条语句的瓶颈在哪那?增加storage节点可以提高语句的查询性能吗?

视情况,数据量较大的时候一般瓶颈在于计算端的一些开销和计算,这部分之前并行化不好,所以增加cpu也很难提升,具体可以使用profile查看一下耗时都在哪里。


主要集中在这一步,有什么优化的建议吗?

这个算子在构建路径, 确实比较费时间的.

基于k8s部署的nebula集群,有升级方案吗?

你好,目前operator不支持2.x直接升级到3.x,具体的版本对应关系可以参考 什么是 Nebula Operator - Nebula Graph Database 手册

你们建议升级,有没有升级方案,那是不是说原来的版本就没办法升级到新版本了

如果想从升级2.x到3.x,可以参考下这篇文档哈 升级 NebulaGraph 版本 - NebulaGraph Database 手册