diff options
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/mmappool.h | 4 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/threadpool.hpp | 17 |
2 files changed, 15 insertions, 6 deletions
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 <atomic> -#include <map> +#include <unordered_map> namespace vespamalloc { @@ -27,7 +27,7 @@ private: std::atomic<size_t> _count; std::atomic<bool> _has_hugepage_failure_just_happened; mutable std::mutex _mutex; - std::map<const void *, MMapInfo> _mappings; + std::unordered_map<const void *, MMapInfo> _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 <typename MemBlockPtrT, typename ThreadStatT> size_t ThreadPoolT<MemBlockPtrT, ThreadStatT>::_threadCacheLimit __attribute__((visibility("hidden"))) = 0x10000; template <typename MemBlockPtrT, typename ThreadStatT> -void ThreadPoolT<MemBlockPtrT, ThreadStatT>::info(FILE * os, size_t level, const DataSegment<MemBlockPtrT> & ds) const { +void +ThreadPoolT<MemBlockPtrT, ThreadStatT>::info(FILE * os, size_t level, const DataSegment<MemBlockPtrT> & 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<MemBlockPtrT, ThreadStatT>::info(FILE * os, size_t level, const } template <typename MemBlockPtrT, typename ThreadStatT > -void ThreadPoolT<MemBlockPtrT, ThreadStatT>:: +void +ThreadPoolT<MemBlockPtrT, ThreadStatT>:: mallocHelper(size_t exactSize, SizeClassT sc, typename ThreadPoolT<MemBlockPtrT, ThreadStatT>::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 <typename MemBlockPtrT, typename ThreadStatT > ThreadPoolT<MemBlockPtrT, ThreadStatT>::ThreadPoolT() : _allocPool(nullptr), _mmapPool(nullptr), - _mmapLimit(0x40000000), + _mmapLimit(MMAP_LIMIT_MAX), _threadId(0), _osThreadId(0) { @@ -104,8 +112,9 @@ 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 = value; + _mmapLimit = std::min(MMAP_LIMIT_MAX, std::max(MMAP_LIMIT_MIN, limit)); return 1; } return 0; |