我在试图保持Neo4j缓存温暖时遇到问题。描述设置:
- neo4j 3.2 EE
- 在docker中运行
- 已安装apoc
- 缓存配置仍为出厂默认值
我的应用程序允许用户与参数化查询所代表的图形进行某些集合交互。现在,当我正在优化这些时,我遇到了一个奇怪的问题:每隔几个小时左右,我第一次执行时,最简单的2 db命中查询需要300毫秒,因为Neo4j浏览器告诉我 - 这看起来太长了。它类似match (n:Mynode {uniqueid: $id}) return n
。
之后它会在2ms内运行,直到我将图表单独放置几个小时。现在,在我对数据库如何工作的简单理解中,我看到了这种行为的两个可能原因:
- 节点缓存尚未包含所需信息 - 这很奇怪,因为我每180秒安排一次
apoc.warmup.run(true)
。也许apoc热身不够或工作不正确?
- 首先必须计划查询 - 这看起来很奇怪,因为1.我会假设计划查询不应该花费300毫秒和2.默认情况下,查询计划每10秒刷新一次,但是在没有数据库的情况下2分钟后互动,它仍然运行得很快
有没有更有经验的优化配置知道这里有什么问题?非常感谢。
编辑以澄清:
- 因为我是该实例上唯一的开发人员,所以没有并行查询。 ATM我只是在开发时对此进行基准测试
- 我不知道GC是什么,但一般不应该在服务器上加载,也不应该在db上加载
- 图表不大。它在我的玩具示例中包含不到10000个节点。此外,查询的每次点击次数低于1000 db
- 大约有20个参数化查询,这是应用程序唯一的交互
- 即使我删除/重新导入整个图表,查询也会在之后快速运行 - 所以我实际上可以放弃考虑查询计划问题。
- 似乎更有可能是其他一些缓存问题(也许是docker volume ..?)。我将查看页面缓存
编辑2:
- 可以在本地轻松复制(与Web服务器上的docker镜像相同)。相当正常的胜利10机器,没有其他运行