Updated Branches: refs/heads/trunk 0f72806c3 -> e79d9fbf8
Remove memory emergency pressure valve logic patch by Aleksey Yeschenko; reviewed by Jonathan Ellis for CASSANDRA-3534 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/e79d9fbf Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/e79d9fbf Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/e79d9fbf Branch: refs/heads/trunk Commit: e79d9fbf84a35021cafa21d428e08fdd9bee584e Parents: 0f72806 Author: Aleksey Yeschenko <alek...@apache.org> Authored: Mon Mar 11 19:24:27 2013 +0300 Committer: Aleksey Yeschenko <alek...@apache.org> Committed: Mon Mar 11 19:24:27 2013 +0300 ---------------------------------------------------------------------- CHANGES.txt | 1 + NEWS.txt | 6 +++- conf/cassandra.yaml | 25 -------------- .../apache/cassandra/cache/AutoSavingCache.java | 13 ------- src/java/org/apache/cassandra/config/Config.java | 3 -- .../cassandra/config/DatabaseDescriptor.java | 16 --------- .../org/apache/cassandra/service/CacheService.java | 16 --------- .../cassandra/service/CacheServiceMBean.java | 5 --- .../org/apache/cassandra/service/GCInspector.java | 20 ----------- .../apache/cassandra/service/StorageService.java | 26 --------------- test/conf/cassandra.yaml | 1 - .../unit/org/apache/cassandra/db/RowCacheTest.java | 9 ++--- 12 files changed, 9 insertions(+), 132 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 3ea8849..9cf5271 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -13,6 +13,7 @@ * Change order of directory searching for c*.in.sh (CASSANDRA-3983) * Add tool to reset SSTable level (CASSANDRA-5271) * Allow custom configuration loader (CASSANDRA-5045) + * Remove memory emergency pressure valve logic (CASSANDRA-3534) 1.2.3 http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/NEWS.txt ---------------------------------------------------------------------- diff --git a/NEWS.txt b/NEWS.txt index b68a5f4..250545e 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -15,7 +15,11 @@ Upgrading --------- - Replication and strategy options do not accept unknown options anymore. This was already the case for CQL3 in 1.2 but this is now the case for - thrift to. + thrift too. + - reduce_cache_sizes_at, reduce_cache_capacity_to, and + flush_largest_memtables_at options have been removed from cassandra.yaml. + - CacheServiceMBean.reduceCacheSizes() has been removed. + Use CacheServiceMBean.set{Key,Row}CacheCapacityInMB() instead. 1.2.3 http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/conf/cassandra.yaml ---------------------------------------------------------------------- diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml index 2691e47..b3ef2cd 100644 --- a/conf/cassandra.yaml +++ b/conf/cassandra.yaml @@ -237,31 +237,6 @@ seed_provider: # Ex: "<ip1>,<ip2>,<ip3>" - seeds: "127.0.0.1" -# emergency pressure valve: each time heap usage after a full (CMS) -# garbage collection is above this fraction of the max, Cassandra will -# flush the largest memtables. -# -# Set to 1.0 to disable. Setting this lower than -# CMSInitiatingOccupancyFraction is not likely to be useful. -# -# RELYING ON THIS AS YOUR PRIMARY TUNING MECHANISM WILL WORK POORLY: -# it is most effective under light to moderate load, or read-heavy -# workloads; under truly massive write load, it will often be too -# little, too late. -flush_largest_memtables_at: 0.75 - -# emergency pressure valve #2: the first time heap usage after a full -# (CMS) garbage collection is above this fraction of the max, -# Cassandra will reduce cache maximum _capacity_ to the given fraction -# of the current _size_. Should usually be set substantially above -# flush_largest_memtables_at, since that will have less long-term -# impact on the system. -# -# Set to 1.0 to disable. Setting this lower than -# CMSInitiatingOccupancyFraction is not likely to be useful. -reduce_cache_sizes_at: 0.85 -reduce_cache_capacity_to: 0.6 - # For workloads with more data than can fit in memory, Cassandra's # bottleneck will be reads that need to fetch data from # disk. "concurrent_reads" should be set to (16 * number_of_drives) in http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/src/java/org/apache/cassandra/cache/AutoSavingCache.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cache/AutoSavingCache.java b/src/java/org/apache/cassandra/cache/AutoSavingCache.java index 7e4bb77..072385e 100644 --- a/src/java/org/apache/cassandra/cache/AutoSavingCache.java +++ b/src/java/org/apache/cassandra/cache/AutoSavingCache.java @@ -176,19 +176,6 @@ public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K return CompactionManager.instance.submitCacheWrite(getWriter(keysToSave)); } - public void reduceCacheSize() - { - if (getCapacity() > 0) - { - int newCapacity = (int) (DatabaseDescriptor.getReduceCacheCapacityTo() * weightedSize()); - - logger.warn(String.format("Reducing %s capacity from %d to %s to reduce memory pressure", - cacheType, getCapacity(), newCapacity)); - - setCapacity(newCapacity); - } - } - public class Writer extends CompactionInfo.Holder { private final Set<K> keys; http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/src/java/org/apache/cassandra/config/Config.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 2bc1b0e..ce86609 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -144,9 +144,6 @@ public class Config public InternodeCompression internode_compression = InternodeCompression.none; - public Double flush_largest_memtables_at = 1.0; - public Double reduce_cache_sizes_at = 1.0; - public double reduce_cache_capacity_to = 0.6; public int hinted_handoff_throttle_in_kb = 1024; public int max_hints_delivery_threads = 1; public boolean compaction_preheat_key_cache = true; http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/src/java/org/apache/cassandra/config/DatabaseDescriptor.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index fc49bcd..98f671d 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -37,7 +37,6 @@ import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DefsTable; import org.apache.cassandra.db.SystemTable; -import org.apache.cassandra.db.Table; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.FSWriteError; @@ -1107,21 +1106,6 @@ public class DatabaseDescriptor return conf.client_encryption_options; } - public static double getFlushLargestMemtablesAt() - { - return conf.flush_largest_memtables_at; - } - - public static double getReduceCacheSizesAt() - { - return conf.reduce_cache_sizes_at; - } - - public static double getReduceCacheCapacityTo() - { - return conf.reduce_cache_capacity_to; - } - public static int getHintedHandoffThrottleInKB() { return conf.hinted_handoff_throttle_in_kb; http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/src/java/org/apache/cassandra/service/CacheService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/CacheService.java b/src/java/org/apache/cassandra/service/CacheService.java index b0aa693..e389a5d 100644 --- a/src/java/org/apache/cassandra/service/CacheService.java +++ b/src/java/org/apache/cassandra/service/CacheService.java @@ -296,22 +296,6 @@ public class CacheService implements CacheServiceMBean return keyCache.size(); } - public void reduceCacheSizes() - { - reduceRowCacheSize(); - reduceKeyCacheSize(); - } - - public void reduceRowCacheSize() - { - rowCache.reduceCacheSize(); - } - - public void reduceKeyCacheSize() - { - keyCache.reduceCacheSize(); - } - public void saveCaches() throws ExecutionException, InterruptedException { List<Future<?>> futures = new ArrayList<Future<?>>(2); http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/src/java/org/apache/cassandra/service/CacheServiceMBean.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/CacheServiceMBean.java b/src/java/org/apache/cassandra/service/CacheServiceMBean.java index 8b8adf2..8e2f530 100644 --- a/src/java/org/apache/cassandra/service/CacheServiceMBean.java +++ b/src/java/org/apache/cassandra/service/CacheServiceMBean.java @@ -42,11 +42,6 @@ public interface CacheServiceMBean public void setKeyCacheCapacityInMB(long capacity); /** - * sets each cache's maximum capacity to "reduce_cache_capacity_to" of its current size - */ - public void reduceCacheSizes(); - - /** * save row and key caches * * @throws ExecutionException when attempting to retrieve the result of a task that aborted by throwing an exception http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/src/java/org/apache/cassandra/service/GCInspector.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/GCInspector.java b/src/java/org/apache/cassandra/service/GCInspector.java index bca8e1c..9961bf9 100644 --- a/src/java/org/apache/cassandra/service/GCInspector.java +++ b/src/java/org/apache/cassandra/service/GCInspector.java @@ -31,7 +31,6 @@ import javax.management.ObjectName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.io.sstable.SSTableDeletingTask; import org.apache.cassandra.utils.StatusLogger; @@ -50,8 +49,6 @@ public class GCInspector final List<GarbageCollectorMXBean> beans = new ArrayList<GarbageCollectorMXBean>(); final MemoryMXBean membean = ManagementFactory.getMemoryMXBean(); - private volatile boolean cacheSizesReduced; - public GCInspector() { MBeanServer server = ManagementFactory.getPlatformMBeanServer(); @@ -125,24 +122,7 @@ public class GCInspector // if we just finished a full collection and we're still using a lot of memory, try to reduce the pressure if (gc.getName().equals("ConcurrentMarkSweep")) - { SSTableDeletingTask.rescheduleFailedTasks(); - - double usage = (double) memoryUsed / memoryMax; - - if (memoryUsed > DatabaseDescriptor.getReduceCacheSizesAt() * memoryMax && !cacheSizesReduced) - { - cacheSizesReduced = true; - logger.warn("Heap is " + usage + " full. You may need to reduce memtable and/or cache sizes. Cassandra is now reducing cache sizes to free up memory. Adjust reduce_cache_sizes_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically"); - CacheService.instance.reduceCacheSizes(); - } - - if (memoryUsed > DatabaseDescriptor.getFlushLargestMemtablesAt() * memoryMax) - { - logger.warn("Heap is " + usage + " full. You may need to reduce memtable and/or cache sizes. Cassandra will now flush up to the two largest memtables to free up memory. Adjust flush_largest_memtables_at threshold in cassandra.yaml if you don't want Cassandra to do this automatically"); - StorageService.instance.flushLargestMemtables(); - } - } } } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/src/java/org/apache/cassandra/service/StorageService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 77b3c4a..9101a4c 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -3517,32 +3517,6 @@ public class StorageService extends NotificationBroadcasterSupport implements IE } /** - * Flushes the two largest memtables by ops and by throughput - */ - public void flushLargestMemtables() - { - ColumnFamilyStore largest = null; - for (ColumnFamilyStore cfs : ColumnFamilyStore.all()) - { - long total = cfs.getTotalMemtableLiveSize(); - - if (total > 0 && (largest == null || total > largest.getTotalMemtableLiveSize())) - { - logger.debug(total + " estimated memtable size for " + cfs); - largest = cfs; - } - } - if (largest == null) - { - logger.info("Unable to reduce heap usage since there are no dirty column families"); - return; - } - - logger.warn("Flushing " + largest + " to relieve memory pressure"); - largest.forceFlush(); - } - - /** * Seed data to the endpoints that will be responsible for it at the future * * @param rangesToStreamByTable tables and data ranges with endpoints included for each http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/test/conf/cassandra.yaml ---------------------------------------------------------------------- diff --git a/test/conf/cassandra.yaml b/test/conf/cassandra.yaml index 133e033..a207bc6 100644 --- a/test/conf/cassandra.yaml +++ b/test/conf/cassandra.yaml @@ -31,5 +31,4 @@ server_encryption_options: truststore: conf/.truststore truststore_password: cassandra incremental_backups: true -flush_largest_memtables_at: 1.0 compaction_throughput_mb_per_sec: 0 http://git-wip-us.apache.org/repos/asf/cassandra/blob/e79d9fbf/test/unit/org/apache/cassandra/db/RowCacheTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/RowCacheTest.java b/test/unit/org/apache/cassandra/db/RowCacheTest.java index c75cbc7..3dfef4d 100644 --- a/test/unit/org/apache/cassandra/db/RowCacheTest.java +++ b/test/unit/org/apache/cassandra/db/RowCacheTest.java @@ -114,7 +114,7 @@ public class RowCacheTest extends SchemaLoader public void testRowCacheLoad() throws Exception { CacheService.instance.setRowCacheCapacityInMB(1); - rowCacheLoad(100, Integer.MAX_VALUE, false); + rowCacheLoad(100, Integer.MAX_VALUE); CacheService.instance.setRowCacheCapacityInMB(0); } @@ -122,11 +122,11 @@ public class RowCacheTest extends SchemaLoader public void testRowCachePartialLoad() throws Exception { CacheService.instance.setRowCacheCapacityInMB(1); - rowCacheLoad(100, 50, true); + rowCacheLoad(100, 50); CacheService.instance.setRowCacheCapacityInMB(0); } - public void rowCacheLoad(int totalKeys, int keysToSave, boolean reduceLoadCapacity) throws Exception + public void rowCacheLoad(int totalKeys, int keysToSave) throws Exception { CompactionManager.instance.disableAutoCompaction(); @@ -144,9 +144,6 @@ public class RowCacheTest extends SchemaLoader // force the cache to disk CacheService.instance.rowCache.submitWrite(keysToSave).get(); - if (reduceLoadCapacity) - CacheService.instance.reduceRowCacheSize(); - // empty the cache again to make sure values came from disk CacheService.instance.invalidateRowCache(); assert CacheService.instance.rowCache.size() == 0;