summaryrefslogtreecommitdiffstats
path: root/staging_vespalib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@oath.com>2018-09-05 11:03:19 +0200
committerHenning Baldersheim <balder@oath.com>2018-09-05 11:03:19 +0200
commitd4b752081863b2f2f224b1e2042f1bb8a080a05f (patch)
treea89d92052734294924a83c00712b4ccb9b4e6ba0 /staging_vespalib
parent773cdb1ef16386fb7d8d023080cbba811a1073fe (diff)
If memory utilisation is not found to be stable, return the median sample.
Diffstat (limited to 'staging_vespalib')
-rw-r--r--staging_vespalib/src/tests/util/process_memory_stats/process_memory_stats_test.cpp8
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/process_memory_stats.cpp19
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/process_memory_stats.h2
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 <vespa/vespalib/stllike/asciistream.h>
#include <fstream>
#include <sstream>
+#include <algorithm>
#include <vespa/log/log.h>
@@ -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<ProcessMemoryStats> 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 <cstdint>
#include <vespa/vespalib/stllike/string.h>
+#include <vector>
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);