Всего 12 транзакций / с в причинном кластере

Я развернул Neo4J на кластере из 3 машин и выполнил код, который должен провести стресс-тестирование кластера.

Например, вот функция, которая удаляет все узлы:

public void deleteAllNode()
    {
        try
        {
            while (amountNode() > 0) {
            session.writeTransaction( new TransactionWork<String>()
            {
                @Override
                public String execute( Transaction tx )
                {
                    tx.run( "START nx=node(*) WITH nx LIMIT 1 DETACH DELETE nx");
                    return "Node Deleted";
                }
            } );
       }
       }finally {   
       }
    }

К сожалению, этот код выполняет только 12 транзакций в секунду. Я считаю, что тот же код на локальном компьютере с одним экземпляром был в 20 раз быстрее.

Также вот код AmountNode ():

public int amountNode(){
        try
        {
             StatementResult result = session.run( "MATCH (n) RETURN count(*)");
             if(result.hasNext()){
                 return result.next().get(0).asInt();
             }
        return 0;
        } finally {
        }
    }

Если у кого-то есть лучший способ вычислить, сколько узлов на графе, не стесняйтесь поделиться.

Также вот как я устанавливаю соединение перед вызовом функции:

driver = GraphDatabase.driver( uri1 , AuthTokens.basic(user, password) );
session = driver.session(AccessMode.WRITE);

Любая помощь приветствуется. Спасибо.

0
0
21
1

Ответы 1

Основная проблема здесь в том, что выполнение отдельной транзакции для каждого удаления отдельного узла для проверки удаления всех узлов в графе будет ужасно неэффективным.

Вы должны либо удалить все сразу (используя MATCH (n) DETACH DELETE n), либо пакетное удаление, используя для этого процедуры APOC:

CALL apoc.periodic.iterate('MATCH (n) RETURN n', 'DETACH DELETE n', {})

Кроме того, не рекомендуется использовать синтаксис START. Избегайте его использования.

Вы также вообще не описали свои данные. Помните, что DETACH DELETE не просто удаляет узел, он удаляет все отношения, связанные с этим узлом. Удаление одного отношения с десятками тысяч отношений может сделать столько же работы, сколько удаление десятков тысяч узлов без отношений. Кроме того, во время этих операций должны обновляться индексы, поэтому зачастую под капотом выполняется больше работы, чем вы можете себе представить.

Я как бы знал, что удаление узла по одному было неэффективным, я сделал это таким образом, чтобы проверить скорость кластера. И, по-видимому, он может обрабатывать только 12 транзакций в секунду. Вы можете подтвердить, что это нормальное поведение? Зная, что среднее отношение к каждому узлу равно 3. И в целом на самом графике очень мало данных.

Edmond Boulet-Gilly 13.08.2018 08:56

12 tx / sec звучит слишком низко. Вы также не предоставили некоторые спецификации для этого кластера. Вы используете твердотельные накопители или вращающиеся диски? Сколько оперативной памяти у каждого? Каковы ваши настройки кэша страниц и кучи? Кеш страниц нагрелся? Вот секция производительности, который может помочь в обеспечении идеальной конфигурации.

InverseFalcon 13.08.2018 17:57

Кластеры работают на i7 / HDD с 8 ГБ ОЗУ каждый. Я оставил другие параметры, которые вы упомянули, в конфигурации по умолчанию. Спасибо за руководство по производительности, проверю.

Edmond Boulet-Gilly 14.08.2018 09:12

Другие вопросы по теме