summaryrefslogtreecommitdiffstats
path: root/vespamalloc
diff options
context:
space:
mode:
Diffstat (limited to 'vespamalloc')
-rw-r--r--vespamalloc/src/tests/stacktrace/stacktrace.cpp4
-rw-r--r--vespamalloc/src/vespamalloc/malloc/mmappool.cpp19
-rw-r--r--vespamalloc/src/vespamalloc/malloc/mmappool.h3
-rw-r--r--vespamalloc/src/vespamalloc/malloc/overload.h8
4 files changed, 24 insertions, 10 deletions
diff --git a/vespamalloc/src/tests/stacktrace/stacktrace.cpp b/vespamalloc/src/tests/stacktrace/stacktrace.cpp
index d7f7d45656d..2592222fce3 100644
--- a/vespamalloc/src/tests/stacktrace/stacktrace.cpp
+++ b/vespamalloc/src/tests/stacktrace/stacktrace.cpp
@@ -29,7 +29,7 @@ void verify_that_vespamalloc_datasegment_size_exists() {
assert(info.ordblks == 0);
assert(info.smblks == 0);
assert(info.uordblks > 0);
- assert(info.usmblks == 0);
+ assert(info.usmblks > 0);
#else
struct mallinfo info = mallinfo();
printf("Malloc used %dm of memory\n",info.arena);
@@ -43,7 +43,7 @@ void verify_that_vespamalloc_datasegment_size_exists() {
assert(info.ordblks == 0);
assert(info.smblks == 0);
assert(info.uordblks > 0);
- assert(info.usmblks == 0);
+ assert(info.usmblks > 0);
#endif
}
diff --git a/vespamalloc/src/vespamalloc/malloc/mmappool.cpp b/vespamalloc/src/vespamalloc/malloc/mmappool.cpp
index e43ea2e8342..cee709ed0ed 100644
--- a/vespamalloc/src/vespamalloc/malloc/mmappool.cpp
+++ b/vespamalloc/src/vespamalloc/malloc/mmappool.cpp
@@ -10,6 +10,8 @@ namespace vespamalloc {
MMapPool::MMapPool()
: _page_size(getpagesize()),
_huge_flags((getenv("VESPA_USE_HUGEPAGES") != nullptr) ? MAP_HUGETLB : 0),
+ _peakBytes(0ul),
+ _currentBytes(0ul),
_count(0),
_mutex(),
_mappings()
@@ -28,9 +30,13 @@ MMapPool::getNumMappings() const {
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;
+ return _currentBytes;
+}
+
+size_t
+MMapPool::getMmappedBytesPeak() const {
+ std::lock_guard guard(_mutex);
+ return _peakBytes;
}
void *
@@ -76,10 +82,10 @@ MMapPool::mmap(size_t sz) {
std::lock_guard guard(_mutex);
auto [it, inserted] = _mappings.insert(std::make_pair(buf, MMapInfo(mmapId, sz)));
ASSERT_STACKTRACE(inserted);
+ _currentBytes += sz;
+ _peakBytes = std::max(_peakBytes, _currentBytes);
if (sz >= _G_bigBlockLimit) {
- size_t sum(0);
- std::for_each(_mappings.begin(), _mappings.end(), [&sum](const auto & e){ sum += e.second._sz; });
- fprintf(_G_logFile, "%ld mappings of accumulated size %ld\n", _mappings.size(), sum);
+ fprintf(_G_logFile, "%ld mappings of accumulated size %ld\n", _mappings.size(), _currentBytes);
}
}
return buf;
@@ -98,6 +104,7 @@ MMapPool::unmap(void * ptr) {
}
sz = found->second._sz;
_mappings.erase(found);
+ _currentBytes -= sz;
}
int munmap_ok = ::munmap(ptr, sz);
ASSERT_STACKTRACE(munmap_ok == 0);
diff --git a/vespamalloc/src/vespamalloc/malloc/mmappool.h b/vespamalloc/src/vespamalloc/malloc/mmappool.h
index c0b73c56e4e..0a3dd5d0a0a 100644
--- a/vespamalloc/src/vespamalloc/malloc/mmappool.h
+++ b/vespamalloc/src/vespamalloc/malloc/mmappool.h
@@ -19,6 +19,7 @@ public:
size_t get_size(void *) const;
size_t getNumMappings() const;
size_t getMmappedBytes() const;
+ size_t getMmappedBytesPeak() const;
void info(FILE * os, size_t level) const;
private:
struct MMapInfo {
@@ -28,6 +29,8 @@ private:
};
const size_t _page_size;
const int _huge_flags;
+ size_t _peakBytes;
+ size_t _currentBytes;
std::atomic<size_t> _count;
std::atomic<bool> _has_hugepage_failure_just_happened;
mutable std::mutex _mutex;
diff --git a/vespamalloc/src/vespamalloc/malloc/overload.h b/vespamalloc/src/vespamalloc/malloc/overload.h
index cb57e6b2fa8..bf9710b9b32 100644
--- a/vespamalloc/src/vespamalloc/malloc/overload.h
+++ b/vespamalloc/src/vespamalloc/malloc/overload.h
@@ -119,7 +119,9 @@ struct mallinfo2 mallinfo2() __THROW {
info.smblks = 0;
info.hblkhd = vespamalloc::_GmemP->mmapPool().getNumMappings();
info.hblks = vespamalloc::_GmemP->mmapPool().getMmappedBytes();
- info.usmblks = 0;
+ size_t highwaterMark = vespamalloc::_GmemP->dataSegment().dataSize() +
+ vespamalloc::_GmemP->mmapPool().getMmappedBytesPeak();
+ info.usmblks = highwaterMark;
info.fsmblks = 0;
info.fordblks = vespamalloc::_GmemP->dataSegment().freeSize();
info.uordblks = info.arena + info.hblks - info.fordblks;
@@ -135,7 +137,9 @@ struct mallinfo mallinfo() __THROW {
info.smblks = 0;
info.hblkhd = vespamalloc::_GmemP->mmapPool().getNumMappings();
info.hblks = (vespamalloc::_GmemP->mmapPool().getMmappedBytes() >> 20);
- info.usmblks = 0;
+ size_t highwaterMark = vespamalloc::_GmemP->dataSegment().dataSize() +
+ vespamalloc::_GmemP->mmapPool().getMmappedBytesPeak();
+ info.usmblks = (highwaterMark >> 20);
info.fsmblks = 0;
info.fordblks = (vespamalloc::_GmemP->dataSegment().freeSize() >> 20);
info.uordblks = info.arena + info.hblks - info.fordblks;