Neo4j 3.5.12社区版
Ubuntu Server 20.04.2
RAM: 32 Gb
具有4个或8个CPU的EC2实例(我将其更改以适应当前的处理)
数据库文件:6.5
Python、WSGI、Flask
dbms.memory.heap.initial_size=17g
dbms.memory.heap.max_size=17g
dbms.memory.pagecache.size=11g
我看到服务器上的CPU使用率很高,这似乎是一个随机模式。我已经分析了我知道人们在这些时间访问的所有页面的所有查询,它们都在所有情况下都进行了优化,执行时间都在50ms以下。CPU使用率似乎与用户数无关,因为用户数在大多数时候都很低(最多40个并发用户)。我也检查了cron job中的所有查询。
我显著地减少了数据库注释,这对性能没有任何影响。
我通过使用MATCH (n) OPTIONAL MATCH (n)-[r]->() RETURN count(n.prop) + count(r.prop);
将所有节点预加载到ram中来预热数据库
这种模式是,CPU使用率会有几分钟非常低(正如我在这个设置中对这些用户数的预期),然后大多数CPU核心上的处理会上升到90%s,并且机器对新请求变得没有响应。更改为8CPU实例会对其进行排序,但对于这种级别的流量来说应该不需要。
我想用查询日志来分析查询,但是社区版不支持这一点。
谢谢。
发布于 2021-04-09 14:07:31
运行perf
之类的CPU profiler来记录CPU时间被花在哪里。然后,您可以将其可视化为FlameGraph,或者,由于您的突发只以随机间隔发生,因此可以使用Netflix的FlameScope随时间可视化它
由于Neo4j是一个Java应用程序,因此研究一下async-profiler
可能也是值得的,因为它在分析Java应用程序时是无价的(它会生成类似的FlameGraphs,并且可以输出与FlameScope或JMC兼容的日志文件)。
https://stackoverflow.com/questions/67014954
复制相似问题