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
, Пробовал разные комбинации количества потоков и количества блокировок, но времена всегда на более высокой стороне.
Не можете найти что-нибудь не так? Потому что времена кажутся слишком высокими. Какие-либо подсказки??