Skip to content
Merged
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
22 changes: 14 additions & 8 deletions ydb/core/blobstorage/lwtrace_probes/blobstorage_probes.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,22 +207,22 @@ struct TEventTypeField {
NAMES("pdisk", "schedStep")) \
PROBE(PDiskChunkReadPieceAddToScheduler, GROUPS("PDisk", "PDiskRequest"), \
TYPES(TPDiskIdField, ui32, ui64, ui64), \
NAMES("pdisk", "pieceIdx", "size", "offset")) \
PROBE(PDiskChunkReadPieceSendToDevice, GROUPS("PDisk", "PDiskRequest"), \
TYPES(TPDiskIdField, ui64), \
NAMES("pdisk", "size")) \
NAMES("pdisk", "pieceIdx", "offset", "size")) \
PROBE(PDiskChunkReadPiecesSendToDevice, GROUPS("PDisk", "PDiskRequest"), \
TYPES(TPDiskIdField), \
NAMES("pdisk")) \
PROBE(PDiskChunkReadPieceComplete, GROUPS("PDisk", "PDiskRequest"), \
TYPES(TPDiskIdField, ui64, ui64), \
NAMES("pdisk", "size", "relativeOffset")) \
TYPES(TPDiskIdField, ui64, ui64, double), \
NAMES("pdisk", "size", "relativeOffset", "deviceTimeMs")) \
PROBE(PDiskAddWritePieceToScheduler, GROUPS("PDisk", "PDiskRequest"), \
TYPES(TPDiskIdField, ui64, double, ui64, bool, ui64, ui64), \
NAMES("pdisk", "reqId", "creationTimeSec", "owner", "isFast", "priorityClass", "size")) \
PROBE(PDiskChunkWritePieceSendToDevice, GROUPS("PDisk", "PDiskRequest"), \
TYPES(TPDiskIdField, ui64, ui64, ui64, ui64), \
NAMES("pdisk", "owner", "chunkIdx", "pieceOffset", "pieceSize")) \
PROBE(PDiskLogWriteComplete, GROUPS("PDisk", "PDiskRequest"), \
TYPES(TPDiskIdField, ui64, double, double, double, double, double, double), \
NAMES("pdisk", "reqId", "creationTimeSec", "costMs", "responseTimeMs", "inputTimeMs", "scheduleTimeMs", "deviceTotalTimeMs")) \
TYPES(TPDiskIdField, ui64, double, double, double, double, double, double, double), \
NAMES("pdisk", "reqId", "creationTimeSec", "costMs", "responseTimeMs", "inputTimeMs", "scheduleTimeMs", "deviceTotalTimeMs", "deviceOnlyTimeMs")) \
PROBE(PDiskChunkResponseTime, GROUPS("PDisk", "PDiskRequest"), \
TYPES(TPDiskIdField, ui64, ui64, double, ui64), \
NAMES("pdisk", "reqId", "priorityClass", "responseTimeMs", "sizeBytes")) \
Expand All @@ -235,6 +235,12 @@ struct TEventTypeField {
PROBE(PDiskDeviceWriteDuration, GROUPS("PDisk"), \
TYPES(TPDiskIdField, double, ui64), \
NAMES("pdisk", "deviceTimeMs", "size")) \
PROBE(PDiskDeviceGetFromDevice, GROUPS("PDisk"), \
TYPES(), \
NAMES()) \
PROBE(PDiskDeviceGetFromWaiting, GROUPS("PDisk"), \
TYPES(), \
NAMES()) \
PROBE(PDiskDeviceTrimDuration, GROUPS("PDisk"), \
TYPES(TPDiskIdField, double, ui64), \
NAMES("pdisk", "trimTimeMs", "trimOffset")) \
Expand Down
30 changes: 18 additions & 12 deletions ydb/core/blobstorage/pdisk/blobstorage_pdisk_blockdevice_async.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,8 +334,8 @@ class TRealBlockDevice : public IBlockDevice {
class TSharedCallback : public ICallback {
ui64 NextPossibleNoop = 0;
ui64 EndOffset = 0;
ui64 PrevEventGotAtCycle = HPNow();
ui64 PrevEstimationAtCycle = HPNow();
NHPTimer::STime PrevEventGotAtCycle = HPNow();
NHPTimer::STime PrevEstimationAtCycle = HPNow();
ui64 PrevEstimatedCostNs = 0;
ui64 PrevActualCostNs = 0;

Expand Down Expand Up @@ -366,29 +366,32 @@ class TRealBlockDevice : public IBlockDevice {
void Exec(TAsyncIoOperationResult *event) {
IAsyncIoOperation *op = event->Operation;
// Add up the execution time of all the events
ui64 totalExecutionCycles = 0;
ui64 totalCostNs = 0;
ui64 eventGotAtCycle = HPNow();
NHPTimer::STime eventGotAtCycle = HPNow();
AtomicSet(Device.Mon.LastDoneOperationTimestamp, eventGotAtCycle);

TCompletionAction *completionAction = static_cast<TCompletionAction*>(op->GetCookie());
FillCompletionAction(completionAction, op, event->Result);
completionAction->GetTime = eventGotAtCycle;
LWTRACK(PDiskDeviceGetFromDevice, completionAction->Orbit);
if (completionAction->FlushAction) {
completionAction->FlushAction->GetTime = eventGotAtCycle;
LWTRACK(PDiskDeviceGetFromDevice, completionAction->FlushAction->Orbit);
}

Device.QuitCounter.Decrement();
Device.IdleCounter.Decrement();
Device.FlightControl.MarkComplete(completionAction->OperationIdx);

ui64 startCycle = Max((ui64)completionAction->SubmitTime, PrevEventGotAtCycle);
ui64 durationCycles = (eventGotAtCycle > startCycle) ? eventGotAtCycle - startCycle : 0;
totalExecutionCycles = Max(totalExecutionCycles, durationCycles);
totalCostNs += completionAction->CostNs;
NHPTimer::STime startCycle = Max(completionAction->SubmitTime, (i64)PrevEventGotAtCycle);
NHPTimer::STime durationCycles = (eventGotAtCycle > startCycle) ? eventGotAtCycle - startCycle : 0;
NHPTimer::STime totalExecutionCycles = durationCycles;
NHPTimer::STime totalCostNs = completionAction->CostNs;

bool isSeekExpected =
((ui64)completionAction->SubmitTime + Device.SeekCostNs / 25ull >= PrevEventGotAtCycle);
bool isSeekExpected = (completionAction->SubmitTime + (NHPTimer::STime)Device.SeekCostNs / 25ll >= PrevEventGotAtCycle);

const ui64 opSize = op->GetSize();
Device.DecrementMonInFlight(op->GetType(), opSize);
if (opSize == 0) {
if (opSize == 0) { // Special case for flush operation, which is a read operation with 0 bytes size
if (op->GetType() == IAsyncIoOperation::EType::PRead) {
Y_ABORT_UNLESS(WaitingNoops[completionAction->OperationIdx % MaxWaitingNoops] == nullptr);
WaitingNoops[completionAction->OperationIdx % MaxWaitingNoops] = completionAction;
Expand Down Expand Up @@ -432,6 +435,9 @@ class TRealBlockDevice : public IBlockDevice {
while (NextPossibleNoop < firstIncompleteIdx) {
ui64 i = NextPossibleNoop % MaxWaitingNoops;
if (WaitingNoops[i] && WaitingNoops[i]->OperationIdx == NextPossibleNoop) {
LWTRACK(PDiskDeviceGetFromWaiting, WaitingNoops[i]->Orbit);
double durationMs = HPMilliSecondsFloat(HPNow() - WaitingNoops[i]->GetTime);
Device.Mon.DeviceFlushDuration.Increment(durationMs);
Device.CompletionThread->Schedule(WaitingNoops[i]);
WaitingNoops[i] = nullptr;
}
Expand Down
1 change: 1 addition & 0 deletions ydb/core/blobstorage/pdisk/blobstorage_pdisk_completion.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ namespace NKikimr::NPDisk {
struct TCompletionAction {
ui64 OperationIdx;
NHPTimer::STime SubmitTime;
NHPTimer::STime GetTime;
TCompletionAction *FlushAction = nullptr;
ui64 CostNs = 0;
NWilson::TTraceId TraceId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ void TCompletionLogWrite::Exec(TActorSystem *actorSystem) {
HPMilliSecondsFloat(now - evLog.CreationTime),
HPMilliSecondsFloat(evLog.InputTime - evLog.CreationTime),
HPMilliSecondsFloat(evLog.ScheduleTime - evLog.InputTime),
HPMilliSecondsFloat(now - evLog.ScheduleTime));
HPMilliSecondsFloat(now - evLog.ScheduleTime),
HPMilliSecondsFloat(GetTime - SubmitTime));
if (evLog.Result->Results) {
evLog.Result->Results.front().Orbit = std::move(evLog.Orbit);
}
Expand Down Expand Up @@ -274,7 +275,8 @@ void TCompletionChunkReadPart::Exec(TActorSystem *actorSystem) {
endBadUserOffset = 0xffffffff;
}

LWTRACK(PDiskChunkReadPieceComplete, Read->Orbit, PDisk->PDiskId, RawReadSize, CommonBufferOffset);
double deviceTimeMs = HPMilliSecondsFloat(GetTime - SubmitTime);
LWTRACK(PDiskChunkReadPieceComplete, Read->Orbit, PDisk->PDiskId, RawReadSize, CommonBufferOffset, deviceTimeMs);
CumulativeCompletion->PartReadComplete(actorSystem);
CumulativeCompletion = nullptr;

Expand Down
5 changes: 3 additions & 2 deletions ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2289,6 +2289,7 @@ void TPDisk::ProcessChunkReadQueue() {
bool isComplete = false;
ui8 priorityClass = read->PriorityClass;
NHPTimer::STime creationTime = read->CreationTime;
LWTRACK(PDiskChunkReadPiecesSendToDevice, read->Orbit, PDiskId);
if (!read->IsReplied) {
LOG_DEBUG_S(*ActorSystem, NKikimrServices::BS_PDISK, "PDiskId# " << (ui32)PDiskId
<< " ReqId# " << reqId
Expand Down Expand Up @@ -3239,7 +3240,7 @@ void TPDisk::PushRequestToForseti(TRequestBase *request) {
// Schedule small job.
auto piece = new TChunkReadPiece(read, idx * smallJobSize,
smallJobSize * Format.SectorSize, false, std::move(span));
LWTRACK(PDiskChunkReadPieceAddToScheduler, read->Orbit, PDiskId, idx, idx * smallJobSize,
LWTRACK(PDiskChunkReadPieceAddToScheduler, read->Orbit, PDiskId, idx, idx * smallJobSize * Format.SectorSize,
smallJobSize * Format.SectorSize);
piece->EstimateCost(DriveModel);
piece->SelfPointer = piece;
Expand All @@ -3251,7 +3252,7 @@ void TPDisk::PushRequestToForseti(TRequestBase *request) {
auto piece = new TChunkReadPiece(read, smallJobCount * smallJobSize,
largeJobSize * Format.SectorSize, true, std::move(span));
LWTRACK(PDiskChunkReadPieceAddToScheduler, read->Orbit, PDiskId, smallJobCount,
smallJobCount * smallJobSize, largeJobSize * Format.SectorSize);
smallJobCount * smallJobSize * Format.SectorSize, largeJobSize * Format.SectorSize);
piece->EstimateCost(DriveModel);
piece->SelfPointer = piece;
AddJobToForseti(cbs, piece, request->JobKind);
Expand Down
1 change: 1 addition & 0 deletions ydb/core/blobstorage/pdisk/blobstorage_pdisk_mon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ TPDiskMon::TPDiskMon(const TIntrusivePtr<::NMonitoring::TDynamicCounters>& count
HISTOGRAM_INIT(DeviceReadDuration, deviceReadDuration);
HISTOGRAM_INIT(DeviceWriteDuration, deviceWriteDuration);
HISTOGRAM_INIT(DeviceTrimDuration, deviceTrimDuration);
HISTOGRAM_INIT(DeviceFlushDuration, deviceFlushDuration);

TRACKER_INIT_IF_EXTENDED(LogQueueTime, logQueueTime, Time in millisec);
TRACKER_INIT_IF_EXTENDED(GetQueueSyncLog, getQueueSyncLog, Time in millisec);
Expand Down
1 change: 1 addition & 0 deletions ydb/core/blobstorage/pdisk/blobstorage_pdisk_mon.h
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ struct TPDiskMon {
THistogram DeviceReadDuration;
THistogram DeviceWriteDuration;
THistogram DeviceTrimDuration;
THistogram DeviceFlushDuration;

// <BASE_BITS, EXP_BITS, FRAME_COUNT>
using TDurationTracker = NMonitoring::TPercentileTrackerLg<5, 4, 15>;
Expand Down