cachelib/allocator/CacheStatsInternal.h (101 lines of code) (raw):

/* * Copyright (c) Facebook, Inc. and its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <array> #include <numeric> #include "cachelib/allocator/Cache.h" #include "cachelib/allocator/memory/MemoryAllocator.h" #include "cachelib/common/AtomicCounter.h" namespace facebook { namespace cachelib { // forward declaration struct GlobalCacheStats; namespace detail { // collection of stats that are updated at a high frequency, making it // necessary to track them as thread local counters that are aggregated. struct Stats { // overall hit ratio related stats for the cache. // number of calls to CacheAllocator::find TLCounter numCacheGets{0}; // number of such calls being a miss in the cache. TLCounter numCacheGetMiss{0}; // number of such calls being an expiry in the cache. This is also included // in the numCacheGetMiss stats above. TLCounter numCacheGetExpiries{0}; // number of remove calls to CacheAllocator::remove that requires // a lookup first and then remove the item TLCounter numCacheRemoves{0}; // number of remove calls that resulted in a ram hit TLCounter numCacheRemoveRamHits{0}; // number of item destructor calls from ram TLCounter numRamDestructorCalls{0}; // number of nvm gets TLCounter numNvmGets{0}; // number of nvm get miss that happened synchronously TLCounter numNvmGetMissFast{0}; // number of nvm misses TLCounter numNvmGetMiss{0}; // number of nvm isses due to internal errors TLCounter numNvmGetMissErrs{0}; // number of nvm misses due to inflight remove on the same key TLCounter numNvmGetMissDueToInflightRemove{0}; // number of nvm gets that are expired TLCounter numNvmGetMissExpired{0}; // number of gets that joined a concurrent fill for same item AtomicCounter numNvmGetCoalesced{0}; // number of deletes issues to nvm TLCounter numNvmDeletes{0}; // number of deletes skipped and not issued to nvm TLCounter numNvmSkippedDeletes{0}; // number of writes to nvm TLCounter numNvmPuts{0}; // number of put errors; TLCounter numNvmPutErrs{0}; // number of put failures due to encode call back AtomicCounter numNvmPutEncodeFailure{0}; // number of puts that observed an inflight delete and aborted AtomicCounter numNvmAbortedPutOnTombstone{0}; // number of puts that observed an inflight concurrent get and aborted AtomicCounter numNvmAbortedPutOnInflightGet{0}; // number of items that are filtered by compaction AtomicCounter numNvmCompactionFiltered{0}; // number of evictions from NvmCache TLCounter numNvmEvictions{0}; // number of evictions from nvm that found an inconsistent state in RAM AtomicCounter numNvmUncleanEvict{0}; // number of evictions that were issued for an item that was in RAM in clean // state AtomicCounter numNvmCleanEvict{0}; // number of evictions that were issued more than once on an unclean item. AtomicCounter numNvmCleanDoubleEvict{0}; // number of evictions that were already expired AtomicCounter numNvmExpiredEvict{0}; // number of item destructor calls from nvm AtomicCounter numNvmDestructorCalls{0}; // number of RefcountOverflow happens causing item destructor // being skipped in nvm AtomicCounter numNvmDestructorRefcountOverflow{0}; // number of entries that were clean in RAM, but evicted and rewritten to // nvmcache because the nvmcache version was evicted AtomicCounter numNvmPutFromClean{0}; // Decryption and Encryption errors AtomicCounter numNvmEncryptionErrors{0}; AtomicCounter numNvmDecryptionErrors{0}; // basic admission policy stats TLCounter numNvmRejectsByExpiry{0}; TLCounter numNvmRejectsByClean{0}; TLCounter numNvmRejectsByAP{0}; // attempts made from nvm cache to allocate an item for promotion TLCounter numNvmAllocAttempts{0}; // attempts made from nvm cache to allocate an item for its destructor TLCounter numNvmAllocForItemDestructor{0}; // heap allocate errors for item destrutor TLCounter numNvmItemDestructorAllocErrors{0}; // the number of allocated items that are permanent TLCounter numPermanentItems{0}; // the number of allocated and CHAINED items that are parents (i.e., // consisting of at least one chained child) TLCounter numChainedParentItems{0}; // the number of allocated and CHAINED items that are children (i.e., // allocated with a parent handle that it's chained to) TLCounter numChainedChildItems{0}; // the numbers for move and evictions in the process of slab release. AtomicCounter numMoveAttempts{0}; AtomicCounter numMoveSuccesses{0}; AtomicCounter numEvictionAttempts{0}; AtomicCounter numEvictionSuccesses{0}; // the number times a refcount overflow occurred, resulting in an exception // being thrown AtomicCounter numRefcountOverflow{0}; // number of exception occurred inside item destructor AtomicCounter numDestructorExceptions{0}; // The number of slabs being released right now. // This must be zero when `saveState()` is called. AtomicCounter numActiveSlabReleases{0}; // Number of different slab releases. AtomicCounter numReleasedForRebalance{0}; AtomicCounter numReleasedForResize{0}; AtomicCounter numReleasedForAdvise{0}; AtomicCounter numAbortedSlabReleases{0}; // allocations with invalid parameters AtomicCounter invalidAllocs{0}; // latency stats of various cachelib operations mutable util::PercentileStats allocateLatency_; mutable util::PercentileStats moveChainedLatency_; mutable util::PercentileStats moveRegularLatency_; mutable util::PercentileStats nvmLookupLatency_; mutable util::PercentileStats nvmInsertLatency_; mutable util::PercentileStats nvmRemoveLatency_; // percentile stats for various cache statistics mutable util::PercentileStats ramEvictionAgeSecs_; mutable util::PercentileStats ramItemLifeTimeSecs_; mutable util::PercentileStats nvmSmallLifetimeSecs_; mutable util::PercentileStats nvmLargeLifetimeSecs_; mutable util::PercentileStats nvmEvictionSecondsPastExpiry_; mutable util::PercentileStats nvmEvictionSecondsToExpiry_; // per-pool percentile stats for eviction age std::array<util::PercentileStats, MemoryPoolManager::kMaxPools> perPoolEvictionAgeSecs_; // This tracks in each window what are the percentiles of the sizes of // items that we have written to flash. This is at-the-moment view of what // we're currently writing into flash. mutable util::PercentileStats nvmPutSize_; using PerPoolClassAtomicCounters = std::array<std::array<AtomicCounter, MemoryAllocator::kMaxClasses>, MemoryPoolManager::kMaxPools>; // count of a stat for a specific allocation class using PerPoolClassTLCounters = std::array<std::array<TLCounter, MemoryAllocator::kMaxClasses>, MemoryPoolManager::kMaxPools>; // hit count for every alloc class in every pool std::unique_ptr<PerPoolClassTLCounters> cacheHits{}; std::unique_ptr<PerPoolClassAtomicCounters> allocAttempts{}; std::unique_ptr<PerPoolClassAtomicCounters> allocFailures{}; std::unique_ptr<PerPoolClassAtomicCounters> fragmentationSize{}; std::unique_ptr<PerPoolClassAtomicCounters> chainedItemEvictions{}; std::unique_ptr<PerPoolClassAtomicCounters> regularItemEvictions{}; // Eviction failures due to parent cannot be removed from access container AtomicCounter evictFailParentAC{0}; // Eviction failures due to parent cannot be removed because it's being // moved AtomicCounter evictFailParentMove{0}; // Eviction failures because this item cannot be removed from access // container AtomicCounter evictFailAC{0}; // Eviction failures because this item has a potential concurrent fill // from nvm cache. For consistency reason, we cannot evict it. Refer // to NvmCache.h for more details. AtomicCounter evictFailConcurrentFill{0}; // Eviction failures because this item is being moved AtomicCounter evictFailMove{0}; void init(); void populateGlobalCacheStats(GlobalCacheStats& ret) const; }; } // namespace detail } // namespace cachelib } // namespace facebook