Files
mongo/api/leveldb/basho/perf_count.h

299 lines
12 KiB
C++

// -------------------------------------------------------------------
//
// perf_count.h: performance counters LevelDB
//
// Copyright (c) 2012-2013 Basho Technologies, Inc. All Rights Reserved.
//
// This file is provided to you 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.
//
// -------------------------------------------------------------------
#ifndef STORAGE_LEVELDB_INCLUDE_PERF_COUNT_H_
#define STORAGE_LEVELDB_INCLUDE_PERF_COUNT_H_
#include "leveldb_wt_config.h"
#include <stdint.h>
#include <string>
#include "status.h"
namespace leveldb {
enum SstCountEnum
{
//
// array index values/names
//
eSstCountKeys=0, //!< how many keys in this sst
eSstCountBlocks=1, //!< how many blocks in this sst
eSstCountCompressAborted=2,//!< how many blocks attempted compression and aborted use
eSstCountKeySize=3, //!< byte count of all keys
eSstCountValueSize=4, //!< byte count of all values
eSstCountBlockSize=5, //!< byte count of all blocks (pre-compression)
eSstCountBlockWriteSize=6, //!< post-compression size, or BlockSize if no compression
eSstCountIndexKeys=7, //!< how many keys in the index block
eSstCountKeyLargest=8, //!< largest key in sst
eSstCountKeySmallest=9, //!< smallest key in sst
eSstCountValueLargest=10, //!< largest value in sst
eSstCountValueSmallest=11, //!< smallest value in sst
eSstCountDeleteKey=12, //!< tombstone count
eSstCountBlockSizeUsed=13, //!< Options::block_size used with this file
eSstCountUserDataSize=14, //!< post-compression size of non-metadata (user keys/values/block overhead)
// must follow last index name to represent size of array
eSstCountEnumSize, //!< size of the array described by the enum values
eSstCountVersion=1
}; // enum SstCountEnum
class SstCounters
{
protected:
bool m_IsReadOnly; //!< set when data decoded from a file
uint32_t m_Version; //!< object revision identification
uint32_t m_CounterSize; //!< number of objects in m_Counter
uint64_t m_Counter[eSstCountEnumSize];
public:
// constructors / destructor
SstCounters();
// Put data into disk form
void EncodeTo(std::string & Dst) const;
// Populate member data from prior EncodeTo block
Status DecodeFrom(const Slice& src);
// increment the counter
uint64_t Inc(unsigned Index);
// add value to the counter
uint64_t Add(unsigned Index, uint64_t Amount);
// return value of a counter
uint64_t Value(unsigned Index) const;
// set a value
void Set(unsigned Index, uint64_t);
// return number of counters
uint32_t Size() const {return(m_CounterSize);};
// printf all values
void Dump() const;
}; // class SstCounters
extern struct PerformanceCounters * gPerfCounters;
enum PerformanceCountersEnum
{
//
// array index values/names
// (enum explicitly numbered to allow future edits / moves / inserts)
//
ePerfROFileOpen=0, //!< PosixMmapReadableFile open
ePerfROFileClose=1, //!< closed
ePerfROFileUnmap=2, //!< unmap without close
ePerfRWFileOpen=3, //!< PosixMmapFile open
ePerfRWFileClose=4, //!< closed
ePerfRWFileUnmap=5, //!< unmap without close
ePerfApiOpen=6, //!< Count of DB::Open completions
ePerfApiGet=7, //!< Count of DBImpl::Get completions
ePerfApiWrite=8, //!< Count of DBImpl::Get completions
ePerfWriteSleep=9, //!< DBImpl::MakeRoomForWrite called sleep
ePerfWriteWaitImm=10, //!< DBImpl::MakeRoomForWrite called Wait on Imm compact
ePerfWriteWaitLevel0=11,//!< DBImpl::MakeRoomForWrite called Wait on Level0 compact
ePerfWriteNewMem=12, //!< DBImpl::MakeRoomForWrite created new memory log
ePerfWriteError=13, //!< DBImpl::MakeRoomForWrite saw bg_error_
ePerfWriteNoWait=14, //!< DBImpl::MakeRoomForWrite took no action
ePerfGetMem=15, //!< DBImpl::Get read from memory log
ePerfGetImm=16, //!< DBImpl::Get read from previous memory log
ePerfGetVersion=17, //!< DBImpl::Get read from Version object
// code ASSUMES the levels are in numerical order,
// i.e. based off of ePerfSearchLevel0
ePerfSearchLevel0=18, //!< Version::Get read searched one or more files here
ePerfSearchLevel1=19, //!< Version::Get read searched one or more files here
ePerfSearchLevel2=20, //!< Version::Get read searched one or more files here
ePerfSearchLevel3=21, //!< Version::Get read searched one or more files here
ePerfSearchLevel4=22, //!< Version::Get read searched one or more files here
ePerfSearchLevel5=23, //!< Version::Get read searched one or more files here
ePerfSearchLevel6=24, //!< Version::Get read searched one or more files here
ePerfTableCached=25, //!< TableCache::FindTable found table in cache
ePerfTableOpened=26, //!< TableCache::FindTable had to open table file
ePerfTableGet=27, //!< TableCache::Get used to retrieve a key
ePerfBGCloseUnmap=28, //!< PosixEnv::BGThreaed started Unmap/Close job
ePerfBGCompactImm=29, //!< PosixEnv::BGThreaed started compaction of Imm
ePerfBGNormal=30, //!< PosixEnv::BGThreaed started normal compaction job
ePerfBGCompactLevel0=31,//!< PosixEnv::BGThreaed started compaction of Level0
ePerfBlockFiltered=32, //!< Table::BlockReader search stopped due to filter
ePerfBlockFilterFalse=33,//!< Table::BlockReader gave a false positive for match
ePerfBlockCached=34, //!< Table::BlockReader found block in cache
ePerfBlockRead=35, //!< Table::BlockReader read block from disk
ePerfBlockFilterRead=36,//!< Table::ReadMeta filter loaded from file
ePerfBlockValidGet=37, //!< Table::InternalGet has valid iterator
ePerfDebug0=38, //!< Developer debug counters, moveable
ePerfDebug1=39, //!< Developer debug counters, moveable
ePerfDebug2=40, //!< Developer debug counters, moveable
ePerfDebug3=41, //!< Developer debug counters, moveable
ePerfDebug4=42, //!< Developer debug counters, moveable
ePerfReadBlockError=43, //!< crc or compression error in ReadBlock (format.cc)
ePerfIterNew=44, //!< Count of DBImpl::NewDBIterator calls
ePerfIterNext=45, //!< Count of DBIter::Next calls
ePerfIterPrev=46, //!< Count of DBIter::Prev calls
ePerfIterSeek=47, //!< Count of DBIter::Seek calls
ePerfIterSeekFirst=48, //!< Count of DBIter::SeekFirst calls
ePerfIterSeekLast=49, //!< Count of DBIter::SeekLast calls
ePerfIterDelete=50, //!< Count of DBIter::~DBIter
ePerfElevelDirect=51, //!< eleveldb's FindWaitingThread went direct to thread
ePerfElevelQueued=52, //!< eleveldb's FindWaitingThread queued work item
ePerfElevelDequeued=53, //!< eleveldb's worker took item from backlog queue
ePerfElevelRefCreate=54,//!< eleveldb RefObject constructed
ePerfElevelRefDelete=55,//!< eleveldb RefObject destructed
ePerfThrottleGauge=56, //!< current throttle value
ePerfThrottleCounter=57,//!< running throttle by seconds
ePerfThrottleMicros0=58,//!< level 0 micros spent compacting
ePerfThrottleKeys0=59, //!< level 0 keys processed
ePerfThrottleBacklog0=60,//!< backlog at time of posting (level0)
ePerfThrottleCompacts0=61,//!< number of level 0 compactions
ePerfThrottleMicros1=62,//!< level 1+ micros spent compacting
ePerfThrottleKeys1=63, //!< level 1+ keys processed
ePerfThrottleBacklog1=64,//!< backlog at time of posting (level1+)
ePerfThrottleCompacts1=65,//!< number of level 1+ compactions
ePerfBGWriteError=66, //!< error in write/close, see syslog
ePerfThrottleWait=67, //!< milliseconds of throttle wait
ePerfThreadError=68, //!< system error on thread related call, no LOG access
ePerfBGImmDirect=69, //!< count Imm compactions happened directly
ePerfBGImmQueued=70, //!< count Imm compactions placed on queue
ePerfBGImmDequeued=71, //!< count Imm compactions removed from queue
ePerfBGImmWeighted=72, //!< total microseconds item spent on queue
ePerfBGUnmapDirect=73, //!< count Unmap operations happened directly
ePerfBGUnmapQueued=74, //!< count Unmap operations placed on queue
ePerfBGUnmapDequeued=75,//!< count Unmap operations removed from queue
ePerfBGUnmapWeighted=76,//!< total microseconds item spent on queue
ePerfBGLevel0Direct=77, //!< count Level0 compactions happened directly
ePerfBGLevel0Queued=78, //!< count Level0 compactions placed on queue
ePerfBGLevel0Dequeued=79,//!< count Level0 compactions removed from queue
ePerfBGLevel0Weighted=80,//!< total microseconds item spent on queue
ePerfBGCompactDirect=81, //!< count generic compactions happened directly
ePerfBGCompactQueued=82, //!< count generic compactions placed on queue
ePerfBGCompactDequeued=83,//!< count generic compactions removed from queue
ePerfBGCompactWeighted=84,//!< total microseconds item spent on queue
ePerfFileCacheInsert=85, //!< total bytes inserted into file cache
ePerfFileCacheRemove=86, //!< total bytes removed from file cache
ePerfBlockCacheInsert=87, //!< total bytes inserted into block cache
ePerfBlockCacheRemove=88, //!< total bytes removed from block cache
ePerfApiDelete=89, //!< Count of DB::Delete
// must follow last index name to represent size of array
// (ASSUMES previous enum is highest value)
ePerfCountEnumSize, //!< size of the array described by the enum values
ePerfVersion=1, //!< structure versioning
ePerfKey=41207 //!< random number as shared memory identifier
};
//
// Do NOT use virtual functions. This structure will be aligned at different
// locations in multiple processes. Things can get messy with virtuals.
struct PerformanceCounters
{
public:
static int m_LastError;
protected:
uint32_t m_Version; //!< object revision identification
uint32_t m_CounterSize; //!< number of objects in m_Counter
volatile uint64_t m_Counter[ePerfCountEnumSize];
static const char * m_PerfCounterNames[];
static int m_PerfSharedId;
static volatile uint64_t m_BogusCounter; //!< for out of range GetPtr calls
public:
// only called for local object, not for shared memory
PerformanceCounters();
//!< does executable's idea of version match shared object?
bool VersionTest()
{return(ePerfCountEnumSize<=m_CounterSize && ePerfVersion==m_Version);};
//!< mostly for perf_count_test.cc
void SetVersion(uint32_t Version, uint32_t CounterSize)
{m_Version=Version; m_CounterSize=CounterSize;};
static PerformanceCounters * Init(bool IsReadOnly);
static int Close(PerformanceCounters * Counts);
uint64_t Inc(unsigned Index);
uint64_t Dec(unsigned Index);
// add value to the counter
uint64_t Add(unsigned Index, uint64_t Amount);
// return value of a counter
uint64_t Value(unsigned Index) const;
// set a value
void Set(unsigned Index, uint64_t);
volatile const uint64_t * GetPtr(unsigned Index) const;
static const char * GetNamePtr(unsigned Index);
int LookupCounter(const char * Name);
void Dump();
}; // struct PerformanceCounters
extern PerformanceCounters * gPerfCounters;
} // namespace leveldb
#endif // STORAGE_LEVELDB_INCLUDE_PERF_COUNT_H_