Skip to content

Commit

Permalink
[native] Add reserved memory capacity configs
Browse files Browse the repository at this point in the history
Add two system configs for reserved query memory capacity:
query-reserved-memory-gb: the total amount of query memory capacity reserved to ensure that a
query has minimal memory capacity to run
memory-pool-reserved-capacity: the minimal amount of memory capacity in bytes reserved for
each query memory pool.
  • Loading branch information
xiaoxmeng committed Apr 29, 2024
1 parent 6b43924 commit a46a8b6
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 2 deletions.
9 changes: 9 additions & 0 deletions presto-native-execution/presto_cpp/main/PrestoServer.cpp
Expand Up @@ -669,7 +669,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();
Expand Down
13 changes: 12 additions & 1 deletion presto-native-execution/presto_cpp/main/common/Configs.cpp
Expand Up @@ -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"

Expand Down Expand Up @@ -185,6 +185,7 @@ SystemConfig::SystemConfig() {
BOOL_PROP(kUseMmapAllocator, true),
STR_PROP(kMemoryArbitratorKind, ""),
NUM_PROP(kQueryMemoryGb, 38),
NUM_PROP(kQueryReservedMemoryGb, 4),
BOOL_PROP(kEnableVeloxTaskLogging, false),
BOOL_PROP(kEnableVeloxExprSetLogging, false),
NUM_PROP(kLocalShuffleMaxPartitionBytes, 268435456),
Expand Down Expand Up @@ -462,12 +463,22 @@ int32_t SystemConfig::queryMemoryGb() const {
return optionalProperty<int32_t>(kQueryMemoryGb).value();
}

int32_t SystemConfig::queryReservedMemoryGb() const {
return optionalProperty<int32_t>(kQueryReservedMemoryGb).value();
}

uint64_t SystemConfig::memoryPoolInitCapacity() const {
static constexpr uint64_t kMemoryPoolInitCapacityDefault = 128 << 20;
return optionalProperty<uint64_t>(kMemoryPoolInitCapacity)
.value_or(kMemoryPoolInitCapacityDefault);
}

uint64_t SystemConfig::memoryPoolReservedCapacity() const {
static constexpr uint64_t kMemoryPoolReservedCapacityDefault = 64 << 20;
return optionalProperty<uint64_t>(kMemoryPoolReservedCapacity)
.value_or(kMemoryPoolReservedCapacityDefault);
}

uint64_t SystemConfig::memoryPoolTransferCapacity() const {
static constexpr uint64_t kMemoryPoolTransferCapacityDefault = 32 << 20;
return optionalProperty<uint64_t>(kMemoryPoolTransferCapacity)
Expand Down
20 changes: 20 additions & 0 deletions presto-native-execution/presto_cpp/main/common/Configs.h
Expand Up @@ -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{
Expand Down Expand Up @@ -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.
///
Expand Down Expand Up @@ -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;
Expand Down
Expand Up @@ -1470,4 +1470,4 @@ std::unique_ptr<protocol::ConnectorProtocol>
TpchPrestoToVeloxConnector::createConnectorProtocol() const {
return std::make_unique<protocol::TpchConnectorProtocol>();
}
} // namespace facebook::presto
} // namespace facebook::presto
Expand Up @@ -125,10 +125,12 @@ public class NativeExecutionSystemConfig
// Reserve 2GB from system memory for system operations such as disk
// spilling and cache prefetch.
private DataSize queryMemoryGb = new DataSize(8, DataSize.Unit.GIGABYTE);
private static final String MEMORY_ARBITRATOR_RESERVED_CAPACITY_GB = "query-reserved-memory-gb";
private boolean useMmapAllocator = true;
private String memoryArbitratorKind = "SHARED";
private int memoryArbitratorCapacityGb = 8;
private long memoryPoolInitCapacity = 8L << 30;
private static final String MEMORY_POOL_RESERVED_CAPACITY = "memory-pool-reserved-capacity";
private long memoryPoolTransferCapacity = 2L << 30;

private long memoryReclaimWaitMs = 300_000;
Expand Down Expand Up @@ -170,7 +172,11 @@ public Map<String, String> getAllProperties()
.put(USE_MMAP_ALLOCATOR, String.valueOf(getUseMmapAllocator()))
.put(MEMORY_ARBITRATOR_KIND, String.valueOf(getMemoryArbitratorKind()))
.put(MEMORY_ARBITRATOR_CAPACITY_GB, String.valueOf(getMemoryArbitratorCapacityGb()))
// NOTE: there is only one query running at a time so set the query reserved capacity to zero.
.put(MEMORY_ARBITRATOR_RESERVED_CAPACITY_GB, "0")
.put(MEMORY_POOL_INIT_CAPACITY, String.valueOf(getMemoryPoolInitCapacity()))
// NOTE: there is only one query running at a time so set the pool reserved capacity to zero.
.put(MEMORY_POOL_RESERVED_CAPACITY, "0")
.put(MEMORY_POOL_TRANSFER_CAPACITY, String.valueOf(getMemoryPoolTransferCapacity()))
.put(MEMORY_RECLAIM_WAIT_MS, String.valueOf(getMemoryReclaimWaitMs()))
.put(SPILLER_SPILL_PATH, String.valueOf(getSpillerSpillPath()))
Expand Down

0 comments on commit a46a8b6

Please sign in to comment.