mirror of https://github.com/apache/cassandra
Use allocator information to improve memtable memory usage estimate
patch by jbellis; reviewed by jasobrown for CASSANDRA-5497
This commit is contained in:
parent
36f8a5d81a
commit
7d36c1e025
|
|
@ -1,5 +1,8 @@
|
||||||
1.1.12
|
1.1.12
|
||||||
* Add retry mechanism to OTC for non-droppable_verbs (CASSANDRA-5393)
|
* Add retry mechanism to OTC for non-droppable_verbs (CASSANDRA-5393)
|
||||||
|
* Use allocator information to improve memtable memory usage estimate
|
||||||
|
(CASSANDRA-5497)
|
||||||
|
|
||||||
|
|
||||||
1.1.11
|
1.1.11
|
||||||
* Fix trying to load deleted row into row cache on startup (CASSANDRA-4463)
|
* Fix trying to load deleted row into row cache on startup (CASSANDRA-4463)
|
||||||
|
|
|
||||||
|
|
@ -120,9 +120,18 @@ public class Memtable
|
||||||
|
|
||||||
public long getLiveSize()
|
public long getLiveSize()
|
||||||
{
|
{
|
||||||
|
|
||||||
// 25% fudge factor on the base throughput * liveRatio calculation. (Based on observed
|
// 25% fudge factor on the base throughput * liveRatio calculation. (Based on observed
|
||||||
// pre-slabbing behavior -- not sure what accounts for this. May have changed with introduction of slabbing.)
|
// pre-slabbing behavior -- not sure what accounts for this. May have changed with introduction of slabbing.)
|
||||||
return (long) (currentSize.get() * cfs.liveRatio * 1.25);
|
long estimatedSize = (long) (currentSize.get() * cfs.liveRatio * 1.25);
|
||||||
|
|
||||||
|
// cap the estimate at both ends by what the allocator can tell us
|
||||||
|
if (estimatedSize < allocator.getMinimumSize())
|
||||||
|
return allocator.getMinimumSize();
|
||||||
|
if (estimatedSize > allocator.getMaximumSize())
|
||||||
|
return allocator.getMaximumSize();
|
||||||
|
|
||||||
|
return estimatedSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getSerializedSize()
|
public long getSerializedSize()
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ package org.apache.cassandra.utils;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
|
@ -49,7 +50,8 @@ public class SlabAllocator extends Allocator
|
||||||
private final static int MAX_CLONED_SIZE = 128 * 1024; // bigger than this don't go in the region
|
private final static int MAX_CLONED_SIZE = 128 * 1024; // bigger than this don't go in the region
|
||||||
|
|
||||||
private final AtomicReference<Region> currentRegion = new AtomicReference<Region>();
|
private final AtomicReference<Region> currentRegion = new AtomicReference<Region>();
|
||||||
private volatile int regionCount;
|
private volatile int regionCount = 0;
|
||||||
|
private AtomicLong unslabbed = new AtomicLong(0);
|
||||||
|
|
||||||
public ByteBuffer allocate(int size)
|
public ByteBuffer allocate(int size)
|
||||||
{
|
{
|
||||||
|
|
@ -60,7 +62,10 @@ public class SlabAllocator extends Allocator
|
||||||
// satisfy large allocations directly from JVM since they don't cause fragmentation
|
// satisfy large allocations directly from JVM since they don't cause fragmentation
|
||||||
// as badly, and fill up our regions quickly
|
// as badly, and fill up our regions quickly
|
||||||
if (size > MAX_CLONED_SIZE)
|
if (size > MAX_CLONED_SIZE)
|
||||||
|
{
|
||||||
|
unslabbed.addAndGet(size);
|
||||||
return ByteBuffer.allocate(size);
|
return ByteBuffer.allocate(size);
|
||||||
|
}
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
|
@ -105,6 +110,22 @@ public class SlabAllocator extends Allocator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return a lower bound on how much space has been allocated
|
||||||
|
*/
|
||||||
|
public long getMinimumSize()
|
||||||
|
{
|
||||||
|
return unslabbed.get() + (regionCount - 1) * REGION_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an upper bound on how much space has been allocated
|
||||||
|
*/
|
||||||
|
public long getMaximumSize()
|
||||||
|
{
|
||||||
|
return unslabbed.get() + regionCount * REGION_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A region of memory out of which allocations are sliced.
|
* A region of memory out of which allocations are sliced.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue