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 e181dde
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 3 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 @@ -68,6 +68,8 @@ public class NativeExecutionSystemConfig
// Memory related configurations.
private static final String SYSTEM_MEMORY_GB = "system-memory-gb";
private static final String QUERY_MEMORY_GB = "query.max-memory-per-node";

private static final String QUERY_RESERVED_MEMORY_GB = "query.max-memory-per-node";
private static final String USE_MMAP_ALLOCATOR = "use-mmap-allocator";
// Memory arbitration related configurations.
// Set the memory arbitrator kind. If it is empty, then there is no memory
Expand All @@ -79,11 +81,18 @@ public class NativeExecutionSystemConfig
// Set memory arbitrator capacity to the same as per-query memory capacity
// as there is only one query running at Presto-on-Spark at a time.
private static final String MEMORY_ARBITRATOR_CAPACITY_GB = "query-memory-gb";
// Set memory arbitrator reserved capacity. Since there is only one query
// running at Presto-on-Spark at a time, then we shall set this to zero.
private static final String MEMORY_ARBITRATOR_RESERVED_CAPACITY_GB = "query-reserved-memory-gb";
// Set the initial memory capacity when we create a query memory pool. For
// Presto-on-Spark, we set it to 'query-memory-gb' to allocate all the
// memory arbitrator capacity to the query memory pool on its creation as
// there is only one query running at a time.
private static final String MEMORY_POOL_INIT_CAPACITY = "memory-pool-init-capacity";
// Set the reserved memory capacity when we create a query memory pool. For
// Presto-on-Spark, we set this to zero as there is only one query running
// at a time.
private static final String MEMORY_POOL_RESERVED_CAPACITY = "memory-pool-reserved-capacity";
// Set the minimal memory capacity transfer between memory pools under
// memory arbitration. For Presto-on-Spark, there is only one query running
// so this specified how much memory to reclaim from a query when it runs
Expand Down Expand Up @@ -125,12 +134,15 @@ 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 DataSize queryReservedMemoryGb = new DataSize(0, DataSize.Unit.GIGABYTE);
private boolean useMmapAllocator = true;
private String memoryArbitratorKind = "SHARED";
private int memoryArbitratorCapacityGb = 8;
private int memoryArbitratorReservedCapacityGb = 0;
private long memoryPoolInitCapacity = 8L << 30;
private long memoryPoolReservedCapacity = 0;
private long memoryPoolTransferCapacity = 2L << 30;

private long memoryReclaimWaitMs = 300_000;
private String spillerSpillPath = "";
private int concurrentLifespansPerTask = 5;
Expand Down Expand Up @@ -170,7 +182,9 @@ 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()))
.put(MEMORY_ARBITRATOR_RESERVED_CAPACITY_GB, String.valueOf(getMemoryArbitratorReservedCapacityGb()))
.put(MEMORY_POOL_INIT_CAPACITY, String.valueOf(getMemoryPoolInitCapacity()))
.put(MEMORY_POOL_RESERVED_CAPACITY, String.valueOf(getMemoryPoolReservedCapacity()))
.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 Expand Up @@ -470,6 +484,18 @@ public int getMemoryArbitratorCapacityGb()
return memoryArbitratorCapacityGb;
}

@Config(MEMORY_ARBITRATOR_RESERVED_CAPACITY_GB)
public NativeExecutionSystemConfig setMemoryArbitratorReservedCapacityGb(int memoryArbitratorReservedCapacityGb)
{
this.memoryArbitratorReservedCapacityGb = memoryArbitratorReservedCapacityGb;
return this;
}

public int getMemoryArbitratorReservedCapacityGb()
{
return memoryArbitratorReservedCapacityGb;
}

@Config(MEMORY_POOL_INIT_CAPACITY)
public NativeExecutionSystemConfig setMemoryPoolInitCapacity(long memoryPoolInitCapacity)
{
Expand All @@ -482,6 +508,18 @@ public long getMemoryPoolInitCapacity()
return memoryPoolInitCapacity;
}

@Config(MEMORY_POOL_RESERVED_CAPACITY)
public NativeExecutionSystemConfig setMemoryPoolReservedCapacity(long memoryPoolReservedCapacity)
{
this.memoryPoolReservedCapacity = memoryPoolReservedCapacity;
return this;
}

public long getMemoryPoolReservedCapacity()
{
return memoryPoolReservedCapacity;
}

@Config(MEMORY_POOL_TRANSFER_CAPACITY)
public NativeExecutionSystemConfig setMemoryPoolTransferCapacity(long memoryPoolTransferCapacity)
{
Expand Down

0 comments on commit e181dde

Please sign in to comment.