ApacheCurator распределенная блокировка - производительность

В настоящее время мы оцениваем apache-куратор для случая использования распределенной блокировки. Ниже приведен наш тестовый пример:

public class Test { 
    private static CuratorFramework client = CuratorFrameworkFactory.newClient("zook.company.com", new ExponentialBackoffRetry(10,5));

    public static void main(String[] args) {
        client.start();
        int numLocks = 50000;
        int numThreads = 200;
        String[] keyPool = new String[numLocks];
        for (int i = 1; i <= numLocks; i++) {
            keyPool[i - 1] = String.valueOf(100 + i);
        }
        for (int i = 0; i < numThreads; i++) {
            Thread t = new Thread(new Job(numLocks, keyPool));
            t.setName("T" + (i + 1));
            t.start();
        }
    }

    private static class Job implements Runnable {
        private int      numLocks;
        private String[] keyPool;

        public Job(int numLocks, String[] keyPool) {
            this.numLocks = numLocks;
            this.keyPool = keyPool;
        }

        @Override
        public void run() {
            while (true) {
                int l = 0;
                int h = numLocks;
                String lockKey = keyPool[(new Random().nextInt(h - l) + l)];
                InterProcessMutex lock = new InterProcessMutex(client, "/"+lockKey);
                boolean acquired = false;
                String threadName = Thread.currentThread().getName();
                try {
                    long start = System.currentTimeMillis();
                    acquired = lock.acquire(0, TimeUnit.NANOSECONDS);
                    if (acquired) {
                        long end = System.currentTimeMillis();
                        System.out.println("lock acquired in "+ (end - start) + " ms");
                    } else {
                        System.out.println("failed to get lock");
                    }
                } catch (Exception e) {
                    System.out.println(e);
                } finally {
                    if (acquired) {
                        long start = System.currentTimeMillis();
                        lock.release();
                        long end = System.currentTimeMillis();
                        System.out.println("lock released in "+(end - start)+" ms");
                    }
                }
            }
        }
    }
}

Тест выполняется на 2-ядерном /7,5 ГБ ОЗУ с 2G Xmx. Пока экземпляр зоопарка (zook.company.com) работает на 4-ядерном /15G оперативном сервере с Xmx как 12G, maxClientCnxns=5000, tickTime=2000, initLimit=10 и syncLimit=5.

Оба сервера находятся в одном AWS VPC.

При выполнении тестов в течение 10 минут мы получаем время получения блокировки как 80 ms более 95% попыток блокировки. Максимальное время, затраченное на получение блокировки, было 340 ms, Пробовал разные комбинации количества потоков и количества блокировок, но времена всегда на более высокой стороне.

Не можете найти что-нибудь не так? Потому что времена кажутся слишком высокими. Какие-либо подсказки??

0 ответов

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