diff --git a/presto-native-execution/presto_cpp/main/PrestoServer.cpp b/presto-native-execution/presto_cpp/main/PrestoServer.cpp index 3b3064a4cea86..4a8a8896442a5 100644 --- a/presto-native-execution/presto_cpp/main/PrestoServer.cpp +++ b/presto-native-execution/presto_cpp/main/PrestoServer.cpp @@ -656,7 +656,16 @@ void PrestoServer::initializeVeloxMemory() { memoryGb, "Query memory capacity must not be larger than system memory capacity"); options.arbitratorCapacity = queryMemoryGb << 30; + const uint64_t queryReservedMemoryGb = + systemConfig->queryReservedMemoryGb(); + VELOX_USER_CHECK_LE( + queryReservedMemoryGb, + queryMemoryGb, + "Query reserved memory capacity must not be larger than query memory capacity"); + options.arbitratorReservedCapacity = queryReservedMemoryGb << 30; options.memoryPoolInitCapacity = systemConfig->memoryPoolInitCapacity(); + options.memoryPoolReservedCapacity = + systemConfig->memoryPoolReservedCapacity(); options.memoryPoolTransferCapacity = systemConfig->memoryPoolTransferCapacity(); options.memoryReclaimWaitMs = systemConfig->memoryReclaimWaitMs(); diff --git a/presto-native-execution/presto_cpp/main/common/Configs.cpp b/presto-native-execution/presto_cpp/main/common/Configs.cpp index 1169abebacc96..ea2348023ed54 100644 --- a/presto-native-execution/presto_cpp/main/common/Configs.cpp +++ b/presto-native-execution/presto_cpp/main/common/Configs.cpp @@ -12,8 +12,8 @@ * limitations under the License. */ -#include "presto_cpp/main/common/ConfigReader.h" #include "presto_cpp/main/common/Configs.h" +#include "presto_cpp/main/common/ConfigReader.h" #include "presto_cpp/main/common/Utils.h" #include "velox/core/QueryConfig.h" @@ -185,6 +185,7 @@ SystemConfig::SystemConfig() { BOOL_PROP(kUseMmapAllocator, true), STR_PROP(kMemoryArbitratorKind, ""), NUM_PROP(kQueryMemoryGb, 38), + NUM_PROP(kQueryMemoryGb, 4), BOOL_PROP(kEnableVeloxTaskLogging, false), BOOL_PROP(kEnableVeloxExprSetLogging, false), NUM_PROP(kLocalShuffleMaxPartitionBytes, 268435456), @@ -462,12 +463,22 @@ int32_t SystemConfig::queryMemoryGb() const { return optionalProperty(kQueryMemoryGb).value(); } +int32_t SystemConfig::queryReservedMemoryGb() const { + return optionalProperty(kQueryReservedMemoryGb).value(); +} + uint64_t SystemConfig::memoryPoolInitCapacity() const { static constexpr uint64_t kMemoryPoolInitCapacityDefault = 128 << 20; return optionalProperty(kMemoryPoolInitCapacity) .value_or(kMemoryPoolInitCapacityDefault); } +uint64_t SystemConfig::memoryPoolReservedCapacity() const { + static constexpr uint64_t kMemoryPoolReservedCapacityDefault = 64 << 20; + return optionalProperty(kMemoryPoolReservedCapacity) + .value_or(kMemoryPoolReservedCapacityDefault); +} + uint64_t SystemConfig::memoryPoolTransferCapacity() const { static constexpr uint64_t kMemoryPoolTransferCapacityDefault = 32 << 20; return optionalProperty(kMemoryPoolTransferCapacity) diff --git a/presto-native-execution/presto_cpp/main/common/Configs.h b/presto-native-execution/presto_cpp/main/common/Configs.h index 31b580915224c..e3838eefffe8f 100644 --- a/presto-native-execution/presto_cpp/main/common/Configs.h +++ b/presto-native-execution/presto_cpp/main/common/Configs.h @@ -256,6 +256,17 @@ class SystemConfig : public ConfigBase { /// this config only applies if the memory arbitration has been enabled. static constexpr std::string_view kQueryMemoryGb{"query-memory-gb"}; + /// Specifies the amount of query memory capacity reserved to ensure that a + /// query has minimal memory capacity to run. This capacity should be less + /// than 'query-memory-gb'. A query's minimal memory capacity is specified by + /// 'memory-pool-reserved-capacity'. + /// + /// NOTE: the reserved query memory capacity is enforced by memory arbitrator + /// so that this config only applies if the memory arbitration has been + /// enabled. + static constexpr std::string_view kQueryReservedMemoryGb{ + "query-reserved-memory-gb"}; + /// If true, enable memory pushback when the server is under low memory /// condition. This only applies if 'system-mem-limit-gb' is set. static constexpr std::string_view kSystemMemPushbackEnabled{ @@ -335,6 +346,11 @@ class SystemConfig : public ConfigBase { static constexpr std::string_view kMemoryPoolInitCapacity{ "memory-pool-init-capacity"}; + /// The minimal amount of memory capacity in bytes reserved for each query + /// memory pool. + static constexpr std::string_view kMemoryPoolReservedCapacity{ + "memory-pool-reserved-capacity"}; + /// The minimal memory capacity in bytes transferred between memory pools /// during memory arbitration. /// @@ -620,8 +636,12 @@ class SystemConfig : public ConfigBase { int32_t queryMemoryGb() const; + int32_t queryReservedMemoryGb() const; + uint64_t memoryPoolInitCapacity() const; + uint64_t memoryPoolReservedCapacity() const; + uint64_t memoryPoolTransferCapacity() const; uint64_t memoryReclaimWaitMs() const;