diff options
| author | Vlad Kuznetsov <[email protected]> | 2026-07-17 16:16:13 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-07-17 16:16:13 +0200 |
| commit | 9faeb0fb5545fd90dc096d0f1eb5890469d8c472 (patch) | |
| tree | c6043a2f7f72a48d78b8ab7fac7f8203c60e0e28 | |
| parent | 462b35b1d3bc7a668b784cf0f313bec2793738e2 (diff) | |
NBYDB-2344: Implement flag for disable sorting of chunks on HDD (#46786)
7 files changed, 49 insertions, 1 deletions
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h index 729fd7dbaa6..a86e117e11c 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h @@ -185,6 +185,8 @@ struct TPDiskConfig : public TThrRefBase { bool ReadOnly = false; + bool SortFreeChunksHDD = true; + // used for tests only std::optional<ui64> NonceRandNum; @@ -463,6 +465,10 @@ struct TPDiskConfig : public TThrRefBase { if (cfg->HasSeparateHugePriorities()) { SeparateHugePriorities = cfg->GetSeparateHugePriorities(); } + + if (cfg->HasSortFreeChunksHDD()) { + SortFreeChunksHDD = cfg->GetSortFreeChunksHDD(); + } } ui32 GetOwnerWeight(ui32 groupSizeInUnits) { diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_free_chunks.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_free_chunks.h index 2f7cb207162..49e7ef33c6a 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_free_chunks.h +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_free_chunks.h @@ -5,6 +5,7 @@ #include <util/generic/algorithm.h> #include <util/generic/queue.h> +#include <util/random/shuffle.h> namespace NKikimr { namespace NPDisk { @@ -21,6 +22,7 @@ protected: ::NMonitoring::TDynamicCounters::TCounterPtr MonFreeChunks; ui64 OutOfOrderCount; const ui64 SortFreeChunksPerItems; + bool SortingEnabled = true; public: TFreeChunks(::NMonitoring::TDynamicCounters::TCounterPtr &monFreeChunks, ui64 sortFreeChunksPerItems) : FreeChunkCount(0) @@ -42,7 +44,11 @@ public: return 0; } if (OutOfOrderCount > SortFreeChunksPerItems) { - Sort(FreeChunks.begin(), FreeChunks.end()); + if (SortingEnabled) { + Sort(FreeChunks.begin(), FreeChunks.end()); + } else { + Shuffle(FreeChunks.begin(), FreeChunks.end()); + } OutOfOrderCount = 0; } TChunkIdx idx = FreeChunks.front(); @@ -77,6 +83,10 @@ public: MonFreeChunks->Inc(); } + void SetSortingEnabled(bool enabled) { + SortingEnabled = enabled; + } + // A thread-safe function that returns the current number of free chunks. ui32 Size() const { return AtomicGet(FreeChunkCount); } }; diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp index d35266eb480..1d597380fc0 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp @@ -67,6 +67,7 @@ TPDisk::TPDisk(std::shared_ptr<TPDiskCtx> pCtx, const TIntrusivePtr<TPDiskConfig ForsetiMaxLogBatchNsCached = ForsetiMaxLogBatchNs; ForsetiOpPieceSize = TControlWrapper(Cfg->IoPieceSizeBytes, 1, Cfg->BufferPoolBufferSizeBytes); ForsetiOpPieceSizeCached = ForsetiOpPieceSize; + EnableFreeChunksSortingHDD = TControlWrapper(Cfg->SortFreeChunksHDD, 0, 1); UseNoopSchedulerSSD = TControlWrapper(Cfg->UseNoopScheduler, 0, 1); UseNoopSchedulerHDD = TControlWrapper(Cfg->UseNoopScheduler, 0, 1); ChunkBaseLimitPerMille = TControlWrapper(0, 0, 130); // 0 means ChunkBaseLimit isn't configured via ICB @@ -3087,6 +3088,7 @@ bool TPDisk::Initialize() { REGISTER_LOCAL_CONTROL(ForsetiMilliBatchSize); REGISTER_LOCAL_CONTROL(ForsetiMaxLogBatchNs); REGISTER_LOCAL_CONTROL(ForsetiOpPieceSize); + REGISTER_LOCAL_CONTROL(EnableFreeChunksSortingHDD); TControlBoard::RegisterSharedControl(UseNoopSchedulerHDD, icb->PDiskControls.UseNoopSchedulerHDD); TControlBoard::RegisterSharedControl(UseNoopSchedulerSSD, icb->PDiskControls.UseNoopSchedulerSSD); REGISTER_LOCAL_CONTROL(ChunkBaseLimitPerMille); @@ -4228,6 +4230,10 @@ void TPDisk::Update() { SemiStrictSpaceIsolationCached = currentIsolation; } + if (!PDiskCategory.IsSolidState()) { // HDD + Keeper.SetFreeChunksSortingEnabled(EnableFreeChunksSortingHDD); + } + // Switch the scheduler when possible ForsetiScheduler.SetIsBinLogEnabled(EnableForsetiBinLog); diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h index ddb6c3ecb0e..a34a501c523 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h @@ -107,6 +107,7 @@ public: TControlWrapper ForsetiMilliBatchSize; TControlWrapper ForsetiMaxLogBatchNs; TControlWrapper ForsetiOpPieceSize; + TControlWrapper EnableFreeChunksSortingHDD; TControlWrapper UseNoopSchedulerSSD; TControlWrapper UseNoopSchedulerHDD; TControlWrapper ChunkBaseLimitPerMille; diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h index 4120c7c9b32..d181672aa76 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h @@ -54,6 +54,11 @@ public: TrimmedFreeChunks.Push(chunkIdx); } + void SetFreeChunksSortingEnabled(bool enabled) { + UntrimmedFreeChunks.SetSortingEnabled(enabled); + TrimmedFreeChunks.SetSortingEnabled(enabled); + } + // // Add/remove owner // diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_util_ut.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_util_ut.cpp index b19e09e53b2..51c7e4e002a 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_util_ut.cpp +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_util_ut.cpp @@ -3,6 +3,7 @@ #include "blobstorage_pdisk_chunk_id_formatter.h" #include "blobstorage_pdisk_data.h" #include "blobstorage_pdisk_driveestimator.h" +#include "blobstorage_pdisk_free_chunks.h" #include "blobstorage_pdisk_impl.h" #include "blobstorage_pdisk_mon.h" #include "blobstorage_pdisk_sectorrestorator.h" @@ -26,6 +27,24 @@ namespace NKikimr { namespace NPDisk { Y_UNIT_TEST_SUITE(TPDiskUtil) { + Y_UNIT_TEST(FreeChunksSortingCanBeToggled) { + TIntrusivePtr<::NMonitoring::TDynamicCounters> counters = new ::NMonitoring::TDynamicCounters; + auto counter = counters->GetCounter("FreeChunks"); + TFreeChunks freeChunks(counter, 3); + + freeChunks.SetSortingEnabled(false); + freeChunks.Push(5); + freeChunks.Push(1); + UNIT_ASSERT_VALUES_EQUAL(freeChunks.Pop(), 5); + + freeChunks.Push(4); + freeChunks.Push(2); + freeChunks.Push(3); + freeChunks.SetSortingEnabled(true); + UNIT_ASSERT_VALUES_EQUAL(freeChunks.Pop(), 1); + UNIT_ASSERT_VALUES_EQUAL(freeChunks.Pop(), 2); + } + Y_UNIT_TEST(AtomicBlockCounterFunctional) { TAtomicBlockCounter counter; UNIT_ASSERT_EQUAL(counter.Get(), 0); diff --git a/ydb/core/protos/blobstorage_pdisk_config.proto b/ydb/core/protos/blobstorage_pdisk_config.proto index 56f251469e8..c0e7c0fd138 100644 --- a/ydb/core/protos/blobstorage_pdisk_config.proto +++ b/ydb/core/protos/blobstorage_pdisk_config.proto @@ -99,4 +99,5 @@ message TPDiskConfig { optional bool SeparateHugePriorities = 2007; optional bool UseBytesFlightControl = 2008; optional uint32 IoPieceSizeBytes = 2009; + optional bool SortFreeChunksHDD = 2010; }; |
