ApacheCurator分布式锁定 - 性能

amd*_*lal 5 distributed-lock apache-zookeeper apache-curator

我们目前正在评估apache-curator的分布式锁定用例.以下是我们的测试用例:

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");
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试在2核/ 7.5G RAM机器上运行,配备2G Xmx.当zookeeper instance(zook.company.com)在4核/ 15G RAM服务器上运行时,Xmx为12G,maxClientCnxns = 5000,tickTime = 2000,initLimit = 10,syncLimit = 5.

两台服务器都位于同一AWS VPC中.

在运行测试10分钟后,我们获得80 ms了超过95%的锁定尝试的锁定获取时间.锁定获取的最长时间是340 ms.一直尝试不同的线程数和锁数组合,但时间总是偏高.

无法找到任何错误的地方?因为时代似乎太高了.任何线索?