summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-10-10 16:24:53 +0200
committerGitHub <noreply@github.com>2017-10-10 16:24:53 +0200
commitf28c605b6ba4e2674bcef0de2a6d477370537268 (patch)
tree03b1463c5a3d9a2b92a9f3c812acbc8b279e025c
parent7f17d4d078b867be963d41e4d9a04a89cac8249b (diff)
parent9d3e4c0a9db8b2db12cb68b00a160a4ed0a202a1 (diff)
Merge pull request #3697 from vespa-engine/geirst/add-cpu-cores-to-proton-config
Geirst/add cpu cores to proton config
-rw-r--r--searchcore/src/tests/proton/attribute/attributeflush_test.cpp4
-rw-r--r--searchcore/src/tests/proton/common/hw_info_sampler/hw_info_sampler_test.cpp28
-rw-r--r--searchcore/src/tests/proton/server/disk_mem_usage_filter/disk_mem_usage_filter_test.cpp2
-rw-r--r--searchcore/src/vespa/searchcore/config/proton.def4
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/hw_info.h19
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.cpp18
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.h9
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/proton.cpp4
8 files changed, 67 insertions, 21 deletions
diff --git a/searchcore/src/tests/proton/attribute/attributeflush_test.cpp b/searchcore/src/tests/proton/attribute/attributeflush_test.cpp
index ce0a6bffc0d..eb6b17a9826 100644
--- a/searchcore/src/tests/proton/attribute/attributeflush_test.cpp
+++ b/searchcore/src/tests/proton/attribute/attributeflush_test.cpp
@@ -606,8 +606,8 @@ Test::requireThatFlushedAttributeCanBeLoaded(const HwInfo &hwInfo)
void
Test::requireThatFlushedAttributeCanBeLoaded()
{
- TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(HwInfo::Disk(0, false, false), HwInfo::Memory(0))));
- TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(HwInfo::Disk(0, true, false), HwInfo::Memory(0))));
+ TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(HwInfo::Disk(0, false, false), HwInfo::Memory(0), HwInfo::Cpu(0))));
+ TEST_DO(requireThatFlushedAttributeCanBeLoaded(HwInfo(HwInfo::Disk(0, true, false), HwInfo::Memory(0), HwInfo::Cpu(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 c39a8163e00..78676d6abf1 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
@@ -45,7 +45,7 @@ struct Fixture
TEST_F("Test that hw_info_sampler uses override info", Fixture)
{
- Config samplerCfg(0, 75.0, 100.0, sampleLen, sharedDisk, 0);
+ Config samplerCfg(0, 75.0, 100.0, sampleLen, sharedDisk, 0, 0);
HwInfoSampler sampler(test_dir, samplerCfg);
EXPECT_EQUAL(75.0, sampler.diskWriteSpeed());
EXPECT_NOT_EQUAL(0, time_point_to_long(sampler.sampleTime()));
@@ -58,7 +58,7 @@ 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.0, 70.0, sampleLen, sharedDisk, 0);
+ Config samplerCfg(0, 0.0, 70.0, sampleLen, sharedDisk, 0, 0);
HwInfoSampler sampler(test_dir, samplerCfg);
EXPECT_EQUAL(builder.disk.writespeed, sampler.diskWriteSpeed());
EXPECT_EQUAL(builder.disk.sampletime, time_point_to_long(sampler.sampleTime()));
@@ -67,7 +67,7 @@ TEST_F("Test that hw_info_sampler uses saved info", Fixture)
TEST_F("Test that hw_info_sampler can sample disk write speed", Fixture)
{
- Config samplerCfg(0, 0.0, 100.0, sampleLen, sharedDisk, 0);
+ Config samplerCfg(0, 0.0, 100.0, sampleLen, sharedDisk, 0, 0);
HwInfoSampler sampler(test_dir, samplerCfg);
ASSERT_NOT_EQUAL(0.0, sampler.diskWriteSpeed());
ASSERT_NOT_EQUAL(0, time_point_to_long(sampler.sampleTime()));
@@ -79,32 +79,46 @@ TEST_F("Test that hw_info_sampler can sample disk write speed", Fixture)
TEST_F("require that disk size can be specified", Fixture)
{
- Config samplerCfg(1024, 1.0, 0.0, sampleLen, sharedDisk, 0);
+ Config samplerCfg(1024, 1.0, 0.0, sampleLen, sharedDisk, 0, 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);
+ Config samplerCfg(0, 1.0, 0.0, sampleLen, sharedDisk, 0, 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);
+ Config samplerCfg(0, 1.0, 0.0, sampleLen, sharedDisk, 1024, 0);
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);
+ Config samplerCfg(0, 1.0, 0.0, sampleLen, sharedDisk, 0, 0);
HwInfoSampler sampler(test_dir, samplerCfg);
EXPECT_GREATER(sampler.hwInfo().memory().sizeBytes(), 0u);
}
+TEST_F("require that num cpu cores can be specified", Fixture)
+{
+ Config samplerCfg(0, 1.0, 0.0, sampleLen, sharedDisk, 0, 8);
+ HwInfoSampler sampler(test_dir, samplerCfg);
+ EXPECT_EQUAL(8u, sampler.hwInfo().cpu().cores());
+}
+
+TEST_F("require that num cpu cores can be sampled", Fixture)
+{
+ Config samplerCfg(0, 1.0, 0.0, sampleLen, sharedDisk, 0, 0);
+ HwInfoSampler sampler(test_dir, samplerCfg);
+ EXPECT_GREATER(sampler.hwInfo().cpu().cores(), 0u);
+}
+
TEST_MAIN()
{
vespalib::rmdir(test_dir, true);
diff --git a/searchcore/src/tests/proton/server/disk_mem_usage_filter/disk_mem_usage_filter_test.cpp b/searchcore/src/tests/proton/server/disk_mem_usage_filter/disk_mem_usage_filter_test.cpp
index cfd1c37e4d1..4dd8c43d9b2 100644
--- a/searchcore/src/tests/proton/server/disk_mem_usage_filter/disk_mem_usage_filter_test.cpp
+++ b/searchcore/src/tests/proton/server/disk_mem_usage_filter/disk_mem_usage_filter_test.cpp
@@ -18,7 +18,7 @@ struct Fixture
using Config = DiskMemUsageFilter::Config;
Fixture()
- : _filter(HwInfo(HwInfo::Disk(100, false, false), HwInfo::Memory(64 * 1024 * 1024)))
+ : _filter(HwInfo(HwInfo::Disk(100, false, false), HwInfo::Memory(64 * 1024 * 1024), HwInfo::Cpu(0)))
{
_filter.setDiskUsedSize(0);
_filter.setMemoryStats(vespalib::ProcessMemoryStats(10000000,
diff --git a/searchcore/src/vespa/searchcore/config/proton.def b/searchcore/src/vespa/searchcore/config/proton.def
index 2fd991538ab..520dab6c988 100644
--- a/searchcore/src/vespa/searchcore/config/proton.def
+++ b/searchcore/src/vespa/searchcore/config/proton.def
@@ -429,6 +429,10 @@ hwinfo.disk.slowwritespeedlimit double default = 100.0
## The memory size is used when determining if feed should be blocked in writefilter.
hwinfo.memory.size long default = 0
+## The number of cores on the cpu.
+## If set to 0, this is sampled by using std::thread::hardware_concurrency().
+hwinfo.cpu.cores int default = 0
+
## Adjustment to resource limit when determining if maintenance jobs can run.
##
## Currently used by 'lid_space_compaction' and 'move_buckets' jobs.
diff --git a/searchcore/src/vespa/searchcore/proton/common/hw_info.h b/searchcore/src/vespa/searchcore/proton/common/hw_info.h
index 12b2d0cfbe5..cd0ef2817d7 100644
--- a/searchcore/src/vespa/searchcore/proton/common/hw_info.h
+++ b/searchcore/src/vespa/searchcore/proton/common/hw_info.h
@@ -33,26 +33,39 @@ public:
uint64_t sizeBytes() const { return _sizeBytes; }
};
+ class Cpu {
+ private:
+ uint32_t _cores;
+ public:
+ Cpu(uint32_t cores_) : _cores(cores_) {}
+ uint32_t cores() const { return _cores; }
+ };
+
private:
Disk _disk;
Memory _memory;
+ Cpu _cpu;
public:
HwInfo()
: _disk(0, false, false),
- _memory(0)
+ _memory(0),
+ _cpu(0)
{
}
HwInfo(const Disk &disk_,
- const Memory &memory_)
+ const Memory &memory_,
+ const Cpu &cpu_)
: _disk(disk_),
- _memory(memory_)
+ _memory(memory_),
+ _cpu(cpu_)
{
}
const Disk &disk() const { return _disk; }
const Memory &memory() const { return _memory; }
+ const Cpu &cpu() const { return _cpu; }
};
}
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 ccb88714a20..c9bf81d1310 100644
--- a/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.cpp
+++ b/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.cpp
@@ -9,6 +9,7 @@
#include <vespa/searchcore/config/config-hwinfo.h>
#include <vespa/vespalib/io/fileutil.h>
#include <experimental/filesystem>
+#include <thread>
using config::ConfigHandle;
using config::ConfigSubscriber;
@@ -43,6 +44,15 @@ sampleMemorySizeBytes(const HwInfoSampler::Config &cfg)
return sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE);
}
+uint32_t
+sampleCpuCores(const HwInfoSampler::Config &cfg)
+{
+ if (cfg.cpuCores != 0) {
+ return cfg.cpuCores;
+ }
+ return std::thread::hardware_concurrency();
+}
+
std::unique_ptr<HwinfoConfig> readConfig(const vespalib::string &path) {
FileSpec spec(path + "/" + "hwinfo.cfg");
ConfigSubscriber s(spec);
@@ -105,8 +115,8 @@ HwInfoSampler::HwInfoSampler(const vespalib::string &path,
setup(HwInfo::Disk(sampleDiskSizeBytes(path, config),
(_diskWriteSpeed < config.slowWriteSpeedLimit),
config.diskShared),
- HwInfo::Memory(sampleMemorySizeBytes(config)));
-
+ HwInfo::Memory(sampleMemorySizeBytes(config)),
+ HwInfo::Cpu(sampleCpuCores(config)));
}
HwInfoSampler::~HwInfoSampler()
@@ -114,9 +124,9 @@ HwInfoSampler::~HwInfoSampler()
}
void
-HwInfoSampler::setup(const HwInfo::Disk &disk, const HwInfo::Memory &memory)
+HwInfoSampler::setup(const HwInfo::Disk &disk, const HwInfo::Memory &memory, const HwInfo::Cpu &cpu)
{
- _hwInfo = HwInfo(disk, memory);
+ _hwInfo = HwInfo(disk, memory, cpu);
}
void
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 b640fd50370..3570ba1b87f 100644
--- a/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.h
+++ b/searchcore/src/vespa/searchcore/proton/common/hw_info_sampler.h
@@ -22,19 +22,22 @@ public:
uint64_t diskSampleWriteSize;
bool diskShared;
uint64_t memorySizeBytes;
+ uint32_t cpuCores;
Config(uint64_t diskSizeBytes_,
double diskWriteSpeedOverride_,
double slowWriteSpeedLimit_,
double diskSampleWriteSize_,
bool diskShared_,
- uint64_t memorySizeBytes_)
+ uint64_t memorySizeBytes_,
+ uint32_t cpuCores_)
: diskSizeBytes(diskSizeBytes_),
diskWriteSpeedOverride(diskWriteSpeedOverride_),
slowWriteSpeedLimit(slowWriteSpeedLimit_),
diskSampleWriteSize(diskSampleWriteSize_),
diskShared(diskShared_),
- memorySizeBytes(memorySizeBytes_)
+ memorySizeBytes(memorySizeBytes_),
+ cpuCores(cpuCores_)
{
}
};
@@ -45,7 +48,7 @@ private:
Clock::time_point _sampleTime;
double _diskWriteSpeed;
- void setup(const HwInfo::Disk &disk, const HwInfo::Memory &memory);
+ void setup(const HwInfo::Disk &disk, const HwInfo::Memory &memory, const HwInfo::Cpu &cpu);
void setDiskWriteSpeed(const vespalib::string &path, const Config &config);
void sampleDiskWriteSpeed(const vespalib::string &path, const Config &config);
public:
diff --git a/searchcore/src/vespa/searchcore/proton/server/proton.cpp b/searchcore/src/vespa/searchcore/proton/server/proton.cpp
index 5863c03226c..7e63bcd03a5 100644
--- a/searchcore/src/vespa/searchcore/proton/server/proton.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/proton.cpp
@@ -239,13 +239,15 @@ Proton::init(const BootstrapConfig::SP & configSnapshot)
const ProtonConfig &protonConfig = configSnapshot->getProtonConfig();
const auto &hwDiskCfg = protonConfig.hwinfo.disk;
const auto &hwMemoryCfg = protonConfig.hwinfo.memory;
+ const auto &hwCpuCfg = protonConfig.hwinfo.cpu;
// 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);
+ hwMemoryCfg.size,
+ hwCpuCfg.cores);
_hwInfoSampler = std::make_unique<HwInfoSampler>(protonConfig.basedir, samplerCfg);
_hwInfo = _hwInfoSampler->hwInfo();
setFS4Compression(protonConfig);