Skip to content

[24.2] Introduce Weighted Fair Share ThreadPool IO engine #1078

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: stable/24.2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 75 additions & 2 deletions yt/yt/client/misc/workload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,21 @@ TWorkloadDescriptor::TWorkloadDescriptor(
int band,
TInstant instant,
std::vector<TString> annotations,
std::optional<NConcurrency::TFairShareThreadPoolTag> compressionFairShareTag)
std::optional<NConcurrency::TFairShareThreadPoolTag> compressionFairShareTag,
std::optional<TString> diskFairShareBucketTag,
std::optional<double> diskFairShareBucketWeight)
: Category(category)
, Band(band)
, Instant(instant)
, Annotations(std::move(annotations))
, CompressionFairShareTag(std::move(compressionFairShareTag))
, DiskFairShareBucketTag(std::move(diskFairShareBucketTag))
, DiskFairShareBucketWeight(diskFairShareBucketWeight)
{ }

TWorkloadDescriptor TWorkloadDescriptor::SetCurrentInstant() const
{
return TWorkloadDescriptor(Category, Band, TInstant::Now(), Annotations, CompressionFairShareTag);
return TWorkloadDescriptor(Category, Band, TInstant::Now(), Annotations, CompressionFairShareTag, DiskFairShareBucketTag, DiskFairShareBucketWeight);
}

i64 TWorkloadDescriptor::GetPriority() const
Expand All @@ -51,6 +55,48 @@ i64 TWorkloadDescriptor::GetPriority() const
return priority;
}

TWorkloadDescriptor& TWorkloadDescriptor::WithCategory(EWorkloadCategory category)
{
Category = category;
return *this;
}

TWorkloadDescriptor& TWorkloadDescriptor::WithBand(int band)
{
Band = band;
return *this;
}

TWorkloadDescriptor& TWorkloadDescriptor::WithInstant(TInstant instant)
{
Instant = instant;
return *this;
}

TWorkloadDescriptor& TWorkloadDescriptor::WithAnnotations(std::vector<TString> annotations)
{
Annotations = std::move(annotations);
return *this;
}

TWorkloadDescriptor& TWorkloadDescriptor::WithCompressionFairShareTag(std::optional<NConcurrency::TFairShareThreadPoolTag> compressionFairShareTag)
{
CompressionFairShareTag = std::move(compressionFairShareTag);
return *this;
}

TWorkloadDescriptor& TWorkloadDescriptor::WithDiskFairShareBucketTag(std::optional<TString> diskFairShareBucketTag)
{
DiskFairShareBucketTag = std::move(diskFairShareBucketTag);
return *this;
}

TWorkloadDescriptor& TWorkloadDescriptor::WithDiskFairShareBucketWeight(std::optional<double> diskFairShareBucketWeight)
{
DiskFairShareBucketWeight = diskFairShareBucketWeight;
return *this;
}

////////////////////////////////////////////////////////////////////////////////

i64 GetBasicPriority(EWorkloadCategory category)
Expand Down Expand Up @@ -89,6 +135,11 @@ i64 GetBasicPriority(EWorkloadCategory category)
}
}

double GetBasicWeight(EWorkloadCategory category)
{
return std::max(GetBasicPriority(category) / CategoryPriorityFactor + 1.0, 1.0);
}

