diff options
author | Geir Storli <geirst@oath.com> | 2018-01-22 12:47:29 +0000 |
---|---|---|
committer | Geir Storli <geirst@oath.com> | 2018-01-22 12:47:29 +0000 |
commit | 6b8cccc45e2580298f48462d9341e32a1ae22b8f (patch) | |
tree | 8bd71b7b6d74c2e41a19f1abe4eae8671efd80f3 | |
parent | eac3947f1275207660547f040b69127c18c08bff (diff) |
Add config for the alloc grow factor used when allocating buffers in multi-value attributes.
6 files changed, 53 insertions, 24 deletions
diff --git a/searchcommon/src/vespa/searchcommon/common/growstrategy.h b/searchcommon/src/vespa/searchcommon/common/growstrategy.h index 920e07e99f1..a0431b16d51 100644 --- a/searchcommon/src/vespa/searchcommon/common/growstrategy.h +++ b/searchcommon/src/vespa/searchcommon/common/growstrategy.h @@ -12,27 +12,40 @@ private: uint32_t _docsInitialCapacity; uint32_t _docsGrowPercent; uint32_t _docsGrowDelta; + float _multiValueAllocGrowFactor; public: - GrowStrategy(uint32_t docsInitialCapacity = 1024, - uint32_t docsGrowPercent = 50, - uint32_t docsGrowDelta = 0) + GrowStrategy() + : GrowStrategy(1024, 50, 0, 0.2) + {} + GrowStrategy(uint32_t docsInitialCapacity, + uint32_t docsGrowPercent, + uint32_t docsGrowDelta, + float multiValueAllocGrowFactor) : _docsInitialCapacity(docsInitialCapacity), _docsGrowPercent(docsGrowPercent), - _docsGrowDelta(docsGrowDelta) + _docsGrowDelta(docsGrowDelta), + _multiValueAllocGrowFactor(multiValueAllocGrowFactor) { } - uint32_t getDocsInitialCapacity() const { return _docsInitialCapacity; } - uint32_t getDocsGrowPercent() const { return _docsGrowPercent; } - uint32_t getDocsGrowDelta() const { return _docsGrowDelta; } - void setDocsInitialCapacity(uint32_t v) { _docsInitialCapacity = v; } - void setDocsGrowPercent(uint32_t v) { _docsGrowPercent = v; } - void setDocsGrowDelta(uint32_t v) { _docsGrowDelta = v; } + static GrowStrategy make(uint32_t docsInitialCapacity, + uint32_t docsGrowPercent, + uint32_t docsGrowDelta) { + return GrowStrategy(docsInitialCapacity, docsGrowPercent, docsGrowDelta, 0.2); + } + + uint32_t getDocsInitialCapacity() const { return _docsInitialCapacity; } + uint32_t getDocsGrowPercent() const { return _docsGrowPercent; } + uint32_t getDocsGrowDelta() const { return _docsGrowDelta; } + float getMultiValueAllocGrowFactor() const { return _multiValueAllocGrowFactor; } + void setDocsInitialCapacity(uint32_t v) { _docsInitialCapacity = v; } + void setDocsGrowDelta(uint32_t v) { _docsGrowDelta = v; } bool operator==(const GrowStrategy & rhs) const { return _docsInitialCapacity == rhs._docsInitialCapacity && _docsGrowPercent == rhs._docsGrowPercent && - _docsGrowDelta == rhs._docsGrowDelta; + _docsGrowDelta == rhs._docsGrowDelta && + _multiValueAllocGrowFactor == rhs._multiValueAllocGrowFactor; } bool operator!=(const GrowStrategy & rhs) const { return !(operator==(rhs)); diff --git a/searchcore/src/vespa/searchcore/config/proton.def b/searchcore/src/vespa/searchcore/config/proton.def index f46f6c67fd4..d7b1cbfa45f 100644 --- a/searchcore/src/vespa/searchcore/config/proton.def +++ b/searchcore/src/vespa/searchcore/config/proton.def @@ -205,6 +205,10 @@ grow.add int default=1 restart ## The number of documents to amortize memory spike cost over grow.numdocs int default=10000 restart +## The grow factor used when allocating buffers in the array store +## used in multi-value attribute vectors to store underlying values. +grow.multivalueallocfactor double default=0.2 restart + ## Control cache size in bytes. summary.cache.maxbytes long default=0 diff --git a/searchcore/src/vespa/searchcore/proton/server/documentsubdbcollection.cpp b/searchcore/src/vespa/searchcore/proton/server/documentsubdbcollection.cpp index 4c1dd47569b..46233af1a45 100644 --- a/searchcore/src/vespa/searchcore/proton/server/documentsubdbcollection.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/documentsubdbcollection.cpp @@ -11,12 +11,25 @@ #include <vespa/searchcore/proton/metrics/documentdb_metrics_collection.h> using proton::matching::SessionManager; -using search::index::Schema; +using search::GrowStrategy; using search::SerialNum; +using search::index::Schema; using searchcorespi::IFlushTarget; namespace proton { +namespace { + +GrowStrategy +makeGrowStrategy(uint32_t docsInitialCapacity, + const DocumentSubDBCollection::ProtonConfig::Grow &growCfg) +{ + return GrowStrategy(docsInitialCapacity, growCfg.factor, + growCfg.add, growCfg.multivalueallocfactor); +} + +} + DocumentSubDBCollection::DocumentSubDBCollection( IDocumentSubDBOwner &owner, search::transactionlog::SyncProxy &tlSyncer, @@ -49,9 +62,9 @@ DocumentSubDBCollection::DocumentSubDBCollection( const ProtonConfig::Distribution & distCfg = protonCfg.distribution; _bucketDB = std::make_shared<BucketDBOwner>(); _bucketDBHandler.reset(new bucketdb::BucketDBHandler(*_bucketDB)); - search::GrowStrategy searchableGrowth(growCfg.initial * distCfg.searchablecopies, growCfg.factor, growCfg.add); - search::GrowStrategy removedGrowth(std::max(1024l, growCfg.initial/100), growCfg.factor, growCfg.add); - search::GrowStrategy notReadyGrowth(growCfg.initial * (distCfg.redundancy - distCfg.searchablecopies), growCfg.factor, growCfg.add); + GrowStrategy searchableGrowth = makeGrowStrategy(growCfg.initial * distCfg.searchablecopies, growCfg); + GrowStrategy removedGrowth = makeGrowStrategy(std::max(1024l, growCfg.initial/100), growCfg); + GrowStrategy notReadyGrowth = makeGrowStrategy(growCfg.initial * (distCfg.redundancy - distCfg.searchablecopies), growCfg); size_t attributeGrowNumDocs(growCfg.numdocs); size_t numSearcherThreads = protonCfg.numsearcherthreads; diff --git a/searchlib/src/tests/attribute/attribute_test.cpp b/searchlib/src/tests/attribute/attribute_test.cpp index b406afa7e7b..9134711773c 100644 --- a/searchlib/src/tests/attribute/attribute_test.cpp +++ b/searchlib/src/tests/attribute/attribute_test.cpp @@ -1955,27 +1955,27 @@ AttributeTest::testGeneration() { { // single value attribute Config cfg(BasicType::INT8); - cfg.setGrowStrategy(GrowStrategy(2, 0, 2)); + cfg.setGrowStrategy(GrowStrategy::make(2, 0, 2)); AttributePtr attr = createAttribute("int8", cfg); testGeneration(attr, true); } { // enum attribute (with fast search) Config cfg(BasicType::INT8); cfg.setFastSearch(true); - cfg.setGrowStrategy(GrowStrategy(2, 0, 2)); + cfg.setGrowStrategy(GrowStrategy::make(2, 0, 2)); AttributePtr attr = createAttribute("faint8", cfg); testGeneration(attr, false); } { // multi value attribute Config cfg(BasicType::INT8, CollectionType::ARRAY); - cfg.setGrowStrategy(GrowStrategy(2, 0, 2)); + cfg.setGrowStrategy(GrowStrategy::make(2, 0, 2)); AttributePtr attr = createAttribute("aint8", cfg); testGeneration(attr, false); } { // multi value enum attribute (with fast search) Config cfg(BasicType::INT8, CollectionType::ARRAY); cfg.setFastSearch(true); - cfg.setGrowStrategy(GrowStrategy(2, 0, 2)); + cfg.setGrowStrategy(GrowStrategy::make(2, 0, 2)); AttributePtr attr = createAttribute("faaint8", cfg); testGeneration(attr, false); } @@ -2245,7 +2245,7 @@ AttributeTest::testReaderDuringLastUpdate(const Config &config, bool fs, bool co vespalib::string name(ss.str()); Config cfg = config; cfg.setFastSearch(fs); - cfg.setGrowStrategy(GrowStrategy(100, 50, 0)); + cfg.setGrowStrategy(GrowStrategy::make(100, 50, 0)); LOG(info, "testReaderDuringLastUpdate(%s)", name.c_str()); AttributePtr attr = AttributeFactory::createAttribute(name, cfg); diff --git a/searchlib/src/tests/attribute/searchcontext/searchcontext.cpp b/searchlib/src/tests/attribute/searchcontext/searchcontext.cpp index 9829ff27104..cbc86b02ada 100644 --- a/searchlib/src/tests/attribute/searchcontext/searchcontext.cpp +++ b/searchlib/src/tests/attribute/searchcontext/searchcontext.cpp @@ -1622,7 +1622,7 @@ SearchContextTest::requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded() Config cfg(BasicType::INT8, CollectionType::ARRAY); cfg.setFastSearch(true); { - cfg.setGrowStrategy(GrowStrategy(1, 0, 1)); + cfg.setGrowStrategy(GrowStrategy::make(1, 0, 1)); AttributePtr a = AttributeFactory::createAttribute("flags", cfg); FlagAttribute & fa = dynamic_cast<FlagAttribute &>(*a); addReservedDoc(fa); @@ -1657,7 +1657,7 @@ SearchContextTest::requireThatFlagAttributeIsWorkingWhenNewDocsAreAdded() } } { - cfg.setGrowStrategy(GrowStrategy(4, 0, 4)); + cfg.setGrowStrategy(GrowStrategy::make(4, 0, 4)); AttributePtr a = AttributeFactory::createAttribute("flags", cfg); FlagAttribute & fa = dynamic_cast<FlagAttribute &>(*a); std::vector<uint32_t> exp50; diff --git a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp index 6632ca730c4..b9042ac5f6c 100644 --- a/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/multivalueattribute.hpp @@ -10,7 +10,6 @@ namespace multivalueattribute { constexpr size_t HUGE_MEMORY_PAGE_SIZE = 2 * 1024 * 1024; constexpr size_t SMALL_MEMORY_PAGE_SIZE = 4 * 1024; -constexpr float ALLOC_GROW_FACTOR = 0.2; } @@ -23,7 +22,7 @@ MultiValueAttribute(const vespalib::string &baseFileName, multivalueattribute::HUGE_MEMORY_PAGE_SIZE, multivalueattribute::SMALL_MEMORY_PAGE_SIZE, 8 * 1024, - multivalueattribute::ALLOC_GROW_FACTOR), + cfg.getGrowStrategy().getMultiValueAllocGrowFactor()), cfg.getGrowStrategy()) { } |