From d868575e5122c3a8b349f2eacfaf96114df22dba Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Fri, 23 Jun 2023 10:22:08 +0000 Subject: - Add control of M_MMAP_THRESHOLD with environment variable VESPA_MALLOC_MMAP_THRESHOLD. - Reduce default from 1G to 64M. --- vespamalloc/src/vespamalloc/malloc/threadlist.hpp | 13 ++++++++++++- vespamalloc/src/vespamalloc/malloc/threadpool.h | 4 ++++ vespamalloc/src/vespamalloc/malloc/threadpool.hpp | 9 +++++---- 3 files changed, 21 insertions(+), 5 deletions(-) (limited to 'vespamalloc') 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 namespace vespamalloc { +namespace { + const char * VESPA_MALLOC_MMAP_THRESHOLD = "VESPA_MALLOC_MMAP_THRESHOLD"; +} + template ThreadListT::ThreadListT(AllocPool & allocPool, MMapPool & mmapPool) : _isThreaded(false), @@ -13,8 +18,14 @@ ThreadListT::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 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 @@ -112,9 +114,8 @@ ThreadPoolT::~ThreadPoolT() = default; template int ThreadPoolT::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; -- cgit v1.2.3