Files
dan engelbrecht ba66b561de For local Zen DDC connections show the path where data is store in the Cache Statistics tab for DDC instead of local ip address
For Zen DDC connection show the storage size
#jira UE-199929
#rb Devin.Doucette

[CL 30501101 by dan engelbrecht in ue5-main branch]
2024-01-09 06:08:29 -05:00

201 lines
6.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Async/Mutex.h"
#include "Async/UniqueLock.h"
#include "Containers/Array.h"
#include "DerivedDataCacheKey.h"
#include "DerivedDataCacheStore.h"
#include "Internationalization/Text.h"
#include "Misc/MonotonicTime.h"
#include "ProfilingDebugging/CookStats.h"
namespace UE::DerivedData { class FCacheStats; }
namespace UE::DerivedData
{
class FRequestCounter
{
struct FCounter
{
uint64 Hits = 0;
uint64 Misses = 0;
};
using ERequestOp = ECacheStoreRequestOp;
using ERequestType = ECacheStoreRequestType;
public:
void AddRequest(ERequestType Type, ERequestOp Op, EStatus Status);
constexpr uint64 Puts() const { return PutHits() + PutMisses(); }
constexpr uint64 PutHits() const { return PutRecord.Hits + PutValue.Hits; }
constexpr uint64 PutMisses() const { return PutRecord.Misses + PutValue.Misses; }
constexpr uint64 Gets() const { return GetHits() + GetMisses(); }
constexpr uint64 GetHits() const { return GetRecord.Hits + GetValue.Hits + GetRecordChunk.Hits + GetValueChunk.Hits; }
constexpr uint64 GetMisses() const { return GetRecord.Misses + GetValue.Misses + GetRecordChunk.Misses + GetValueChunk.Misses; }
constexpr uint64 Total() const { return Puts() + Gets(); }
constexpr uint64 TotalHits() const { return PutHits() + GetHits(); }
constexpr uint64 TotalMisses() const { return PutMisses() + GetMisses(); }
private:
FCounter PutRecord;
FCounter PutValue;
FCounter GetRecord;
FCounter GetValue;
FCounter GetRecordChunk;
FCounter GetValueChunk;
};
class FTimeAveragedStat
{
public:
void SetPeriod(FMonotonicTimeSpan NewPeriod) { Period = NewPeriod; }
void Add(FMonotonicTimePoint StartTime, FMonotonicTimePoint EndTime, double Value);
/** Calculate and return the average rate at the time. Time must be monotonically increasing. */
double GetRate(FMonotonicTimePoint Time);
/** Calculate and return the average value at the time. Time must be monotonically increasing. */
double GetValue(FMonotonicTimePoint Time);
private:
void Update(FMonotonicTimePoint Time);
struct FRange
{
FMonotonicTimePoint StartTime;
FMonotonicTimePoint EndTime;
};
struct FValue
{
FMonotonicTimePoint Time;
double Value = 0.0;
};
/** Period of time that this stat is averaged over. */
FMonotonicTimeSpan Period;
/** Time at which the most recent update occurred. */
FMonotonicTimePoint LastTime;
/** Ranges of time that have values. */
TArray<FRange> ActiveRanges;
/** Values that start later than the most recent update time. */
TArray<FValue> StartValues;
/** Values that end later than the most recent update time. */
TArray<FValue> EndValues;
/** Average rate from the last update that had values, or 0. */
double AverageRate = 0.0;
/** Average value from the last update that had values, or 0. */
double AverageValue = 0.0;
/** Sum of values in the period up to the most recent update time. */
double AccumulatedValue = 0.0;
/** Number of values within the period at the most recent update time. */
int32 AccumulatedValueCount = 0;
/** Mutex that can be used to synchronize access to the stat from multiple threads. */
FMutex Mutex;
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class FCacheBucketStats final
{
public:
/** Name of the cache bucket. */
FCacheBucket Bucket;
/** Size of the raw data and metadata that was read from the cache bucket. */
uint64 LogicalReadSize = 0;
/** Size of the raw data and metadata that was written to the cache bucket. */
uint64 LogicalWriteSize = 0;
/** Size of the compressed data and anything else that was read from the cache bucket. */
uint64 PhysicalReadSize = 0;
/** Size of the compressed data and anything else that was written to the cache bucket. */
uint64 PhysicalWriteSize = 0;
/** Approximate CPU time on the main thread that was needed to satisfy requests in the cache bucket. */
FMonotonicTimeSpan MainThreadTime;
/** Approximate CPU time off the main thread that was needed to satisfy requests in the cache bucket. */
FMonotonicTimeSpan OtherThreadTime;
/** Count of requests that accessed the cache bucket. */
FRequestCounter RequestCount;
/** Mutex that can be used to synchronize access to the cache buckets stats from multiple threads. */
mutable FMutex Mutex;
#if ENABLE_COOK_STATS
FCookStats::CallStats GetStats;
FCookStats::CallStats PutStats;
#endif
};
class FCacheStoreStats final : public ICacheStoreStats
{
public:
FCacheStoreStats(FCacheStats& CacheStats, ECacheStoreFlags Flags, FStringView Type, FStringView Name, FStringView Path);
FString Type;
FString Name;
FString Path;
FText Status;
ECacheStoreFlags Flags = ECacheStoreFlags::None;
ECacheStoreStatusCode StatusCode = ECacheStoreStatusCode::None;
mutable FMutex Mutex;
TMap<FString, FString> Attributes;
FCacheStats& CacheStats;
/** Size of the raw data and metadata that was read from the cache store. */
uint64 LogicalReadSize = 0;
/** Size of the raw data and metadata that was written to the cache store. */
uint64 LogicalWriteSize = 0;
/** Size of the compressed data and anything else that was read from the cache store. */
uint64 PhysicalReadSize = 0;
/** Size of the compressed data and anything else that was written to the cache store. */
uint64 PhysicalWriteSize = 0;
/** Approximate CPU time on the main thread that was needed. */
FMonotonicTimeSpan MainThreadTime;
/** Approximate CPU time off the main thread that was needed. */
FMonotonicTimeSpan OtherThreadTime;
/** Count of requests that accessed the cache store. */
FRequestCounter RequestCount;
/** Total size of the data in the cache store, ~0ull indicate that the information is not available */
uint64 TotalPhysicalSize = ~0ull;
FTimeAveragedStat AverageLatency;
FTimeAveragedStat AveragePhysicalReadSize;
FTimeAveragedStat AveragePhysicalWriteSize;
#if ENABLE_COOK_STATS
FCookStats::CallStats GetStats;
FCookStats::CallStats PutStats;
#endif
private:
FStringView GetType() const final { return Type; }
FStringView GetName() const final { return Name; }
FStringView GetPath() const final { return Path; }
void SetFlags(ECacheStoreFlags Flags) final;
void SetStatus(ECacheStoreStatusCode StatusCode, const FText& Status) final;
void SetAttribute(FStringView Key, FStringView Value) final;
void AddRequest(const FCacheStoreRequestStats& Stats) final;
void AddLatency(FMonotonicTimePoint StartTime, FMonotonicTimePoint EndTime, FMonotonicTimeSpan Latency) final;
double GetAverageLatency() final;
void SetTotalPhysicalSize(uint64 TotalPhysicalSize) final;
};
class FCacheStats final
{
public:
TArray<TUniquePtr<FCacheBucketStats>> BucketStats;
TArray<TUniquePtr<FCacheStoreStats>> StoreStats;
mutable FMutex Mutex;
FCacheBucketStats& GetBucket(FCacheBucket Bucket);
};
} // UE::DerivedData