Низкая пропускная способность с очереди Hazelcast, как только многоузловой кластер? - PullRequest
0 голосов
/ 15 июня 2019

Я использую тест ниже, чтобы измерить мое время прохождения. Когда я запускаю локальный кластер с одним узлом, время пропускной способности составляет около 90 000 сообщений в секунду. Как только я добавляю еще один локальный узел в кластер, пропускная способность падает до ~ 5k сообщений / сек. Я скучаю по каким-то важным конфигам? Я настроил Hazelcasts, чтобы пропустить репликацию данных между узлами, поэтому скорость должна быть одинаковой, независимо от того, сколько узлов, верно?

Я использую Hazelcast 3.11 со следующей конфигурацией:

<?xml version="1.0" encoding="UTF-8"?>
<hazelcast xsi:schemaLocation=
  "http://www.hazelcast.com/schema/config hazelcast-config-3.7.xsd"
  xmlns="http://www.hazelcast.com/schema/config"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <network>
        <port auto-increment="true" port-count="20">5701</port>
        <join>
            <multicast enabled="false">
        </multicast>
        <tcp-ip enabled="true">
            <member>localhost</member> 
        </tcp-ip>
        </join>
    </network>

    <queue name="test">
        <statistics-enabled>false</statistics-enabled>
        <max-size>0</max-size>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <empty-queue-ttl>-1</empty-queue-ttl>
    </queue>

</hazelcast>

Класс теста пропускной способности:

package de.wipk.application.imdg;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IQueue;

public class HCTest {
  private static final int TOTAL = 1000000;
  private static final int LAP   = 100000;

  public static void main(String[] args) throws InterruptedException {
    final HazelcastInstance hz = Hazelcast.newHazelcastInstance();
    final IQueue<Object> queue = hz.getQueue("test");

    final long start = System.currentTimeMillis();
    long lastLap = start;

    Thread t = new Thread() {
      long lastLap = start;

      @Override
      public void run() {
        System.out.println((System.currentTimeMillis() - lastLap) + " Start receiving msgs");
        for (int i = 1; i < TOTAL + 1; ++i) {
          try {
            Object msg = queue.take();

            if (i % LAP == 0) {
              final long lapTime = System.currentTimeMillis() - lastLap;
              System.out.printf("<- messages %d/%d = %dms (%f msg/sec)\n", i, TOTAL, lapTime, ((float) LAP * 1000 / lapTime));
              lastLap = System.currentTimeMillis();
            }

          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    };
    t.start();

    System.out.println((System.currentTimeMillis() - lastLap) + " Start sending msgs");
    for (int i = 1; i < TOTAL + 1; ++i) {
      queue.offer(i);

      if (i % LAP == 0) {
        final long lapTime = System.currentTimeMillis() - lastLap;
        System.out.printf("-> messages %d/%d = %dms (%f msg/sec)\n", i, TOTAL, lapTime, ((float) LAP * 1000 / lapTime));
        lastLap = System.currentTimeMillis();
      }
    }

    System.out.println((System.currentTimeMillis() - start) + " Finished sending msgs");

    t.join();

    System.out.println((System.currentTimeMillis() - start) + " Test finished");
  }
}

1 Ответ

0 голосов
/ 15 июня 2019

В кластере с одним узлом эта строка

final IQueue<Object> queue = hz.getQueue("test");

возвращает ссылку на очередь в текущем экземпляре, по сути локальную ссылку.

Когда добавляется больше экземпляров,сама очередь может быть перенесена для размещения в другом экземпляре, поэтому теперь ссылка на удаленную очередь.

Есть несколько способов проверить это.Вероятно, самым простым было бы продлить время теста, частично присоединить второй узел и посмотреть, не изменится ли производительность.Очевидно, вы бы хотели, чтобы только первый процесс выполнял действия offer() / take().

Если хотите, добавьте

System.out.println(hz.getPartitionService().getPartition("test").getOwner());

, чтобы найти место, в котором находится очередь, какдругие участники присоединяются к кластеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...