From 3adf32e361332b9207a627a9f8d19a57d970f4f0 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Fri, 11 Feb 2022 13:07:40 +0000 Subject: - Use an unordered map. - Add clarifying comments. - Cap mmaplimit in the range [1M, 1G]. --- vespamalloc/src/vespamalloc/malloc/mmappool.h | 4 ++-- vespamalloc/src/vespamalloc/malloc/threadpool.hpp | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) (limited to 'vespamalloc') diff --git a/vespamalloc/src/vespamalloc/malloc/mmappool.h b/vespamalloc/src/vespamalloc/malloc/mmappool.h index 32c00167c71..c07ef9dce15 100644 --- a/vespamalloc/src/vespamalloc/malloc/mmappool.h +++ b/vespamalloc/src/vespamalloc/malloc/mmappool.h @@ -2,7 +2,7 @@ #pragma once #include -#include +#include namespace vespamalloc { @@ -27,7 +27,7 @@ private: std::atomic _count; std::atomic _has_hugepage_failure_just_happened; mutable std::mutex _mutex; - std::map _mappings; + std::unordered_map _mappings; }; } diff --git a/vespamalloc/src/vespamalloc/malloc/threadpool.hpp b/vespamalloc/src/vespamalloc/malloc/threadpool.hpp index 202a6529c99..31ed1296a9e 100644 --- a/vespamalloc/src/vespamalloc/malloc/threadpool.hpp +++ b/vespamalloc/src/vespamalloc/malloc/threadpool.hpp @@ -6,11 +6,17 @@ namespace vespamalloc { +namespace { + constexpr size_t MMAP_LIMIT_MIN = 0x100000; // 1M + constexpr size_t MMAP_LIMIT_MAX = 0x40000000; // 1G +} + template size_t ThreadPoolT::_threadCacheLimit __attribute__((visibility("hidden"))) = 0x10000; template -void ThreadPoolT::info(FILE * os, size_t level, const DataSegment & ds) const { +void +ThreadPoolT::info(FILE * os, size_t level, const DataSegment & ds) const { if (level > 0) { for (size_t i=0; i < NELEMS(_stat); i++) { const ThreadStatT & s = _stat[i]; @@ -50,7 +56,8 @@ void ThreadPoolT::info(FILE * os, size_t level, const } template -void ThreadPoolT:: +void +ThreadPoolT:: mallocHelper(size_t exactSize, SizeClassT sc, typename ThreadPoolT::AllocFree & af, @@ -73,6 +80,7 @@ mallocHelper(size_t exactSize, } else { if (exactSize > _mmapLimit) { mem = MemBlockPtrT(_mmapPool->mmap(MemBlockPtrT::classSize(sc)), MemBlockPtrT::classSize(sc)); + // The below settings are to allow the sanity checks conducted at the call site to succeed mem.setExact(exactSize); mem.free(); } else { @@ -93,7 +101,7 @@ template ThreadPoolT::ThreadPoolT() : _allocPool(nullptr), _mmapPool(nullptr), - _mmapLimit(0x40000000), + _mmapLimit(MMAP_LIMIT_MAX), _threadId(0), _osThreadId(0) { @@ -104,8 +112,9 @@ ThreadPoolT::~ThreadPoolT() = default; template int ThreadPoolT::mallopt(int param, int value) { + size_t limit = value; if (param == M_MMAP_THRESHOLD) { - _mmapLimit = value; + _mmapLimit = std::min(MMAP_LIMIT_MAX, std::max(MMAP_LIMIT_MIN, limit)); return 1; } return 0; -- cgit v1.2.3