summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorGeir Storli <geirst@oath.com>2017-09-19 14:38:18 +0000
committerGeir Storli <geirst@oath.com>2017-09-27 04:31:20 +0000
commit3aceae6172772a79ff467ca6654fdc5c1e4b44c2 (patch)
treec3cf5019c9a795efe4ab69afdb3243d2d9f90863 /searchcore
parente87be0cd3f23a3e4af62aad6dd38fb62ff733947 (diff)
Extend HwInfo with disk size, if disk is shared and memory size and sample sizes if not specified in config.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/tests/proton/attribute/attributeflush_test.cpp6
-rw-r--r--searchcore/src/tests/proton/common/hw_info_sampler/hw_info_sampler_test.cpp39
-rw-r--r--searchcore/src/vespa/searchcore/proton/attribute/flushableattribute.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/CMakeLists.txt1
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/hw_info.h41
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.cpp70
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.h34
-rw-r--r--searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoreflushtarget.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/proton.cpp13
9 files changed, 157 insertions, 51 deletions
diff --git a/searchcore/src/tests/proton/attribute/attributeflush_test.cpp b/searchcore/src/tests/proton/attribute/attributeflush_test.cpp
index ecb39af61bc..ce0a6bffc0d 100644
--- a/searchcore/src/tests/proton/attribute/attributeflush_test.cpp
+++ b/searchcore/src/tests/proton/attribute/attributeflush_test.cpp
@@ -577,7 +577,7 @@ Test::requireThatFlushedAttributeCanBeLoaded(const HwInfo &hwInfo)
{
constexpr uint32_t numDocs = 100;
BaseFixture f(hwInfo);
- vespalib::string attrName(hwInfo.slowDisk() ? "a11slow" : "a11fast");
+ vespalib::string attrName(hwInfo.disk().slow() ? "a11slow" : "a11fast");
{
AttributeManagerFixture amf(f);
AttributeManager &am = amf._m;
@@ -606,8 +606,8 @@ Test::requireThatFlushedAttributeCanBeLoaded(const HwInfo &hwInfo)
void
Test::requireThatFlushedAttributeCanBeLoaded()
{
- TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(false)));
- TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(true)));
+ TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(HwInfo::Disk(0, false, false), HwInfo::Memory(0))));
+ TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(HwInfo::Disk(0, true, false), HwInfo::Memory(0))));
}
int
diff --git a/searchcore/src/tests/proton/common/hw_info_sampler/hw_info_sampler_test.cpp b/searchcore/src/tests/proton/common/hw_info_sampler/hw_info_sampler_test.cpp
index f9745d7fd03..c39a8163e00 100644
--- a/searchcore/src/tests/proton/common/hw_info_sampler/hw_info_sampler_test.cpp
+++ b/searchcore/src/tests/proton/common/hw_info_sampler/hw_info_sampler_test.cpp
@@ -18,6 +18,7 @@ namespace {
const vespalib::string test_dir = "temp";
constexpr uint64_t sampleLen = 1024 * 1024 * 40;
+constexpr bool sharedDisk = false;
long time_point_to_long(Clock::time_point tp)
{
@@ -44,11 +45,11 @@ struct Fixture
TEST_F("Test that hw_info_sampler uses override info", Fixture)
{
- Config samplerCfg(75.0, 100.0, sampleLen);
+ Config samplerCfg(0, 75.0, 100.0, sampleLen, sharedDisk, 0);
HwInfoSampler sampler(test_dir, samplerCfg);
EXPECT_EQUAL(75.0, sampler.diskWriteSpeed());
EXPECT_NOT_EQUAL(0, time_point_to_long(sampler.sampleTime()));
- EXPECT_TRUE(sampler.hwInfo().slowDisk());
+ EXPECT_TRUE(sampler.hwInfo().disk().slow());
}
TEST_F("Test that hw_info_sampler uses saved info", Fixture)
@@ -57,16 +58,16 @@ TEST_F("Test that hw_info_sampler uses saved info", Fixture)
builder.disk.writespeed = 72.0;
builder.disk.sampletime = time_point_to_long(Clock::now());
f.writeConfig(builder);
- Config samplerCfg(0.0, 70.0, sampleLen);
+ Config samplerCfg(0, 0.0, 70.0, sampleLen, sharedDisk, 0);
HwInfoSampler sampler(test_dir, samplerCfg);
EXPECT_EQUAL(builder.disk.writespeed, sampler.diskWriteSpeed());
EXPECT_EQUAL(builder.disk.sampletime, time_point_to_long(sampler.sampleTime()));
- EXPECT_FALSE(sampler.hwInfo().slowDisk());
+ EXPECT_FALSE(sampler.hwInfo().disk().slow());
}
TEST_F("Test that hw_info_sampler can sample disk write speed", Fixture)
{
- Config samplerCfg(0.0, 100.0, sampleLen);
+ Config samplerCfg(0, 0.0, 100.0, sampleLen, sharedDisk, 0);
HwInfoSampler sampler(test_dir, samplerCfg);
ASSERT_NOT_EQUAL(0.0, sampler.diskWriteSpeed());
ASSERT_NOT_EQUAL(0, time_point_to_long(sampler.sampleTime()));
@@ -76,6 +77,34 @@ TEST_F("Test that hw_info_sampler can sample disk write speed", Fixture)
time_point_to_long(sampler2.sampleTime()));
}
+TEST_F("require that disk size can be specified", Fixture)
+{
+ Config samplerCfg(1024, 1.0, 0.0, sampleLen, sharedDisk, 0);
+ HwInfoSampler sampler(test_dir, samplerCfg);
+ EXPECT_EQUAL(1024u, sampler.hwInfo().disk().sizeBytes());
+}
+
+TEST_F("require that disk size can be sampled", Fixture)
+{
+ Config samplerCfg(0, 1.0, 0.0, sampleLen, sharedDisk, 0);
+ HwInfoSampler sampler(test_dir, samplerCfg);
+ EXPECT_GREATER(sampler.hwInfo().disk().sizeBytes(), 0u);
+}
+
+TEST_F("require that memory size can be specified", Fixture)
+{
+ Config samplerCfg(0, 1.0, 0.0, sampleLen, sharedDisk, 1024);
+ HwInfoSampler sampler(test_dir, samplerCfg);
+ EXPECT_EQUAL(1024u, sampler.hwInfo().memory().sizeBytes());
+}
+
+TEST_F("require that memory size can be sampled", Fixture)
+{
+ Config samplerCfg(0, 1.0, 0.0, sampleLen, sharedDisk, 0);
+ HwInfoSampler sampler(test_dir, samplerCfg);
+ EXPECT_GREATER(sampler.hwInfo().memory().sizeBytes(), 0u);
+}
+
TEST_MAIN()
{
vespalib::rmdir(test_dir, true);
diff --git a/searchcore/src/vespa/searchcore/proton/attribute/flushableattribute.cpp b/searchcore/src/vespa/searchcore/proton/attribute/flushableattribute.cpp
index 43dc3237685..a658b11263a 100644
--- a/searchcore/src/vespa/searchcore/proton/attribute/flushableattribute.cpp
+++ b/searchcore/src/vespa/searchcore/proton/attribute/flushableattribute.cpp
@@ -92,7 +92,7 @@ FlushableAttribute::Flusher::saveAttribute()
_syncToken);
bool saveSuccess = true;
if (_saver && _saver->hasGenerationGuard() &&
- _fattr._hwInfo.slowDisk()) {
+ _fattr._hwInfo.disk().slow()) {
saveSuccess = _saver->save(_saveTarget);
_saver.reset();
}
diff --git a/searchcore/src/vespa/searchcore/proton/common/CMakeLists.txt b/searchcore/src/vespa/searchcore/proton/common/CMakeLists.txt
index dec686d3070..cdca446f114 100644
--- a/searchcore/src/vespa/searchcore/proton/common/CMakeLists.txt
+++ b/searchcore/src/vespa/searchcore/proton/common/CMakeLists.txt
@@ -22,4 +22,5 @@ vespa_add_library(searchcore_pcommon STATIC
DEPENDS
searchcore_proton_metrics
searchcore_fconfig
+ stdc++fs
)
diff --git a/searchcore/src/vespa/searchcore/proton/common/hw_info.h b/searchcore/src/vespa/searchcore/proton/common/hw_info.h
index 06efaec18f2..12b2d0cfbe5 100644
--- a/searchcore/src/vespa/searchcore/proton/common/hw_info.h
+++ b/searchcore/src/vespa/searchcore/proton/common/hw_info.h
@@ -2,6 +2,8 @@
#pragma once
+#include <cstdint>
+
namespace proton {
/*
@@ -9,19 +11,48 @@ namespace proton {
*/
class HwInfo
{
- bool _slowDisk;
+public:
+ class Disk {
+ private:
+ uint64_t _sizeBytes;
+ bool _slow;
+ bool _shared;
+ public:
+ Disk(uint64_t sizeBytes_, bool slow_, bool shared_)
+ : _sizeBytes(sizeBytes_), _slow(slow_), _shared(shared_) {}
+ uint64_t sizeBytes() const { return _sizeBytes; }
+ bool slow() const { return _slow; }
+ bool shared() const { return _shared; }
+ };
+
+ class Memory {
+ private:
+ uint64_t _sizeBytes;
+ public:
+ Memory(uint64_t sizeBytes_) : _sizeBytes(sizeBytes_) {}
+ uint64_t sizeBytes() const { return _sizeBytes; }
+ };
+
+private:
+ Disk _disk;
+ Memory _memory;
+
public:
HwInfo()
- : _slowDisk(false)
+ : _disk(0, false, false),
+ _memory(0)
{
}
- HwInfo(bool slowDisk_in)
- : _slowDisk(slowDisk_in)
+ HwInfo(const Disk &disk_,
+ const Memory &memory_)
+ : _disk(disk_),
+ _memory(memory_)
{
}
- bool slowDisk() const { return _slowDisk; }
+ const Disk &disk() const { return _disk; }
+ const Memory &memory() const { return _memory; }
};
}
diff --git a/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.cpp b/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.cpp
index 73bb20c712a..ccb88714a20 100644
--- a/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.cpp
+++ b/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.cpp
@@ -1,13 +1,14 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "hw_info_sampler.h"
-#include <vespa/config/config.h>
#include <vespa/config/common/configholder.h>
+#include <vespa/config/config.h>
#include <vespa/config/file/filesource.h>
-#include <vespa/searchcore/config/config-hwinfo.h>
#include <vespa/config/print/fileconfigwriter.h>
-#include <vespa/vespalib/io/fileutil.h>
#include <vespa/fastos/file.h>
+#include <vespa/searchcore/config/config-hwinfo.h>
+#include <vespa/vespalib/io/fileutil.h>
+#include <experimental/filesystem>
using config::ConfigHandle;
using config::ConfigSubscriber;
@@ -22,6 +23,26 @@ namespace proton {
namespace {
+uint64_t
+sampleDiskSizeBytes(const std::string &pathStr, const HwInfoSampler::Config &cfg)
+{
+ if (cfg.diskSizeBytes != 0) {
+ return cfg.diskSizeBytes;
+ }
+ std::experimental::filesystem::path path(pathStr);
+ auto space_info = std::experimental::filesystem::space(path);
+ return space_info.capacity;
+}
+
+uint64_t
+sampleMemorySizeBytes(const HwInfoSampler::Config &cfg)
+{
+ if (cfg.memorySizeBytes != 0) {
+ return cfg.memorySizeBytes;
+ }
+ return sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE);
+}
+
std::unique_ptr<HwinfoConfig> readConfig(const vespalib::string &path) {
FileSpec spec(path + "/" + "hwinfo.cfg");
ConfigSubscriber s(spec);
@@ -80,8 +101,29 @@ HwInfoSampler::HwInfoSampler(const vespalib::string &path,
_sampleTime(),
_diskWriteSpeed(0.0)
{
- if (config._diskWriteSpeedOverride != 0) {
- _diskWriteSpeed = config._diskWriteSpeedOverride;
+ setDiskWriteSpeed(path, config);
+ setup(HwInfo::Disk(sampleDiskSizeBytes(path, config),
+ (_diskWriteSpeed < config.slowWriteSpeedLimit),
+ config.diskShared),
+ HwInfo::Memory(sampleMemorySizeBytes(config)));
+
+}
+
+HwInfoSampler::~HwInfoSampler()
+{
+}
+
+void
+HwInfoSampler::setup(const HwInfo::Disk &disk, const HwInfo::Memory &memory)
+{
+ _hwInfo = HwInfo(disk, memory);
+}
+
+void
+HwInfoSampler::setDiskWriteSpeed(const vespalib::string &path, const Config &config)
+{
+ if (config.diskWriteSpeedOverride != 0) {
+ _diskWriteSpeed = config.diskWriteSpeedOverride;
_sampleTime = Clock::now();
} else {
auto cfg = readConfig(path);
@@ -89,28 +131,16 @@ HwInfoSampler::HwInfoSampler(const vespalib::string &path,
_sampleTime = std::chrono::time_point<Clock>(std::chrono::seconds(cfg->disk.sampletime));
_diskWriteSpeed = cfg->disk.writespeed;
} else {
- sample(path, config);
+ sampleDiskWriteSpeed(path, config);
}
}
- setup(config);
-}
-
-HwInfoSampler::~HwInfoSampler()
-{
-}
-
-void
-HwInfoSampler::setup(const Config &config)
-{
- bool slowDisk = _diskWriteSpeed < config._slowWriteSpeedLimit;
- _hwInfo = HwInfo(slowDisk);
}
void
-HwInfoSampler::sample(const vespalib::string &path, const Config &config)
+HwInfoSampler::sampleDiskWriteSpeed(const vespalib::string &path, const Config &config)
{
size_t minDiskWriteLen = 1024u * 1024u;
- size_t diskWriteLen = config._diskSampleWriteSize;
+ size_t diskWriteLen = config.diskSampleWriteSize;
diskWriteLen = std::max(diskWriteLen, minDiskWriteLen);
_sampleTime = Clock::now();
_diskWriteSpeed = measureDiskWriteSpeed(path, diskWriteLen);
diff --git a/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.h b/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.h
index 22af2d32786..b640fd50370 100644
--- a/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.h
+++ b/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.h
@@ -16,16 +16,25 @@ class HwInfoSampler
{
public:
struct Config {
- double _diskWriteSpeedOverride;
- double _slowWriteSpeedLimit;
- uint64_t _diskSampleWriteSize;
-
- Config(double diskWriteSpeedOverride,
- double slowWriteSpeedLimit,
- double diskSampleWriteSize)
- : _diskWriteSpeedOverride(diskWriteSpeedOverride),
- _slowWriteSpeedLimit(slowWriteSpeedLimit),
- _diskSampleWriteSize(diskSampleWriteSize)
+ uint64_t diskSizeBytes;
+ double diskWriteSpeedOverride;
+ double slowWriteSpeedLimit;
+ uint64_t diskSampleWriteSize;
+ bool diskShared;
+ uint64_t memorySizeBytes;
+
+ Config(uint64_t diskSizeBytes_,
+ double diskWriteSpeedOverride_,
+ double slowWriteSpeedLimit_,
+ double diskSampleWriteSize_,
+ bool diskShared_,
+ uint64_t memorySizeBytes_)
+ : diskSizeBytes(diskSizeBytes_),
+ diskWriteSpeedOverride(diskWriteSpeedOverride_),
+ slowWriteSpeedLimit(slowWriteSpeedLimit_),
+ diskSampleWriteSize(diskSampleWriteSize_),
+ diskShared(diskShared_),
+ memorySizeBytes(memorySizeBytes_)
{
}
};
@@ -36,8 +45,9 @@ private:
Clock::time_point _sampleTime;
double _diskWriteSpeed;
- void setup(const Config &config);
- void sample(const vespalib::string &path, const Config &config);
+ void setup(const HwInfo::Disk &disk, const HwInfo::Memory &memory);
+ void setDiskWriteSpeed(const vespalib::string &path, const Config &config);
+ void sampleDiskWriteSpeed(const vespalib::string &path, const Config &config);
public:
HwInfoSampler(const vespalib::string &path, const Config &config);
~HwInfoSampler();
diff --git a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoreflushtarget.cpp b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoreflushtarget.cpp
index 322e71a572c..3821237233e 100644
--- a/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoreflushtarget.cpp
+++ b/searchcore/src/vespa/searchcore/proton/documentmetastore/documentmetastoreflushtarget.cpp
@@ -87,7 +87,7 @@ DocumentMetaStoreFlushTarget::Flusher::saveDocumentMetaStore()
SerialNumFileHeaderContext fileHeaderContext(_dmsft._fileHeaderContext,
_syncToken);
bool saveSuccess = false;
- if (_dmsft._hwInfo.slowDisk()) {
+ if (_dmsft._hwInfo.disk().slow()) {
search::AttributeMemorySaveTarget memorySaveTarget;
saveSuccess = _saver->save(memorySaveTarget);
_saver.reset();
diff --git a/searchcore/src/vespa/searchcore/proton/server/proton.cpp b/searchcore/src/vespa/searchcore/proton/server/proton.cpp
index d95b0fd44d1..ef255315156 100644
--- a/searchcore/src/vespa/searchcore/proton/server/proton.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/proton.cpp
@@ -223,10 +223,15 @@ Proton::init(const BootstrapConfig::SP & configSnapshot)
{
assert( _initStarted && ! _initComplete );
const ProtonConfig &protonConfig = configSnapshot->getProtonConfig();
- const auto &samplerCfgArgs = protonConfig.hwinfo.disk;
- HwInfoSampler::Config samplerCfg(samplerCfgArgs.writespeed,
- samplerCfgArgs.slowwritespeedlimit,
- samplerCfgArgs.samplewritesize);
+ const auto &hwDiskCfg = protonConfig.hwinfo.disk;
+ const auto &hwMemoryCfg = protonConfig.hwinfo.memory;
+ // TODO: Forward disk size when performance impact of disk usage sampling is verified
+ HwInfoSampler::Config samplerCfg(0,
+ hwDiskCfg.writespeed,
+ hwDiskCfg.slowwritespeedlimit,
+ hwDiskCfg.samplewritesize,
+ hwDiskCfg.shared,
+ hwMemoryCfg.size);
_hwInfoSampler = std::make_unique<HwInfoSampler>(protonConfig.basedir,
samplerCfg);
_hwInfo = _hwInfoSampler->hwInfo();