summaryrefslogtreecommitdiffstats
path: root/vespamalloc
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-02-10 22:34:42 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2022-02-11 09:32:25 +0000
commit12b32cdca0a2e98633bd6cc9e83de4c84f926264 (patch)
tree93a554796ec11e94da166fed158ed0cd115daa61 /vespamalloc
parentf0a3e2949aabdc68edb46bde9565a6c062b290e9 (diff)
Expose information on direct mmap allocations.
Diffstat (limited to 'vespamalloc')
-rw-r--r--vespamalloc/src/tests/stacktrace/stacktrace.cpp4
-rw-r--r--vespamalloc/src/vespamalloc/malloc/datasegment.h5
-rw-r--r--vespamalloc/src/vespamalloc/malloc/datasegment.hpp32
-rw-r--r--vespamalloc/src/vespamalloc/malloc/malloc.h1
-rw-r--r--vespamalloc/src/vespamalloc/malloc/mmappool.cpp15
-rw-r--r--vespamalloc/src/vespamalloc/malloc/mmappool.h4
-rw-r--r--vespamalloc/src/vespamalloc/malloc/overload.h16
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;
}