summaryrefslogtreecommitdiffstats
path: root/vespamalloc
diff options
context:
space:
mode:
Diffstat (limited to 'vespamalloc')
-rw-r--r--vespamalloc/src/vespamalloc/malloc/threadlist.hpp13
-rw-r--r--vespamalloc/src/vespamalloc/malloc/threadpool.h4
-rw-r--r--vespamalloc/src/vespamalloc/malloc/threadpool.hpp9
3 files changed, 21 insertions, 5 deletions
diff --git a/vespamalloc/src/vespamalloc/malloc/threadlist.hpp b/vespamalloc/src/vespamalloc/malloc/threadlist.hpp
index 743090a4e12..e22b93c48fe 100644
--- a/vespamalloc/src/vespamalloc/malloc/threadlist.hpp
+++ b/vespamalloc/src/vespamalloc/malloc/threadlist.hpp
@@ -2,9 +2,14 @@
#pragma once
#include "threadlist.h"
+#include <malloc.h>
namespace vespamalloc {
+namespace {
+ const char * VESPA_MALLOC_MMAP_THRESHOLD = "VESPA_MALLOC_MMAP_THRESHOLD";
+}
+
template <typename MemBlockPtrT, typename ThreadStatT>
ThreadListT<MemBlockPtrT, ThreadStatT>::ThreadListT(AllocPool & allocPool, MMapPool & mmapPool) :
_isThreaded(false),
@@ -13,8 +18,14 @@ ThreadListT<MemBlockPtrT, ThreadStatT>::ThreadListT(AllocPool & allocPool, MMapP
_allocPool(allocPool),
_mmapPool(mmapPool)
{
+ const char * mmapThresholdS = getenv(VESPA_MALLOC_MMAP_THRESHOLD);
+ int mmapThreshold = (mmapThresholdS != nullptr)
+ ? strtol(mmapThresholdS, nullptr, 0)
+ : MMAP_LIMIT_DEFAULT;
for (size_t i = 0; i < getMaxNumThreads(); i++) {
- _threadVector[i].setPool(_allocPool, _mmapPool);
+ auto & thread = _threadVector[i];
+ thread.setPool(_allocPool, _mmapPool);
+ thread.mallopt(M_MMAP_THRESHOLD, mmapThreshold);
}
}
diff --git a/vespamalloc/src/vespamalloc/malloc/threadpool.h b/vespamalloc/src/vespamalloc/malloc/threadpool.h
index 30ece02ba29..750833084ca 100644
--- a/vespamalloc/src/vespamalloc/malloc/threadpool.h
+++ b/vespamalloc/src/vespamalloc/malloc/threadpool.h
@@ -9,6 +9,10 @@
namespace vespamalloc {
+constexpr int MMAP_LIMIT_MIN = 0x100000; // 1M
+constexpr int MMAP_LIMIT_DEFAULT = 0x4000000; // 64M
+constexpr int MMAP_LIMIT_MAX = 0x40000000; // 1G
+
template <typename MemBlockPtrT, typename ThreadStatT >
class ThreadPoolT
{
diff --git a/vespamalloc/src/vespamalloc/malloc/threadpool.hpp b/vespamalloc/src/vespamalloc/malloc/threadpool.hpp
index b5a283f6600..e62fa0f2fdf 100644
--- a/vespamalloc/src/vespamalloc/malloc/threadpool.hpp
+++ b/vespamalloc/src/vespamalloc/malloc/threadpool.hpp
@@ -7,8 +7,10 @@
namespace vespamalloc {
namespace {
- constexpr size_t MMAP_LIMIT_MIN = 0x100000; // 1M
- constexpr size_t MMAP_LIMIT_MAX = 0x40000000; // 1G
+ size_t
+ sanitizeMMapThreshold(int threshold) {
+ return std::min(MMAP_LIMIT_MAX, std::max(MMAP_LIMIT_MIN, threshold));
+ }
}
template <typename MemBlockPtrT, typename ThreadStatT>
@@ -112,9 +114,8 @@ ThreadPoolT<MemBlockPtrT, ThreadStatT>::~ThreadPoolT() = default;
template <typename MemBlockPtrT, typename ThreadStatT >
int ThreadPoolT<MemBlockPtrT, ThreadStatT>::mallopt(int param, int value) {
- size_t limit = value;
if (param == M_MMAP_THRESHOLD) {
- _mmapLimit = std::min(MMAP_LIMIT_MAX, std::max(MMAP_LIMIT_MIN, limit));
+ _mmapLimit = sanitizeMMapThreshold(value);
return 1;
}
return 0;