diff options
Diffstat (limited to 'vespamalloc/src')
-rw-r--r-- | vespamalloc/src/tests/stacktrace/stacktrace.cpp | 4 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/datasegment.h | 5 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/datasegment.hpp | 32 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/malloc.h | 1 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/mmappool.cpp | 15 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/mmappool.h | 4 | ||||
-rw-r--r-- | vespamalloc/src/vespamalloc/malloc/overload.h | 16 |
7 files changed, 55 insertions, 22 deletions
diff --git a/vespamalloc/src/tests/stacktrace/stacktrace.cpp b/vespamalloc/src/tests/stacktrace/stacktrace.cpp index 2f0d2eb2277..40d77b20e27 100644 --- a/vespamalloc/src/tests/stacktrace/stacktrace.cpp +++ b/vespamalloc/src/tests/stacktrace/stacktrace.cpp @@ -28,7 +28,7 @@ void verify_that_vespamalloc_datasegment_size_exists() { assert(info.keepcost == 0); assert(info.ordblks == 0); assert(info.smblks == 0); - assert(info.uordblks == 0); + assert(info.uordblks > 0); assert(info.usmblks == 0); #else struct mallinfo info = mallinfo(); @@ -42,7 +42,7 @@ void verify_that_vespamalloc_datasegment_size_exists() { assert(info.keepcost == 0); assert(info.ordblks == 0); assert(info.smblks == 0); - assert(info.uordblks == 0); + assert(info.uordblks > 0); assert(info.usmblks == 0); #endif } diff --git a/vespamalloc/src/vespamalloc/malloc/datasegment.h b/vespamalloc/src/vespamalloc/malloc/datasegment.h index 5c65f3703a7..d03a585ccc2 100644 --- a/vespamalloc/src/vespamalloc/malloc/datasegment.h +++ b/vespamalloc/src/vespamalloc/malloc/datasegment.h @@ -28,7 +28,7 @@ public: static SizeClassT adjustedSizeClass(size_t sz) { return (sz >> 16) + 0x400; } static size_t adjustedClassSize(SizeClassT sc) { return (sc > 0x400) ? (sc - 0x400) << 16 : sc; } size_t dataSize() const { return (const char*)end() - (const char*)start(); } - size_t textSize() const { return size_t(start()); } + size_t freeSize() const; size_t infoThread(FILE * os, int level, uint32_t thread, SizeClassT sct, uint32_t maxThreadId=0) const __attribute__((noinline)); void info(FILE * os, size_t level) __attribute__((noinline)); void setupLog(size_t bigMemLogLevel, size_t bigLimit, size_t bigIncrement, size_t allocs2Show) @@ -99,7 +99,8 @@ private: _count--; } } - size_t info(FILE * os, int level) __attribute__((noinline)); + size_t numFreeBlocks() const; + void info(FILE * os) __attribute__((noinline)); private: void * linkOut(size_t findex, size_t left) __attribute__((noinline)); BlockT *_blockList; diff --git a/vespamalloc/src/vespamalloc/malloc/datasegment.hpp b/vespamalloc/src/vespamalloc/malloc/datasegment.hpp index 75ca07a5cf4..80a70b6b5bc 100644 --- a/vespamalloc/src/vespamalloc/malloc/datasegment.hpp +++ b/vespamalloc/src/vespamalloc/malloc/datasegment.hpp @@ -39,6 +39,12 @@ DataSegment<MemBlockPtrT>::DataSegment() : } template<typename MemBlockPtrT> +size_t +DataSegment<MemBlockPtrT>::freeSize() const { + return _freeList.numFreeBlocks() * BlockSize; +} + +template<typename MemBlockPtrT> void * DataSegment<MemBlockPtrT>::getBlock(size_t & oldBlockSize, SizeClassT sc) { const size_t minBlockSize = std::max(size_t(BlockSize), _osMemory.getMinBlockSize()); @@ -273,12 +279,10 @@ void DataSegment<MemBlockPtrT>::info(FILE * os, size_t level) { fprintf(os, "Start at %p, End at %p(%p) size(%ld) partialExtension(%ld) NextLogLimit(%lx) logLevel(%ld)\n", _osMemory.getStart(), _osMemory.getEnd(), sbrk(0), dataSize(), _partialExtension, _nextLogLimit, level); - size_t numFreeBlocks(0), numAllocatedBlocks(0); - { - // Guard sync(_mutex); - numFreeBlocks = _freeList.info(os, level); - _unMappedList.info(os, level); - } + size_t numAllocatedBlocks(0); + size_t numFreeBlocks = _freeList.numFreeBlocks(); + _freeList.info(os); + _unMappedList.info(os); if (level >= 1) { #ifdef PRINT_ALOT SizeClassT oldSc(-17); @@ -430,16 +434,26 @@ size_t DataSegment<MemBlockPtrT>::FreeListT<MaxCount>::lastBlock(size_t nextBloc template<typename MemBlockPtrT> template <int MaxCount> -size_t DataSegment<MemBlockPtrT>::FreeListT<MaxCount>::info(FILE * os, int UNUSED(level)) +void DataSegment<MemBlockPtrT>::FreeListT<MaxCount>::info(FILE * os) { - size_t freeBlockCount(0); for (size_t i=0; i < _count; i++) { size_t index(_freeStartIndex[i]); const BlockT & b = _blockList[index]; - freeBlockCount += b.freeChainLength(); fprintf(os, "Free #%3ld block #%5ld chainlength %5d size %10lu\n", i, index, b.freeChainLength(), size_t(b.freeChainLength())*BlockSize); } +} + +template<typename MemBlockPtrT> +template <int MaxCount> +size_t DataSegment<MemBlockPtrT>::FreeListT<MaxCount>::numFreeBlocks() const +{ + size_t freeBlockCount(0); + for (size_t i=0; i < _count; i++) { + size_t index(_freeStartIndex[i]); + const BlockT & b = _blockList[index]; + freeBlockCount += b.freeChainLength(); + } return freeBlockCount; } diff --git a/vespamalloc/src/vespamalloc/malloc/malloc.h b/vespamalloc/src/vespamalloc/malloc/malloc.h index 4225691329d..f35184cc581 100644 --- a/vespamalloc/src/vespamalloc/malloc/malloc.h +++ b/vespamalloc/src/vespamalloc/malloc/malloc.h @@ -77,6 +77,7 @@ public: _allocPool.setParams(threadCacheLimit); } const DataSegment<MemBlockPtrT> & dataSegment() const { return _segment; } + const MMapPool & mmapPool() const { return _mmapPool; } private: void freeSC(void *ptr, SizeClassT sc); void crash() __attribute__((noinline));; diff --git a/vespamalloc/src/vespamalloc/malloc/mmappool.cpp b/vespamalloc/src/vespamalloc/malloc/mmappool.cpp index eb17f5b9666..296471e54a2 100644 --- a/vespamalloc/src/vespamalloc/malloc/mmappool.cpp +++ b/vespamalloc/src/vespamalloc/malloc/mmappool.cpp @@ -19,6 +19,21 @@ MMapPool::MMapPool() MMapPool::~MMapPool() { assert(_mappings.empty()); } + +size_t +MMapPool::getNumMappings() const { + std::lock_guard guard(_mutex); + return _mappings.size(); +} + +size_t +MMapPool::getMmappedBytes() const { + std::lock_guard guard(_mutex); + size_t sum(0); + std::for_each(_mappings.begin(), _mappings.end(), [&sum](const auto & e){ sum += e.second._sz; }); + return sum; +} + void * MMapPool::mmap(size_t sz) { void * buf(nullptr); diff --git a/vespamalloc/src/vespamalloc/malloc/mmappool.h b/vespamalloc/src/vespamalloc/malloc/mmappool.h index 7dc38c12826..32c00167c71 100644 --- a/vespamalloc/src/vespamalloc/malloc/mmappool.h +++ b/vespamalloc/src/vespamalloc/malloc/mmappool.h @@ -14,6 +14,8 @@ public: ~MMapPool(); void * mmap(size_t sz); void unmap(void *); + size_t getNumMappings() const; + size_t getMmappedBytes() const; private: struct MMapInfo { MMapInfo(size_t id, size_t sz) : _id(id), _sz(sz) { } @@ -24,7 +26,7 @@ private: const int _huge_flags; std::atomic<size_t> _count; std::atomic<bool> _has_hugepage_failure_just_happened; - std::mutex _mutex; + mutable std::mutex _mutex; std::map<const void *, MMapInfo> _mappings; }; diff --git a/vespamalloc/src/vespamalloc/malloc/overload.h b/vespamalloc/src/vespamalloc/malloc/overload.h index 7d9c2b9c72e..6650f107ca9 100644 --- a/vespamalloc/src/vespamalloc/malloc/overload.h +++ b/vespamalloc/src/vespamalloc/malloc/overload.h @@ -113,12 +113,12 @@ struct mallinfo2 mallinfo2() __THROW { info.arena = vespamalloc::_GmemP->dataSegment().dataSize(); info.ordblks = 0; info.smblks = 0; - info.hblks = 0; - info.hblkhd = 0; + info.hblkhd = vespamalloc::_GmemP->mmapPool().getNumMappings(); + info.hblks = vespamalloc::_GmemP->mmapPool().getMmappedBytes(); info.usmblks = 0; info.fsmblks = 0; - info.uordblks = 0; - info.fordblks = 0; + info.fordblks = vespamalloc::_GmemP->dataSegment().freeSize(); + info.uordblks = info.arena + info.hblks - info.fordblks; info.keepcost = 0; return info; } @@ -129,12 +129,12 @@ struct mallinfo mallinfo() __THROW { info.arena = (vespamalloc::_GmemP->dataSegment().dataSize() >> 20); // Note reporting in 1M blocks info.ordblks = 0; info.smblks = 0; - info.hblks = 0; - info.hblkhd = 0; + info.hblkhd = vespamalloc::_GmemP->mmapPool().getNumMappings(); + info.hblks = (vespamalloc::_GmemP->mmapPool().getMmappedBytes() >> 20); info.usmblks = 0; info.fsmblks = 0; - info.uordblks = 0; - info.fordblks = 0; + info.fordblks = (vespamalloc::_GmemP->dataSegment().freeSize() >> 20); + info.uordblks = info.arena + info.hblks - info.fordblks; info.keepcost = 0; return info; } |