Star

nebula入库性能有问题

你好,我们公司的项目中用到了nebula,我负责从kafka读取json数据,经过处理后导入nebula。我选择了改造go-importer作为我们的导入程序,保留了go-importer的整体导入框架和连接池部分。
但是在实际的数据导入过程中遇到了性能问题,经过分析之后,发现瓶颈在连接池执行导入语句的部分,每条语句的导入时间很长,而且我没有预先建立索引。下面是我的nebula机器配置和性能数据:
nebula机器配置:

  • CPU 4核 2.5GHZ

  • 内存 16G

执行的导入数据:
INSERT VERTEX process(pid,pguid,pname) VALUES uuid(“df8a7a79-75f6-4f30-b737-bf0ab632d01f”): (28919,“df8a7a79-75f6-4f30-b737-bf0ab632d01f”,“root”), …,;
每条插入语句共封装了1000条类似的数据,每条插入语句大小为100k左右;
每条语句的执行时间为0.3s,而我们的业务要求每秒10万条的数据,对应到语句执行上每条语句的插入时间要在0.01秒才能满足我们的要求。
麻烦请问如何才能提高入库效率,nebula的入库性能极限是多少呢?

可以尝试直接用spark导入nebula

可以调整一下并发量

  1. 是不是HDD?
  2. 你尝试把uuid换成hash对比下。
  3. 1000条换成100条试试。
  4. 看下你硬盘、CPU、mem util
1赞

我是每个nebula ip建立4个连接来导入数据

1、是机械硬盘;
2、换成hash后每条语句的执行时间缩短到了0.01s左右,快了30倍;
3、换成100之后,每条语句执行时间为0.0015s左右,整体入库速率降低了1/3;
4、cpu和内存情况

总体来看,使用hash后的性能增大了30倍,但是文档上说hash在十亿的数据量级时会有冲突的情况,请问这个有什么方法可以避免么

因为uuid有个读,hdd随机读性能就是悲剧。这个我也没办法了。

你好, hdd随机写的性能本来就很差,如果想用高性能,建议ssd.

我改用ssd的机器试了下,入库反而变慢了,和之前的测试机器相同的配置,每秒执行语句时间增加到1秒左右。
ssd机器的配置如下:
CPU: 40核 2.2GHZ
内存: 126G
硬盘:ssd 1.5T
之前测试的机器配置如下:
CPU:4核 3.4GHZ
内存:16G
硬盘:hdd 1T
下图是ssd的机器上cpu和内存消耗(使用uuid时的storaged进程cpu消耗会到100%,而使用hash时则只有20-30%)


按理说使用ssd会更快,不清楚为啥更慢了,两次测试我都没有建立索引。

uuid的实现方式导致性能就是不太行,随着数据量越大,性能就会越差。
不过为什么反而会变慢我也没法理解,只能猜测和CPU频率的关系比较大(有比较多hash计算部分)。

你好,那看来只能放弃使用uuid了,请问有比hash更快的而且能在分布式下保证vertex id唯一的最佳实践么?

你好,麻烦问下你们文档中说的入库性能能达到50万/s,这个数据有详细的文档描述么

还有就是未来的nebula 2.0版本会支持vid为string类型吗,还是继续是int?

vid是留给应用负责的。

你可以试试sparkwriter,go是给单机用的啊

定长string

导入速率 50w/s 的用例中没有涉及到 hash 和 uuid 的计算,是直接读的整形的 id。string 类型的 vertex id 会在 2.0 的版本中支持,可以关注 nebula 2.0 开源的 repo 一窥究竟。目前是在开发中,还不建议生产环境中试用。

浙ICP备20010487号