使用JavaClient进行Insert,速度很慢

部署方式:单机部署
机器配置:4c16g
部署版本:3.2.0

在搭建完成后,想刷5000w的数据到Nebula数据库中,验证不同的场景下的查询效率。

搭建了一个测试的springboot项目,提供了一个controller,在controller中使用JavaClient进行Insert数据,通过JMeter配置200个线程一直请求,每个请求只会Insert一条数据,从JMeter中得到的结果:吞吐量在40-50之间徘徊,请求耗时的平均值3s-5s,最大的耗时有十几秒的。

我看了机器的使用情况,内存,CPU,磁盘,都很正常。

现在不明白为什么我的Insert效率这么低,希望能得到各位大佬的帮助。

方便贴一下nebula相关的代码吗

1 个赞

好的,这是拼接nGQL和execute的地方,这样写是否有问题?

           StringBuilder stringBuilder = new StringBuilder();
            //stringBuilder.append("use change_log_space_1;");
            stringBuilder.append("insert vertex ChangeLog(op_user_no,create_time,stage,op_content,pid,op_type,business_id,op_content_text) values");
            stringBuilder.append(" ").append(cid++).append(":(")
                    .append(u).append(",")
                    .append("datetime(").append("'").append(DatePattern.NORM_DATETIME_FORMAT.format(time)).append("'").append(")").append(",")
                    .append("'").append(st).append("'").append(",")
                    .append("'").append(fieldValue).append("'").append(",")
                    .append(pid).append(",")
                    .append(op).append(",")
                    .append("'").append(bizId++).append("'").append(",")
                    .append("'").append(fieldValue).append("'")
                    .append(");");
            String nql = stringBuilder.toString();
            StopWatch stopWatch = new StopWatch();
            stopWatch.start("execute");
            ResultSet resp = session.execute(nql);
            stopWatch.stop();
            System.out.println(stopWatch.prettyPrint(TimeUnit.SECONDS));
            if (stopWatch.getTotalTimeSeconds() > 5) {
                System.out.println("大于5秒" + nql);
            }

补充:springboot是本地启动的,本地机器配置:CPU:Core™ i7,内存:16G

@HarrisChu 大佬帮忙看下呀,一个insert请求耗时3-5s,和你们的测试结果相匹不

可以使用 https://github.com/vesoft-inc/k6-plugin 先看一下插入是不是就这么慢。

另外可以在你压测的过程中,console 里手写一条插入语句,profile 看一下

我会尝试用这个来验证一下,还有其它的地方会影响insert的性能吗

insert 的主要性能,
如果数据量不大 (小于 100G),一个是磁盘 io,一个是网络带宽。

你磁盘是 SSD 的么?

早上在微信群里,已经排除了网络带宽影响,我的磁盘是SSD的

@HarrisChu 你好,我想问下,我看了你发的这个链接,也是一个压测的教程,我理解我现在的压测方式,更贴近我的使用场景,因为我业务场景上,每天都有几百万的数据,需要实时同步到nebula中,本身的开发栈就是Java,所以我现在用Jmeter+JavaClient做这个测试,是比较满足我自身的需求的

从测试的角度,肯定是越少变量越好,用 k6 的意思是先排除其他组件问题,看一下性能是不是真这么查。
你如果有其他方式可以直接压数据库也行,比如用 JMeter 直接调用 Java 的 client。

所以排查的顺序:

  1. 不加任何组件,直接压数据库。
  2. 带着你的业务组件,比如 springboot,压业务组件。

另外,耗时不仅看客户端,也同时看一下服务端返回的 latency

2 个赞

明白你的意思,我这边尝试做下

@HarrisChu 我整理了一下我的测试过程,麻烦大佬空的时候,帮忙看看
Nebula测试.docx (1.2 MB)

@HarrisChu 大佬,还能帮忙看看这个问题吗?

  1. 用 k6 压过么?
  2. 压测的过程中,服务端返回的 latency 是多少?

要么,简化你的代码,然后把全部代码贴上来。
你只贴报告,不知道你代码怎么写的

k6我这边安装有点问题,昨天下午没搞定,如果你有空的话,能不能帮忙看看?

@HarrisChu 你是在efc吗?如果是在efc,我就在你们对面,能不能约个时间,大佬帮忙线下指导一下

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