这是由社区用户——繁凡撰写的一篇他的实践分享,主要讲解如何进行 Nebula 性能测试以及数据导入部分的性能调优。下文中出现的“我”代指用户繁凡。

0. 概要

之前在做 Nebula 的调研工作,然后又针对使用上做了性能测试,期间多次请教了 Nebula 的官方人员,在这里对官方人员表示感谢,大佬辛苦了!

我把自己测试的过程整理一下,希望对大家有一点启发,如果大家有更好的意见,请不吝赐教!

1.部署 Nebula 集群

首先准备了 4 台实体机:1、2、3、4,每台配置,CPU:96C,内存:512G, 磁盘:SSD。机子分配:

  • 1:meta,storage
  • 2:storage
  • 3:storage
  • 4:graphd

安装过程就不再详述了,使用的是 rpm 的方式。其他插件:nebula-import-2.0,nebula-bench-2.0,下载源码编译即可,安装在 4 节点。

2.导入数据

本次导入的数据数据结构为 7 种点类型、15 种边类型,数据量并不大,结构也很简单,数据量总计 3400w,不过要提前处理成这么多个点边表。

先创建 space,设置 vid=100 ,replica_factor=3,partition_num=100。

nebula-importer 数据导入优化

使用 nebula-importer 进行导入,直接开干,速度只有 3w/s 的样子,这也太慢了吧。查看import的文档,整个使用的参数也就只有concurrencychannelBufferSizebatchsize

先调整一下试试吧,随便改了改,效果并不明显, 发帖请教大佬了。详见论坛帖子 nebula-import 2.0 导入速度太慢,请教完之后,收获很大,先改 yaml 参数

concurrency:96 # cpu核数
channelBufferSize:20000
batchsize:2500

速度差不多 7-8w 了,嗯,看起来确实快了很多,再搞大点,graphd 直接崩掉了,看来还是不能过大,所以这几个参数要尽量大但是不能过大

然后再确认下磁盘和网络,竟然用的是机械磁盘和千 M 网络。。。改成SSD的,然后再切换成万 M 网络,速度直接再提升一倍多,大概 17w/s,看起来硬件还是很重要。

然后我再想会不会跟数据有关系,注意到 vid 和partition_num,vid 挺长的想着设置短一点但是没办法改,因为确实有这么长的,然后是 partition_num,看了下官方说明,磁盘的 2-10 倍,改为了 15,确实有影响,速度达到了 25w/s。到这里也算比较满意了,可能再修改还会有提升,不过已经满足要求了先告一段落吧。

小结

  • concurrency 设置为 CPU 核数,channelBufferSize 和 batchsize 尽可能大,但是不能超过集群的负载。
  • 硬件要用 SSD 和万 M 网络
  • space 的分区 partition_num 要合理,不能太多
  • 猜测 vid 长度,属性数量,graphd 的个数都有影响,但还未尝试

3.压力测试

根据业务上使用的指标,选取了一个进行测试。

指标如下:

match (v:email)-[:emailid]->(mid:id)<-[:phoneid]-(phone:phone)-[:phoneid]->(ids:id) where id(v)=="replace" with v, count(distinct phone) as pnum,count(distinct mid) as midnum,count(distinct ids) as idsnum , sum(ids.isblack) as black  where pnum > 2 and midnum>5 and midnum < 100 and idsnum > 5 and idsnum < 300 and black > 0 return v.value1, true as result

该语句为一个三度扩散 + 条件判断,集中数据涉及点的数量大概在 200-400 之间。

官方的 nebula-bench 需要做一点修改,打开 jmter 的 go_step.jmx 配置文件,修改ThreadGroup.num_threads为 CPU 核数,然后是其他的参数,如 loop,ngql 根据实际情况设置,ngql 里边的变量要用 replace 代替。

由于测试数据为较为集中的数据,该部分测试结果为 700/s,将数据扩大至全部节点,则达到 6000+/s。并发看起来还是可以的,查询速度也 ok,最高 300ms。

因为我这里是单节点,所以想增加 1 台 graphd 进行测试,看并发是否提高,然后直接启动了一个graphd进程,再测试结果发现没有提高。

然后刚好看到发布了2.0.1,所以重新搭建了集群,重新导入数据,使用 3 台 graphd,性能直接翻三倍,集中数据达到2100+/s,全部节点则达到将近 2w。所以很奇怪,详见论坛帖子nebula-bench 2.0 增加graph节点,并发上不去

猜测可能是由于增加 graphd 之后没有 blance 或者 compact,有空可以尝试一下。

另外由于没有使用一些监控组件,只用了 Linux 的命令查看,所以也没有得到太确切的机器状态信息。

小结

  • 测试之前,保证集群的负载平衡,做好 compact
  • 适当调整 storage 的配置,增大可用线程数以及缓存的内存大小
  • 并发跟数据有很大关系的,单纯多少没有意义,需要结合自己的数据分布情况来看。

4.配置

下边直接贴一下我修改的参数,meta,graphd 都采用默认配置,也没有特别要修改的,只贴一下 storage,并进行说明。

rocksdb_block_cache=102400  # 官方建议 1/3 内存,我这里设置 100G
num_io_threads=48 # 可用线程数,设置为 cpu 核数一半
min_vertices_per_bucket=100 # 一个桶最小的点数量
vertex_cache_bucket_exp=8 # 桶的总数是 2 的 8 次方
wal_buffer_size=16777216 # 16 M write_buffer_size:268435456 # 256 M

这里的参数是根据浏览各个贴子以及去官方代码查找的,并不一定特别准确,也是摸索来的,其他的参数没有特别修改。有很多的参数没有暴露出来,官方不建议随便修改,所以需要了解的话要去 GitHub 的源码里边查看。

