Make lookup offheap buffer configurable (#5696)

* Make lookup offheap buffer configurable

Fixes #3663

* Address comments

* Update docs

* Update docs
This commit is contained in:
Dylan Wylie 2018-05-04 18:00:55 +01:00 committed by Slim Bouguerra
parent c2b5e5ec95
commit 2c5f0038fd
3 changed files with 21 additions and 3 deletions

View File

@ -147,13 +147,16 @@ setting namespaces (broker, peon, historical)
|--------|-----------|-------| |--------|-----------|-------|
|`druid.lookup.namespace.cache.type`|Specifies the type of caching to be used by the namespaces. May be one of [`offHeap`, `onHeap`]. `offHeap` uses a temporary file for off-heap storage of the namespace (memory mapped files). `onHeap` stores all cache on the heap in standard java map types.|`onHeap`| |`druid.lookup.namespace.cache.type`|Specifies the type of caching to be used by the namespaces. May be one of [`offHeap`, `onHeap`]. `offHeap` uses a temporary file for off-heap storage of the namespace (memory mapped files). `onHeap` stores all cache on the heap in standard java map types.|`onHeap`|
|`druid.lookup.namespace.numExtractionThreads`|The number of threads in the thread pool dedicated for lookup extraction and updates. This number may need to be scaled up, if you have a lot of lookups and they take long time to extract, to avoid timeouts.|2| |`druid.lookup.namespace.numExtractionThreads`|The number of threads in the thread pool dedicated for lookup extraction and updates. This number may need to be scaled up, if you have a lot of lookups and they take long time to extract, to avoid timeouts.|2|
|`druid.lookup.namespace.numBufferedEntries`|If using offHeap caching, the number of records to be stored on an on-heap buffer.|100,000|
The cache is populated in different ways depending on the settings below. In general, most namespaces employ The cache is populated in different ways depending on the settings below. In general, most namespaces employ
a `pollPeriod` at the end of which time they poll the remote resource of interest for updates. a `pollPeriod` at the end of which time they poll the remote resource of interest for updates.
`onHeap` uses `ConcurrentMap`s in the java heap, and thus affects garbage collection and heap sizing. `onHeap` uses `ConcurrentMap`s in the java heap, and thus affects garbage collection and heap sizing.
`offHeap` uses a 10MB on-heap buffer and MapDB using memory-mapped files in the java temporary directory. `offHeap` uses an on-heap buffer and MapDB using memory-mapped files in the java temporary directory.
So if total `cachedNamespace` lookup size is in excess of 10MB, the extra will be kept in memory as page cache, and paged in and out by general OS tunings. So if total number of entries in the `cachedNamespace` is in excess of the buffer's configured capacity, the extra will be kept in memory as page cache, and paged in and out by general OS tunings.
It's highly recommended that `druid.lookup.namespace.numBufferedEntries` is set when using `offHeap`, the value should be chosen from the range between 10% and 50% of the number of entries in the lookup.
# Supported Lookups # Supported Lookups

View File

@ -31,6 +31,9 @@ public class NamespaceExtractionConfig
@JsonProperty @JsonProperty
private int numExtractionThreads = 2; private int numExtractionThreads = 2;
@JsonProperty
private int numBufferedEntries = 100_000;
public int getNumExtractionThreads() public int getNumExtractionThreads()
{ {
return numExtractionThreads; return numExtractionThreads;
@ -40,4 +43,16 @@ public class NamespaceExtractionConfig
{ {
this.numExtractionThreads = numExtractionThreads; this.numExtractionThreads = numExtractionThreads;
} }
public int getNumBufferedEntries()
{
return numBufferedEntries;
}
public void setNumBufferedEntries(int numBufferedEntries)
{
this.numBufferedEntries = numBufferedEntries;
}
} }

View File

@ -156,7 +156,7 @@ public class OffHeapNamespaceExtractionCacheManager extends NamespaceExtractionC
.asyncWriteEnable() .asyncWriteEnable()
.mmapFileEnable() .mmapFileEnable()
.commitFileSyncDisable() .commitFileSyncDisable()
.cacheSize(10_000_000) .cacheSize(config.getNumBufferedEntries())
.make(); .make();
try { try {
lifecycle.addMaybeStartHandler( lifecycle.addMaybeStartHandler(