执行ngql语句时间过长

  • nebula 版本:v3.1.0
  • 部署方式:分布式,7台实例
  • 安装方式:RPM
  • 是否为线上版本:Y
  • 硬件信息
    • 磁盘:SSD
    • CPU、内存信息:64c 512g
  • 问题的具体描述
    使用的是nebula-java 3.0.0客户端,连接池配置超时时间为30秒,运行程序出现com.vesoft.nebula.client.graph.exception.IOErrorException: java.net.SocketTimeoutException: Read timed out异常。观察CPU,存储正常,登录graph,执行语句,发现耗时过高

    需求:批量更新
  • 相关的 meta / storage / graph info 日志信息
代码 / 终端输出 / 日志…

来,机器配置贴一下

= =。哥,我让你补充个配置啊,你给我监控图,我也算不出来你多少 CPU 核数啊

补到上面的描述了

稍等,我让研发看看

有没有并发再跑大的query

1 个赞

这个空间是新建的,只有我这个项目在使用,按照我的程序,只有判断uid是否存在这个查询:MATCH (v:uid {name:xxx}) RETURN v.uid.name AS name
目的是为了不使用UPSERT,先查询,后插入或更新。
uid name属性有建了索引
image

Nebula 3.1.0还是不支持并发写入吗?
程序存在多个进程写同一个节点的不同属性,存在异常:
More than one request trying to add/update/delete one edge/vertex at the same time
这个问题,我的想法是采用分布式锁的方式解决,是否有其他更好的解决方案?

时不时出现异常

按你描述的 肯定是存在并发操作了。应该是在3.2版本把并发的限制放松了,允许并发update同一个kv了。然后你另一个RPC报错大概率是因为MATCH把insert挡住了。数据量大不建议用match。

因为什么原因数据量大不建议用match。
LOOKUP:
索引会导致写性能大幅降低(降低 90%甚至更多)。请不要随意在生产环境中使用索引,除非很清楚使用索引对业务的影响。
难道是因为我们建立了索引,导致写入时间耗时久?

因为 MATCH 可能会用到索引。

  • MATCH 的优化现在还没有 LOOKUP/GO 多(在不断被优化中,很多场景已经是可比的表现了,但是还是有点差异原因如第二条)
  • MATCH 正常拓展时候取点带上所有属性,开销大一些

所以能用 LOOKUP/GO/FETCH 表达的模式匹配是比 MATCH 有更好的表现的哈。

索引的建立一定是有写入开销的,如果能够通过 vid 格式设计避免起始点的基于索引的查询,会对写入有大大的帮助哈

ref: Nebula Graph 索引详解 - siwei.io

1、执行语句超时的问题通过观察storage日志,重启storage后,暂时没有问题;
2、并发写入问题,通过分布式锁的方式解决,暂时没有问题;

另外有一个问题,关于session管理的问题:
背景:程序上对session做了缓存,减少频繁创建session开销,每个线程一个session,获取session时,先从缓存获取,获取不到从NebulaPool新建session。
由于session默认8小时关闭,需要将缓存的session清理,获取新的session。
问题:想问问,是否有提供方法判断session是否已经关闭的方法。
我现在尝试使用Session.ping()方法(com.vesoft.nebula.client.graph.net.Session),show sessions观察session数和程序的线程数不一致,应该是Session.ping()会创建新的session

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