单次更改数据库后,缓慢交易#reccess()

时间:2013-12-23 15:54:05

标签: java neo4j

首先,我有一台带有SSD和32GB RAM的服务器,所以我不认为硬件是瓶颈。

问题是,我有一个树模拟结构,其中每个节点有2个关系(与其父和子):

 _               _
/1\-CHILD_OF--->/2\
\_/<-PARENT_OF->\_/

也就是说,节点#1是节点2的子节点,节点#2是#1的父节点(我知道这是过度的,一个关系应该足够了,但我现在只是在玩。< / p>

所以,我有这个程序,“更改子树的父级”,即给定nodenew_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.timeoutorg.neo4j.server.webserver.maxthreads。问题是如果我将它们保留为默认值并执行并发级别设置为100的测试(即同时向服务器发出100个请求),则近30%的请求都会失败(根据ab,返回代码不是成功的) 。如果我增加transaction.timeout,则失败的请求数量会减少(并发级别似乎不会以显着的方式影响该值)。基本上,如果我将超时设置为1分钟,则只有10%的请求失败,依此类推。这使我再次得出一些交易瓶颈的结论。我重新设计了数据库,因此唯一的关系只有CHILD_OF(两次减少relationship_store大小),但它似乎不会影响上述问题。每个节点只有一个CHILD_OF关系(根除了),但是一个节点可以是多个这种关系的endNode(约1到100)。

0 个答案:

没有答案