Hi all
I have a cluster with 3 server nodes which have 4 CPU cores and 8Gb memory.
When applications call cache.getAll(set), it often takes a long time almost
500ms(about 0.6%), even the set size is less than 3.
And I do not think it was caused by the network, because the network latency
between application and server is less than 2 milliseconds.
The CPU of Ignite servers were between 3%~5% and the QPS are about 1000 read
and 1000 write.
Here is my code segment:
Cache:
CacheConfiguration<String, BinaryObject> cacheCfg =
DefaultIgniteConfiguration.getCacheConfiguration(IgniteCacheKey.DATA_POINT.getCode());
cacheCfg.setBackups(2);
cacheCfg.setDataRegionName(Constants.THREE_GB_REGION);
cacheCfg.setCacheStoreFactory(FactoryBuilder.factoryOf(DataPointCacheStore.class));
cacheCfg.setWriteThrough(true);
cacheCfg.setWriteBehindEnabled(true);
cacheCfg.setWriteBehindFlushThreadCount(2);
//每15秒刷新一次
cacheCfg.setWriteBehindFlushFrequency(15 * 1000);
cacheCfg.setWriteBehindFlushSize(409600);
cacheCfg.setWriteBehindBatchSize(1024);
cacheCfg.setStoreKeepBinary(true);
cacheCfg.setQueryParallelism(4);
//2M
cacheCfg.setRebalanceBatchSize(2 * 1024 * 1024);
getAll:
public Map<String, BinaryObject> getAll(Set<String> keys) {
long total = totalRead.incrementAndGet();
long startTime = System.currentTimeMillis();
Map<String, BinaryObject> all = igniteCache.getAll(keys);
long currentTime = System.currentTimeMillis();
long took = currentTime - startTime;
if (took > 500) {
readGreaterThan500.incrementAndGet();
logger.warn("read complete, cost:{}ms", took);
}
if (total % 10000 == 0) {
double percent = 1000.0 * readGreaterThan500.get() / total;
logger.info("percent that more 500ms:{}‰",
readGreaterThan500.get(), total, format.format(percent));
}
return all;
}
putAllAsync:
public IgniteFuture<Void> putAllAsync(Map<String, DpCache> map) {
long total = totalWrite.incrementAndGet();
long startTime = System.currentTimeMillis();
Map<String, BinaryObject> objectMap = Maps.newHashMap();
for (Map.Entry<String, DpCache> entry : map.entrySet()) {
objectMap.put(entry.getKey(),
ignite.binary().toBinary(entry.getValue()));
}
IgniteFuture<Void> future = igniteCache.putAllAsync(objectMap);
long currentTime = System.currentTimeMillis();
long took = currentTime - startTime;
if (took > 500) {
writeGreaterThan500.incrementAndGet();
logger.warn("write complete, cost:{}ms", took);
}
if (total % 10000 == 0) {
double percent = 1000.0 * writeGreaterThan500.get() / total;
logger.info("percent that more than 500ms :{}‰",
writeGreaterThan500.get(), total,
format.format(percent));
}
return future;
}
--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/