neo4j调试日志中大量Inbound message queue has exceeded high watermark是什么原因?有哪些影响?如何解决?

项目中使用了neo4j,最近迁移了一个新环境,结果发现服务运行不稳定,有时候报错:在neo4j事务提交时,等待某个节点的锁超时(30秒),有时候驱动程序报错:客户端连接被终止。

因为之前对neo4j仅仅限于简单应用。所以对neo4j配置、日志等并不了解。
重新花时间了解了下neo4j的基本配置(主要是内存配置),尝试查看下neo4j的调试日志。

目前neo4j是放在docker容器运行的。配置方法如下:

services:
  neo4j:
    image: bitnami/neo4j:5.3.0
    environment:
      NEO4J_PASSWORD: 12345678
    ports:
      # 客户端页面访问端口
      - "7474:7474"
      # bolt协议访问端口    
      - "7687:7687"
    volumes:
      - "./neo4j_data:/bitnami/neo4j/data"
      # 内存及其它配置(详见neo4j.conf文件内中文说明)
      - "./conf:/bitnami/neo4j/conf"
      # 日志
      - "./logs:/opt/bitnami/neo4j/logs"
    restart: always

在neo4j.conf配置中,主要设置了最大内存4G(因为neo4j中节点的数量为 61万个,感觉4G应该足够用了):

# 修改内存设置
server.memory.heap.initial_size=256m
server.memory.heap.max_size=4096m

目前查看neo4j的调试日志,发现有大量的 Inbound message queue has exceeded high watermark - Disabling message processing,那么这些错误会带来什么影响呢?会导致事务执行失败?还是仅仅是响应速度慢?应该如何解决呢?


补充:2023-12-27
今天取了neo4j源码,查看了下出问题的代码;另外,启用了neo4j服务端调试功能,挂上断点初步查看了下爆出警告日志的地方,对bolt协议的处理入口有了简单的第一印象,网上初步搜了下neo4j源码赏析、bolt协议解析等内容,可惜没有多少有价值的东西。neo4j的服务端代码还是挺优雅的,后面有时间做一下跟踪分析。

<!--neo4j服务端-->
<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-community</artifactId>
    <version>5.3.0</version>
</dependency>        

在neo4j.conf文件中开放调试端口

# 开放调试端口
server.jvm.additional=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
阅读 626
avatarAI BotBETA

Inbound message queue has exceeded high watermark - Disabling message processing这个错误表示在处理接收到的消息时,队列已经超过了设定的上限,因此消息处理被禁用。这种情况通常发生在服务器接收到的请求过多,处理不过来的时候。

这种错误的影响有:

  1. 性能问题:由于消息处理被禁用,那些需要处理的请求将会被阻塞,导致响应时间增加,甚至可能引起超时。
  2. 稳定性问题:如果这种状况持续发生,并且没有被妥善处理,那么可能会影响到服务器的稳定性,可能会导致服务器崩溃或者重启。

解决这个问题的方法主要有:

  1. 优化查询:检查你的查询是否可以优化。例如,你可以使用索引来加速查询,减少需要处理的数据量。
  2. 调整服务器配置:根据你的实际需求和资源情况,你可能需要增加服务器的内存,或者增加服务器的数量。在Neo4j的配置文件中,你可以调整dbms.input_message_queue.high_water_mark的值,来设置更高的队列大小上限。注意,这可能会导致你的服务器使用更多的内存。
  3. 限制并发连接数:如果你的服务器收到了过多的并发连接,你可能需要限制并发连接的数量。你可以在Neo4j的配置文件中设置dbms.connector.bolt.accept_countdbms.connector.http.accept_count来控制最大连接数。
  4. 优化数据模型:检查你的数据模型,看看是否可以删除不必要的节点和关系,或者使用更适合你的查询的数据模型。
  5. 升级Neo4j版本:如果你使用的是较旧的Neo4j版本,那么升级到最新版本可能会解决这个问题,因为新版本可能包含性能改进和bug修复。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