使用的示例代码:
public static void main(String[] args) {
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
HazelcastInstance hz1 = Hazelcast.newHazelcastInstance();
IMap<String, String> map = hz.getMap("map");
for(int i=0; i < 1000000 ; i++) {
String key = "key" +Integer.toString(i);
String value = "value"+Integer.toString(i);
map.setAsync(key,value);
}
System.out.println("Completed loading to Imap");
long timeStarted = System.currentTimeMillis();
//map.clear()
//map.evictAll()
//map.keySet().forEach(key -> map.delete(key));
map.keySet().forEach(key -> map.removeAsync(key));
long timeComplted = System.currentTimeMillis();
System.out.println("time took using clear::"+(timeComplted - timeStarted));
}
Run Code Online (Sandbox Code Playgroud)
Clear():完成加载到Imap时间使用clear :: 302 CPU消耗过高(200%以上)
ecictAll():完成加载到Imap时使用clear :: 511 CPU消耗过高(200%以上)
使用每个键删除:完成加载到Imap时间使用clear :: 81578 CPU消耗很高(超过200%)
使用asyncRemove删除:已完成加载到Imap时使用clear :: 9818 CPU消耗很高(超过200%)
注意:另一件事是如果缓存有1000万个条目,那么以上都不适用于我的本地.{clear()/ evictAll()/ delete by key}花了很长时间,最后因内存不足而失败.下图是尝试从地图中删除1000万条目时的CPU使用率.
小智 6
无法进行测试测量来进行拍摄只是时间setAsync(或你测试的其他方法):更确切地说,它是测量多少时间clear了,而执行在同一时间其他几个OutOfMemoryException行动是最有可能仍在执行.这就是你看到高CPU使用率的原因; 这不是因为setCPU密集型,而是因为仍有异步操作排队并同时执行.你的紧密循环充斥着Hazelcast的异步操作,而你没有配置任何背压.如果没有配置背压(参见[1]),Hazelcast将只接受任意数量的传入异步操作,您可以setAsync通过充满请求来满足它.为了更好地观察您尝试的4种方法中的每种方法,最好使用IMap#clear()而不是evictAll在循环中,这样可以保证地图完全填充,并且在清除地图时不会发生进一步的操作.
此外,您在上面尝试的4种方法具有完全不同的语义:
IMap:清除地图并在MapStore上调用{@link MapStore#deleteAll} deleteAll,如果连接到数据库,将删除该数据库中的记录.(来自IMapjavadoc).这(或IMap#deleteAll())是清除的首选方法IMap#evictAll()map.keySet().forEach(...);:驱逐此地图中的所有键,但锁定的键除外.如果为此映射定义了MapStor},则此方法不会调用deleteAll.(来自keySetjavadoc).HazelcastInstance变体,通过HazelcastInstance增加内存压力返回映射中所有键的克隆.最后一句话,您setAsync在同一JVM中使用2 s进行简单测试时观察到的结果可能与2 clear个不同主机上2 s 的实际部署完全不同.
[1] http://docs.hazelcast.org/docs/3.9/manual/html-single/index.html#back-pressure
| 归档时间: |
|
| 查看次数: |
3169 次 |
| 最近记录: |