首先,我有一台带有SSD和32GB RAM的服务器,所以我不认为硬件是瓶颈。
问题是,我有一个树模拟结构,其中每个节点有2个关系(与其父和子):
_ _
/1\-CHILD_OF--->/2\
\_/<-PARENT_OF->\_/
也就是说,节点#1是节点2的子节点,节点#2是#1的父节点(我知道这是过度的,一个关系应该足够了,但我现在只是在玩。< / p>
所以,我有这个程序,“更改子树的父级”,即给定node
和new_parent
,我应该执行以下操作:删除node
与之关系它的父母并为它创建一个新的父母。如你所见,这不是什么大问题。但是,当我在此之后调用transaction.success()
时,暂停似乎非常重要(&gt; 20秒)。 DB的大小为29 GB(115 * 10 ^ 6个节点。
如何摆脱这种放缓?
编辑(代码示例): 用法:
graphDb = new GraphDatabaseFactory().newEmbeddedDatabase("/ssd/" + "neotree");
changeNodeParent(positivePseudoRandomLong(rng, 120000000), positivePseudoRandomLong(rng, 120000000));
其中
private static void changeNodeParent(long eid, long pid) {
try (Transaction tx = graphDb.beginTx()) {
Node nodeInDistress = graphDb.getNodeById(eid);
Node newFoundParent = graphDb.getNodeById(pid);
// remove eid-pid relationship
nodeInDistress.getSingleRelationship(Hier.PARENT_OF, Direction.INCOMING).delete();
newFoundParent.createRelationshipTo(nodeInDistress, Hier.PARENT_OF);
// place new relationship
nodeInDistress.createRelationshipTo(newFoundParent, Hier.CHILD_OF);
tx.success();
}
}
UPD
我正在运行一些有关独立服务器性能的测试。我有2个用于测试读写特性的基本案例,两者都被公式化为POST请求。
因此,当使用来自远程主机的Apache ab
进行测试时(使用3节点设置),读取速度可预测很快,并且增加的并发连接数似乎不会降低性能(甚至增加它) )(用1级,10级,......,100级测试)。
但编写测试似乎受到并发写入的极大影响,我认为由于事务开销而再次出现。我基本上尝试过的是修补org.neo4j.server.transaction.timeout
和org.neo4j.server.webserver.maxthreads
。问题是如果我将它们保留为默认值并执行并发级别设置为100的测试(即同时向服务器发出100个请求),则近30%的请求都会失败(根据ab
,返回代码不是成功的) 。如果我增加transaction.timeout
,则失败的请求数量会减少(并发级别似乎不会以显着的方式影响该值)。基本上,如果我将超时设置为1分钟,则只有10%的请求失败,依此类推。这使我再次得出一些交易瓶颈的结论。我重新设计了数据库,因此唯一的关系只有CHILD_OF
(两次减少relationship_store
大小),但它似乎不会影响上述问题。每个节点只有一个CHILD_OF
关系(根除了),但是一个节点可以是多个这种关系的endNode
(约1到100)。