多线程导入速度慢

Nebula 和 Java Client 都是2.0最新的 nebula-graph-2.0.0.el7.x86_64.rpm client 2.0.0

使用 SyncConnection 做并发导入,
Storage buffer调大了 disable auto compact = true
三台机器:三个storaged 两个graphd 一个metad

机器 2X16X2 逻辑核 单机k线程,每个线程起一个SyncConnection,batchSize = 200
数据为 vid=int person() 无属性点100w,没有边

K=1 715764ms=11.9min
K=4 171613ms=2.86min
K=10 66797ms
K=16 43581ms
K=20 35084ms 36264ms
K=40 14233ms 17~18s
K=100 6864ms 7027ms 7002ms
K=150 5305ms 5369ms 5416ms
K=200 5087ms 5193ms 5192ms

感觉这个速度也太慢了吧,该改的config基本也改了,看的出来前面基本符合反比,但是单线程导100w无属性点要11.9min,主要会是什么原因呢?

配置信息

storage
############## rocksdb Options ##############
# rocksdb DBOptions in json, each name and value of option is a string, given as "option_name":"option_value" separated by comma
--rocksdb_db_options={}
# rocksdb ColumnFamilyOptions in json, each name and value of option is string, given as "option_name":"option_value" separated by comma
--rocksdb_column_family_options={"write_buffer_size":"67108864","max_write_buffer_number":"4","max_bytes_for_level_base":"268435456","disable_auto_compactions":"true"}
# rocksdb BlockBasedTableOptions in json, each name and value of option is string, given as "option_name":"option_value" separated by comma
--rocksdb_block_based_table_options={"block_size":"8192"}

########## Disk ##########
# Root data path. Split by comma. e.g. --data_path=/disk1/path1/,/disk2/path2/
# One path per Rocksdb instance.
--data_path=data/storage

# The default reserved bytes for one batch operation
--rocksdb_batch_size=1048576
# The default block cache size used in BlockBasedTable.
# The unit is MB.
--rocksdb_block_cache=1024
# The type of storage engine, `rocksdb', `memory', etc.
--engine_type=rocksdb

graphd
# The number of threads to accept incoming connections
--num_accept_threads=5

不太确定是server的问题还是client使用的问题,我这里有个使用importer导入LDBC数据的性能报告,可以参考一下:
Total rows:14349843
AVG(Rows/s):269016.77/s
time spend: 53.84s
concurrent thread:30
batch size:100
storage node : 3 node
disk type : ssd

storage用的是SSD磁盘吗?

示例中没有多线程并发导入的方式,你可以使用多线程来尝试导入,不确定你多线程的实现是如何的,可以采用一个线程一个 session 的方式来处理,同时对两个 graphd 做下简单的 balance。

我知道原因了,我是学着java-client和flink demo写的。因为我没有假设一次任务只导入一种tag,而你们的例子都是每次提交是同种类型,所以我的batch是 (insert ;)*200,而不是 insert values ()*200;,所以估计还是相当于一个batch分了200个子句执行了,所以很慢,我改写成一个insert插200个value以后,速度还是很快的。

2 个赞