结尾

总体来说,本次测试算不上特别专业,但是针对具体业务场景的测试,Nebula 也表现了很好的结果。具体参数的调整,也没有研究特别透彻,需要之后在使用中研究,如果大家有调优的好想法还请畅所欲言。

交流图数据库技术?报名参与 Nebula 交流会,NUC·2021 报名传送门,我们在北京等你来交流~~

详解 nebula 2.0 性能测试和 nebula-importer 数据导入调优的更多相关文章

  1. 详解用Navicat工具将Excel中的数据导入Mysql中

    第一步:首先需要准备好有数据的excel: 第二步:选择"文件"->"另存为",保存为"CSV(逗号分隔)(*.csv)",将exce ...

  2. HTTP详解(3)-http1.0 和http1.1 区别

    HTTP详解(3)-http1.0 和http1.1 区别 分类: 网络知识2013-03-17 16:51 1685人阅读 评论(0) 收藏 举报   目录(?)[+]   翻了下HTTP1.1的协 ...

  3. iOS 后台持续定位详解(支持ISO9.0以上)

    iOS 后台持续定位详解(支持ISO9.0以上) #import <CoreLocation/CoreLocation.h>并实现CLLocationManagerDelegate 代理, ...

  4. Spark详解(03) - Spark3.0.0运行环境安装

    Spark详解(03) - Spark3.0.0运行环境安装 Spark运行模式 Spark常见部署模式: Local模式:在本地部署单个Spark服务 所谓的Local模式,就是不需要其他任何节点资 ...

  5. HBase详解(02) - HBase-2.0.5安装

    HBase详解(02) - HBase-2.0.5安装 HBase安装环境准备 Zookeeper安装 Zookeeper安装参考<Zookeeper详解(02) - zookeeper安装部署 ...

  6. 详解Python Streamlit框架,用于构建精美数据可视化web app,练习做个垃圾分类app

    今天详解一个 Python 库 Streamlit,它可以为机器学习和数据分析构建 web app.它的优势是入门容易.纯 Python 编码.开发效率高.UI精美. 上图是用 Streamlit 构 ...

  7. 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...

  8. 性能测试 Apache参数配置与性能调优

    Apache性能调优 by:授客 QQ:1033553122 环境: Apache 2.4 1.选择合适的MPM(Multi -Processing Modules, 多处理模块) Unix/Linu ...

  9. 详解QT5.10.0搭载OpenCV3.4.0环境配置步骤说明

    一.准备工作: 1下载Qt5.10.0 和 Qt Creator 4.5.0软件(http://download.qt.io/official_releases/qt/) 2.下载opencv3.40 ...

  10. 详解C#7.0新特性

    1. out 变量(out variables) 以前我们使用out变量必须在使用前进行声明,C# 7.0 给我们提供了一种更简洁的语法 “使用时进行内联声明” .如下所示: 1 var input ...

随机推荐

  1. 从好玩到好用:程序员用AI提效的那些事儿

    本片内容是[AI思维空间]ChatGPT纵横编程世界,点亮智慧火花的续作,主要记录组内开发小伙伴儿们在开发过程中的实际应用案例,记录典型案例,尽量不要和其他人重复,以解决开发过程中的实际问题为主,设计 ...

  2. TortoiseGit 常见问题汇总

    1.test分支修改后合并到master分支 1)切换本地分支到master分支 2)TortoiseGit --->  merge,选择远程分支test 提交到远程分支master 2.将远程 ...

  3. Java开发中PO、VO、DAO、BO、DTO、POJO 含义

    PO(persistant object) 持久对象 可以看成是与数据库中的表相映射的java对象.使用 Mybatis 来生成 PO 是不错的选择. VO(value object) 值对象 通常用 ...

  4. Flask Echarts 实现历史图形查询

    Flask前后端数据动态交互涉及用户界面与服务器之间的灵活数据传递.用户界面使用ECharts图形库实时渲染数据.它提供了丰富多彩.交互性强的图表和地图,能够在网页上直观.生动地展示数据.EChart ...

  5. P9989 [Ynoi Easy Round 2023] TEST_69 题解

    题目链接: [Ynoi Easy Round 2023] TEST_69 首先GCD有比较良好的一些性质.我们观察到一次 \(GCD(a_i,x)\) 操作,会有以下两种变化. 如果 \(x \bmo ...

  6. 3.4 CSP-J 补赛游寄

    3.4 CSP-J 补赛游寄 Day -? 听说要去打比赛. Day -7 今天家长会,老师公布成绩 /fn/fn/fn.政治考废了,然后其他都挺好. 语文 $ 95 $,数学 $ 118 $,英语 ...

  7. flash8.ocx或其附件之一不能正确注册

    运行书中自带光盘中的程序,在该程序的readme说明中,提到这类错误,解决方式是: 因为是免安装程序,需要运行"setup"文件夹下的setup.exe文件,安装控件.在安装完成后 ...

  8. TortoiseSVN 官网打不开,去哪下最新的软件和中文包?

    官网:https://tortoisesvn.net 能打开最好,但通常打不开,打不开时候去这个网站下: https://sourceforge.net/projects/tortoisesvn/ 这 ...

  9. NC23048 月月给华华出题

    题目链接 题目 题目描述 因为月月是个信息学高手,所以她也给华华出了一题,让他求: \(\sum_{i=1}^N\frac{i}{\gcd(i,N)}\) 但是因为这个式子实在太简单了,所以月月希望华 ...

  10. spring boot整合mybatis-plus报错:There is no getter for property named ‘ew‘ in ‘xxx‘

    问题说明 spring boot整合mybatis-plus报错:There is no getter for property named 'ew' in 'xxx' 问题解决 XXXmapper. ...