summaryrefslogtreecommitdiffstats
path: root/vespamalloc
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-06-23 10:22:08 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-06-23 10:22:08 +0000
commitd868575e5122c3a8b349f2eacfaf96114df22dba (patch)
tree56a39a17fc2cad5c1b90ec65d045f339f80005d2 /vespamalloc
parent97b15016085dd6f2b515b7051803f92e34b29ab9 (diff)
- Add control of M_MMAP_THRESHOLD with environment variable VESPA_MALLOC_MMAP_THRESHOLD.
- Reduce default from 1G to 64M.
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;