这是由社区用户——繁凡撰写的一篇他的实践分享,主要讲解如何进行 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. VictoriaMetrics 1.73.1 值得关注的新特性

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 VictoriaMetrics 1.73.1 的changelog: h ...

  2. 通过docker-compose搭建mongo的replica set高可用

    通过docker-compose搭建mongo的replica set高可用 前言 备份数据 备份数据到本地 数据恢复 集群搭建 生成keyFile 创建yml文件 初始化副本集 增加副本集 将节点初 ...

  3. 8.4 ProcessHeap

    ProcessHeap 是Windows进程的默认堆,每个进程都有一个默认的堆,用于在进程地址空间中分配内存空间.默认情况下ProcessHeap由内核进行初始化,该堆中存在一个未公开的属性,它被设置 ...

  4. 2.1 C++ STL 数组向量容器

    Vector容器是C++ STL中的一个动态数组容器,可以在运行时动态地增加或减少其大小,存储相同数据类型的元素,提供了快速的随机访问和在末尾插入或删除元素的功能. 该容器可以方便.灵活地代替数组,容 ...

  5. C/C++ 反汇编:数据类型与常量

    反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解.外挂技术.病毒分析.逆向工程.软件汉化等领域,学习和理解反汇编对软件调试.系统漏洞挖掘.内核原理及理解高级语言代码都有相当大的帮助, ...

  6. 用arr.filter数组去重

    let res = arr.filter((item,index,arr)=>{ //返回找到的下标,等于 下标 return arr.indexOf(item) === index; }) c ...

  7. Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...

  8. Web服务器实现|基于阻塞队列线程池的Http服务器|线程控制|Http协议

    基于阻塞队列生产者消费者模型线程池的多线程Web服务器 代码地址:WebServer_GitHub_Addr README 摘要 本实验通过C++语言,实现了一个基于阻塞队列线程池的多线程Web服务器 ...

  9. Oracle 19c RAC自动应用RU补丁过程

    笔者好久没有使用opatchauto打过补丁了,搜了下自己的历史随笔,上次opatchauto打补丁的记录还是Oracle 11g版本: Oracle 11g RAC 自动应用PSU补丁简明版 而11 ...

  10. 《ASP.NET Core 与 RESTful API 开发实战》-- (第6章)-- 读书笔记(下)

    第 6 章 高级查询和日志 6.3 排序 RESTful API 在实现排序时应支持对集合资源的一个或多个属性进行排序 示例对 authors 资源按照其属性 Age 升序排序,再按 BirthPla ...