IInvokerPtr GetCompressionInvoker(const TWorkloadDescriptor& workloadDescriptor)
{
if (workloadDescriptor.CompressionFairShareTag) {
Expand All @@ -112,6 +163,10 @@ struct TSerializableWorkloadDescriptor
registrar.BaseClassParameter("category", &TWorkloadDescriptor::Category);
registrar.BaseClassParameter("band", &TWorkloadDescriptor::Band)
.Default(0);
registrar.BaseClassParameter("disk_fair_share_bucket_tag", &TWorkloadDescriptor::DiskFairShareBucketTag)
.Optional();
registrar.BaseClassParameter("disk_fair_share_bucket_weight", &TWorkloadDescriptor::DiskFairShareBucketWeight)
.Optional();
registrar.BaseClassParameter("annotations", &TWorkloadDescriptor::Annotations)
.Default();
}
Expand Down Expand Up @@ -144,6 +199,12 @@ void ToProto(NYT::NProto::TWorkloadDescriptor* protoDescriptor, const TWorkloadD
protoDescriptor->set_band(descriptor.Band);
protoDescriptor->set_instant(ToProto<i64>(descriptor.Instant));
ToProto(protoDescriptor->mutable_annotations(), descriptor.Annotations);
if (descriptor.DiskFairShareBucketTag) {
protoDescriptor->set_disk_fair_share_bucket_tag(*descriptor.DiskFairShareBucketTag);
}
if (descriptor.DiskFairShareBucketWeight) {
protoDescriptor->set_disk_fair_share_bucket_weight(*descriptor.DiskFairShareBucketWeight);
}
}

void FromProto(TWorkloadDescriptor* descriptor, const NYT::NProto::TWorkloadDescriptor& protoDescriptor)
Expand All @@ -152,6 +213,12 @@ void FromProto(TWorkloadDescriptor* descriptor, const NYT::NProto::TWorkloadDesc
descriptor->Band = protoDescriptor.band();
descriptor->Instant = FromProto<TInstant>(protoDescriptor.instant());
FromProto(&descriptor->Annotations, protoDescriptor.annotations());
if (protoDescriptor.Hasdisk_fair_share_bucket_tag()) {
descriptor->DiskFairShareBucketTag = protoDescriptor.disk_fair_share_bucket_tag();
}
if (protoDescriptor.Hasdisk_fair_share_bucket_weight()) {
descriptor->DiskFairShareBucketWeight = protoDescriptor.disk_fair_share_bucket_weight();
}
}

void FormatValue(
Expand All @@ -176,6 +243,12 @@ void FormatValue(
}
builder->AppendChar('}');
}
if (descriptor.DiskFairShareBucketTag) {
builder->AppendFormat(":%v", *descriptor.DiskFairShareBucketTag);
}
if (descriptor.DiskFairShareBucketWeight) {
builder->AppendFormat(":%v", *descriptor.DiskFairShareBucketWeight);
}
}

////////////////////////////////////////////////////////////////////////////////
Expand Down
20 changes: 19 additions & 1 deletion yt/yt/client/misc/workload.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ struct TWorkloadDescriptor
int band = 0,
TInstant instant = {},
std::vector<TString> annotations = {},
std::optional<NConcurrency::TFairShareThreadPoolTag> compressionFairShareTag = {});
std::optional<NConcurrency::TFairShareThreadPoolTag> compressionFairShareTag = {},
std::optional<TString> diskFairShareBucketTag = {},
std::optional<double> diskFairShareBucketWeight = {});

//! The type of the workload defining its basic priority.
EWorkloadCategory Category;
Expand All @@ -43,15 +45,31 @@ struct TWorkloadDescriptor
//! If present, invoker from fair share thread pool will be used for decompression.
std::optional<NConcurrency::TFairShareThreadPoolTag> CompressionFairShareTag;

//! Bucket and weight of the workload for disks.
//! All the workload in the same DiskFairShareBucketTag gets fair share of disks according to DiskFairShareBucketWeight.
//! DiskFairShareBucketWeight should be positive. 1 is the default value. Larger is better.
std::optional<TString> DiskFairShareBucketTag;
std::optional<double> DiskFairShareBucketWeight;

//! Updates the instant field with the current time.
TWorkloadDescriptor SetCurrentInstant() const;

//! Computes the aggregated priority.
//! Larger is better.
i64 GetPriority() const;

//! Helpers to set fields.
TWorkloadDescriptor& WithCategory(EWorkloadCategory category);
TWorkloadDescriptor& WithBand(int band);
TWorkloadDescriptor& WithInstant(TInstant instant);
TWorkloadDescriptor& WithAnnotations(std::vector<TString> annotations);
TWorkloadDescriptor& WithCompressionFairShareTag(std::optional<NConcurrency::TFairShareThreadPoolTag> compressionFairShareTag);
TWorkloadDescriptor& WithDiskFairShareBucketTag(std::optional<TString> diskFairShareBucketTag);
TWorkloadDescriptor& WithDiskFairShareBucketWeight(std::optional<double> diskFairShareBucketWeight);
};

i64 GetBasicPriority(EWorkloadCategory category);
double GetBasicWeight(EWorkloadCategory category);

IInvokerPtr GetCompressionInvoker(const TWorkloadDescriptor& workloadDescriptor);

Expand Down
1 change: 1 addition & 0 deletions yt/yt/core/CMakeLists.darwin-arm64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ target_sources(yt-yt-core PRIVATE
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_share_invoker_queue.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_share_queue_scheduler_thread.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_share_thread_pool.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_share_weighted_thread_pool.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_throttler.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fiber_scheduler_thread.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fiber.cpp
Expand Down
1 change: 1 addition & 0 deletions yt/yt/core/CMakeLists.linux-x86_64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ target_sources(yt-yt-core PRIVATE
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_share_invoker_queue.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_share_queue_scheduler_thread.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_share_thread_pool.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_share_weighted_thread_pool.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fair_throttler.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fiber_scheduler_thread.cpp
${PROJECT_SOURCE_DIR}/yt/yt/core/concurrency/fiber.cpp
Expand Down
Loading
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy