From 9fe9ac67b62b5ccf518307623a8e57316cfa6095 Mon Sep 17 00:00:00 2001 From: Sergey Belyakov Date: Thu, 15 Feb 2024 12:29:01 +0300 Subject: [PATCH] Fix burst tests, adjust cost bucket inflow dynamically (#1778) --- .../blobstorage/ut_blobstorage/monitoring.cpp | 4 +-- .../vdisk/common/blobstorage_cost_tracker.cpp | 2 +- .../vdisk/common/blobstorage_cost_tracker.h | 31 +++++++++++++++++-- .../vdisk/skeleton/skeleton_oos_tracker.cpp | 4 ++- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/ydb/core/blobstorage/ut_blobstorage/monitoring.cpp b/ydb/core/blobstorage/ut_blobstorage/monitoring.cpp index 58c8f833c441..4b2808812839 100644 --- a/ydb/core/blobstorage/ut_blobstorage/monitoring.cpp +++ b/ydb/core/blobstorage/ut_blobstorage/monitoring.cpp @@ -445,8 +445,8 @@ Y_UNIT_TEST(Test##requestType##distribution) { } Y_UNIT_TEST_SUITE(BurstDetection) { - MAKE_BURST_TEST(Put, 50, 1, TDuration::MilliSeconds(100), Evenly); - MAKE_BURST_TEST(Put, 50, 100, TDuration::Zero(), Burst); + MAKE_BURST_TEST(Put, 10, 1, TDuration::Seconds(1), Evenly); + MAKE_BURST_TEST(Put, 10, 100, TDuration::MilliSeconds(1), Burst); } #undef MAKE_BURST_TEST diff --git a/ydb/core/blobstorage/vdisk/common/blobstorage_cost_tracker.cpp b/ydb/core/blobstorage/vdisk/common/blobstorage_cost_tracker.cpp index 1a5ec980f8ee..e60a1030dfd0 100644 --- a/ydb/core/blobstorage/vdisk/common/blobstorage_cost_tracker.cpp +++ b/ydb/core/blobstorage/vdisk/common/blobstorage_cost_tracker.cpp @@ -50,7 +50,7 @@ TBsCostTracker::TBsCostTracker(const TBlobStorageGroupType& groupType, NPDisk::E , ScrubDiskCost(CostCounters->GetCounter("ScrubDiskCost", true)) , DefragDiskCost(CostCounters->GetCounter("DefragDiskCost", true)) , InternalDiskCost(CostCounters->GetCounter("InternalDiskCost", true)) - , Bucket(&BucketInflow, &BucketCapacity, nullptr, nullptr, nullptr, nullptr, true) + , Bucket(&DiskTimeAvailableNs, &BucketCapacity, nullptr, nullptr, nullptr, nullptr, true) { BurstDetector.Initialize(CostCounters, "BurstDetector"); switch (GroupType.GetErasure()) { diff --git a/ydb/core/blobstorage/vdisk/common/blobstorage_cost_tracker.h b/ydb/core/blobstorage/vdisk/common/blobstorage_cost_tracker.h index 58e3f425ebc9..a93c6da5e8b5 100644 --- a/ydb/core/blobstorage/vdisk/common/blobstorage_cost_tracker.h +++ b/ydb/core/blobstorage/vdisk/common/blobstorage_cost_tracker.h @@ -278,6 +278,29 @@ class TBsCostModelBase { } }; +struct TFailTimer { + using TTime = TInstant; + static TTime Now() { + Y_FAIL(); + } +}; + +template +struct TAppDataTimerMs { + using TTime = TInstant; + static constexpr ui64 Resolution = 1000ull; // milliseconds + static TTime Now() { + if (NKikimr::TAppData::TimeProvider) { + return NKikimr::TAppData::TimeProvider->Now(); + } else { + return TBackupTimer::Now(); + } + } + static ui64 Duration(TTime from, TTime to) { + return (to - from).MilliSeconds(); + } +}; + using TBsCostModelErasureNone = TBsCostModelBase; class TBsCostModelMirror3dc; class TBsCostModel4Plus2Block; @@ -296,8 +319,8 @@ class TBsCostTracker { ::NMonitoring::TDynamicCounters::TCounterPtr InternalDiskCost; TAtomic BucketCapacity = 1'000'000'000; // 10^9 nsec - TAtomic BucketInflow = 1'000'000'000; // 10^9 nsec - TBucketQuoter Bucket; + TAtomic DiskTimeAvailableNs = 1'000'000'000; + TBucketQuoter> Bucket; TLight BurstDetector; std::atomic SeqnoBurstDetector = 0; static constexpr ui32 ConcurrentHugeRequestsAllowed = 3; @@ -349,6 +372,10 @@ class TBsCostTracker { BurstDetector.Set(!Bucket.IsAvail(), SeqnoBurstDetector.fetch_add(1)); } + void SetTimeAvailable(ui32 diskTimeAvailableNSec) { + AtomicSet(DiskTimeAvailableNs, diskTimeAvailableNSec); + } + public: template void CountUserRequest(const TEvent& ev) { diff --git a/ydb/core/blobstorage/vdisk/skeleton/skeleton_oos_tracker.cpp b/ydb/core/blobstorage/vdisk/skeleton/skeleton_oos_tracker.cpp index a924e52057ad..d0d5715a01b9 100644 --- a/ydb/core/blobstorage/vdisk/skeleton/skeleton_oos_tracker.cpp +++ b/ydb/core/blobstorage/vdisk/skeleton/skeleton_oos_tracker.cpp @@ -92,7 +92,9 @@ namespace NKikimr { MonGroup.DskTotalBytes() = msg->TotalChunks * PDiskCtx->Dsk->ChunkSize; MonGroup.DskFreeBytes() = msg->FreeChunks * PDiskCtx->Dsk->ChunkSize; if (msg->NumSlots > 0) { - CostGroup.DiskTimeAvailableNs() = 1'000'000'000ull / msg->NumSlots; + ui32 timeAvailable = 1'000'000'000 / msg->NumSlots; + CostGroup.DiskTimeAvailableNs() = timeAvailable; + VCtx->CostTracker->SetTimeAvailable(timeAvailable); } Become(&TThis::WaitFunc);