diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-10-10 16:24:53 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-10 16:24:53 +0200 |
commit | f28c605b6ba4e2674bcef0de2a6d477370537268 (patch) | |
tree | 03b1463c5a3d9a2b92a9f3c812acbc8b279e025c | |
parent | 7f17d4d078b867be963d41e4d9a04a89cac8249b (diff) | |
parent | 9d3e4c0a9db8b2db12cb68b00a160a4ed0a202a1 (diff) |
Merge pull request #3697 from vespa-engine/geirst/add-cpu-cores-to-proton-config
Geirst/add cpu cores to proton config
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); |