From d4b752081863b2f2f224b1e2042f1bb8a080a05f Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Wed, 5 Sep 2018 11:03:19 +0200 Subject: If memory utilisation is not found to be stable, return the median sample. --- .../process_memory_stats_test.cpp | 8 ++++++++ .../src/vespa/vespalib/util/process_memory_stats.cpp | 19 +++++++++++-------- .../src/vespa/vespalib/util/process_memory_stats.h | 2 ++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/staging_vespalib/src/tests/util/process_memory_stats/process_memory_stats_test.cpp b/staging_vespalib/src/tests/util/process_memory_stats/process_memory_stats_test.cpp index 45e75547fb2..26444fa8606 100644 --- a/staging_vespalib/src/tests/util/process_memory_stats/process_memory_stats_test.cpp +++ b/staging_vespalib/src/tests/util/process_memory_stats/process_memory_stats_test.cpp @@ -80,4 +80,12 @@ TEST("grow mapped memory") munmap(mapAddr, mapLen); } +TEST("order samples") +{ + ProcessMemoryStats a(0,7,0,0,0); + ProcessMemoryStats b(0,8,0,0,0); + EXPECT_TRUE(a < b); + EXPECT_FALSE(b < a); +} + TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/staging_vespalib/src/vespa/vespalib/util/process_memory_stats.cpp b/staging_vespalib/src/vespa/vespalib/util/process_memory_stats.cpp index 138e7a25803..f0cbefd443b 100644 --- a/staging_vespalib/src/vespa/vespalib/util/process_memory_stats.cpp +++ b/staging_vespalib/src/vespa/vespalib/util/process_memory_stats.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -182,18 +183,20 @@ ProcessMemoryStats::toString() const ProcessMemoryStats ProcessMemoryStats::create(uint64_t sizeEpsilon) { - ProcessMemoryStats prevStats = createStatsFromSmaps(); - const size_t NUM_TRIES = 10; + constexpr size_t NUM_TRIES = 10; + std::vector samples; + samples.reserve(NUM_TRIES); + samples.push_back(createStatsFromSmaps()); for (size_t i = 0; i < NUM_TRIES; ++i) { - ProcessMemoryStats currStats = createStatsFromSmaps(); - if (prevStats.similarTo(currStats, sizeEpsilon)) { - return prevStats; + samples.push_back(createStatsFromSmaps()); + if (samples.back().similarTo(*(samples.rbegin()+1), sizeEpsilon)) { + return samples.back(); } LOG(info, "create(): Memory stats have changed, trying to read smaps file again: i=%zu, prevStats={%s}, currStats={%s}", - i, prevStats.toString().c_str(), currStats.toString().c_str()); - prevStats = currStats; + i, (samples.rbegin()+1)->toString().c_str(), samples.back().toString().c_str()); } - return prevStats; + std::sort(samples.begin(), samples.end()); + return samples[samples.size()/2]; } } diff --git a/staging_vespalib/src/vespa/vespalib/util/process_memory_stats.h b/staging_vespalib/src/vespa/vespalib/util/process_memory_stats.h index fe5062f75cd..44c7c378623 100644 --- a/staging_vespalib/src/vespa/vespalib/util/process_memory_stats.h +++ b/staging_vespalib/src/vespa/vespalib/util/process_memory_stats.h @@ -4,6 +4,7 @@ #include #include +#include namespace vespalib { @@ -37,6 +38,7 @@ public: uint64_t getMappingsCount() const { return _mappings_count; } bool similarTo(const ProcessMemoryStats &rhs, uint64_t sizeEpsilon) const; vespalib::string toString() const; + bool operator < (const ProcessMemoryStats & rhs) const { return _mapped_rss < rhs._mapped_rss; } /** for unit tests only */ ProcessMemoryStats(uint64_t, uint64_t, uint64_t, uint64_t, uint64_t); -- cgit v1.2.3