internal_stats.h 10.1 KB
Newer Older
I
Igor Canadi 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//  Copyright (c) 2013, Facebook, Inc.  All rights reserved.
//  This source code is licensed under the BSD-style license found in the
//  LICENSE file in the root directory of this source tree. An additional grant
//  of patent rights can be found in the PATENTS file in the same directory.
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
//

#pragma once
#include "db/version_set.h"

#include <vector>
#include <string>

17 18
class ColumnFamilyData;

I
Igor Canadi 已提交
19
namespace rocksdb {
20 21

class MemTableList;
22
class DBImpl;
23

24 25
enum DBPropertyType : uint32_t {
  kUnknown,
26 27
  kNumFilesAtLevel,  // Number of files at a specific level
  kLevelStats,       // Return number of files and total sizes of each level
28 29 30
  kCFStats,          // Return general statitistics of CF
  kDBStats,          // Return general statitistics of DB
  kStats,            // Return general statitistics of both DB and CF
31
  kSsTables,         // Return a human readable string of current SST files
32
  kStartIntTypes,    // ---- Dummy value to indicate the start of integer values
33 34 35 36 37
  kNumImmutableMemTable,   // Return number of immutable mem tables
  kMemtableFlushPending,   // Return 1 if mem table flushing is pending,
                           // otherwise 0.
  kCompactionPending,      // Return 1 if a compaction is pending. Otherwise 0.
  kBackgroundErrors,       // Return accumulated background errors encountered.
38
  kCurSizeActiveMemTable,  // Return current size of the active memtable
39 40 41 42
  kNumEntriesInMutableMemtable,    // Return number of entries in the mutable
                                   // memtable.
  kNumEntriesInImmutableMemtable,  // Return sum of number of entries in all
                                   // the immutable mem tables.
S
sdong 已提交
43
  kEstimatedNumKeys,  // Estimated total number of keys in the database.
44
  kEstimatedUsageByTableReaders,  // Estimated memory by table readers.
45 46
  kIsFileDeletionEnabled,         // Equals disable_delete_obsolete_files_,
                                  // 0 means file deletions enabled
47 48
};

49 50 51
extern DBPropertyType GetPropertyType(const Slice& property,
                                      bool* is_int_property,
                                      bool* need_out_of_mutex);
52

I
Igor Canadi 已提交
53 54
class InternalStats {
 public:
55
  enum InternalCFStatsType {
I
Igor Canadi 已提交
56 57 58 59
    LEVEL0_SLOWDOWN,
    MEMTABLE_COMPACTION,
    LEVEL0_NUM_FILES,
    WRITE_STALLS_ENUM_MAX,
60 61
    BYTES_FLUSHED,
    INTERNAL_CF_STATS_ENUM_MAX,
I
Igor Canadi 已提交
62 63
  };

64 65 66 67 68 69 70 71 72 73
  enum InternalDBStatsType {
    WAL_FILE_BYTES,
    WAL_FILE_SYNCED,
    BYTES_WRITTEN,
    WRITE_DONE_BY_OTHER,
    WRITE_DONE_BY_SELF,
    WRITE_WITH_WAL,
    INTERNAL_DB_STATS_ENUM_MAX,
  };

74
  InternalStats(int num_levels, Env* env, ColumnFamilyData* cfd)
75 76 77 78 79 80 81 82
      : db_stats_(INTERNAL_DB_STATS_ENUM_MAX),
        cf_stats_value_(INTERNAL_CF_STATS_ENUM_MAX),
        cf_stats_count_(INTERNAL_CF_STATS_ENUM_MAX),
        comp_stats_(num_levels),
        stall_leveln_slowdown_hard_(num_levels),
        stall_leveln_slowdown_count_hard_(num_levels),
        stall_leveln_slowdown_soft_(num_levels),
        stall_leveln_slowdown_count_soft_(num_levels),
83
        bg_error_count_(0),
I
Igor Canadi 已提交
84 85
        number_levels_(num_levels),
        env_(env),
86
        cfd_(cfd),
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
        started_at_(env->NowMicros()) {
    for (int i = 0; i< INTERNAL_DB_STATS_ENUM_MAX; ++i) {
      db_stats_[i] = 0;
    }
    for (int i = 0; i< INTERNAL_CF_STATS_ENUM_MAX; ++i) {
      cf_stats_value_[i] = 0;
      cf_stats_count_[i] = 0;
    }
    for (int i = 0; i < num_levels; ++i) {
      stall_leveln_slowdown_hard_[i] = 0;
      stall_leveln_slowdown_count_hard_[i] = 0;
      stall_leveln_slowdown_soft_[i] = 0;
      stall_leveln_slowdown_count_soft_[i] = 0;
    }
  }
I
Igor Canadi 已提交
102

103
  // Per level compaction stats.  comp_stats_[level] stores the stats for
I
Igor Canadi 已提交
104 105 106 107 108
  // compactions that produced data for the specified "level".
  struct CompactionStats {
    uint64_t micros;

    // Bytes read from level N during compaction between levels N and N+1
109
    uint64_t bytes_readn;
I
Igor Canadi 已提交
110 111

    // Bytes read from level N+1 during compaction between levels N and N+1
112
    uint64_t bytes_readnp1;
I
Igor Canadi 已提交
113 114

    // Total bytes written during compaction between levels N and N+1
115
    uint64_t bytes_written;
I
Igor Canadi 已提交
116 117 118 119 120 121 122 123 124 125

    // Files read from level N during compaction between levels N and N+1
    int files_in_leveln;

    // Files read from level N+1 during compaction between levels N and N+1
    int files_in_levelnp1;

    // Files written during compaction between levels N and N+1
    int files_out_levelnp1;

126 127 128 129 130 131 132
    // Total incoming entries during compaction between levels N and N+1
    int num_input_records;

    // Accumulated diff number of entries
    // (num input entries - num output entires) for compaction  levels N and N+1
    int num_dropped_records;

I
Igor Canadi 已提交
133 134 135
    // Number of compactions done
    int count;

L
Lei Jin 已提交
136
    explicit CompactionStats(int count = 0)
I
Igor Canadi 已提交
137 138 139 140 141 142 143
        : micros(0),
          bytes_readn(0),
          bytes_readnp1(0),
          bytes_written(0),
          files_in_leveln(0),
          files_in_levelnp1(0),
          files_out_levelnp1(0),
144 145
          num_input_records(0),
          num_dropped_records(0),
L
Lei Jin 已提交
146
          count(count) {}
I
Igor Canadi 已提交
147

148 149 150 151 152 153 154 155
    explicit CompactionStats(const CompactionStats& c)
        : micros(c.micros),
          bytes_readn(c.bytes_readn),
          bytes_readnp1(c.bytes_readnp1),
          bytes_written(c.bytes_written),
          files_in_leveln(c.files_in_leveln),
          files_in_levelnp1(c.files_in_levelnp1),
          files_out_levelnp1(c.files_out_levelnp1),
156 157
          num_input_records(c.num_input_records),
          num_dropped_records(c.num_dropped_records),
158 159
          count(c.count) {}

I
Igor Canadi 已提交
160 161 162 163 164 165 166 167
    void Add(const CompactionStats& c) {
      this->micros += c.micros;
      this->bytes_readn += c.bytes_readn;
      this->bytes_readnp1 += c.bytes_readnp1;
      this->bytes_written += c.bytes_written;
      this->files_in_leveln += c.files_in_leveln;
      this->files_in_levelnp1 += c.files_in_levelnp1;
      this->files_out_levelnp1 += c.files_out_levelnp1;
168 169
      this->num_input_records += c.num_input_records;
      this->num_dropped_records += c.num_dropped_records;
L
Lei Jin 已提交
170
      this->count += c.count;
I
Igor Canadi 已提交
171
    }
172 173 174 175 176 177 178 179 180

    void Subtract(const CompactionStats& c) {
      this->micros -= c.micros;
      this->bytes_readn -= c.bytes_readn;
      this->bytes_readnp1 -= c.bytes_readnp1;
      this->bytes_written -= c.bytes_written;
      this->files_in_leveln -= c.files_in_leveln;
      this->files_in_levelnp1 -= c.files_in_levelnp1;
      this->files_out_levelnp1 -= c.files_out_levelnp1;
181 182
      this->num_input_records -= c.num_input_records;
      this->num_dropped_records -= c.num_dropped_records;
183 184
      this->count -= c.count;
    }
I
Igor Canadi 已提交
185 186 187
  };

  void AddCompactionStats(int level, const CompactionStats& stats) {
188
    comp_stats_[level].Add(stats);
I
Igor Canadi 已提交
189 190
  }

191 192 193 194 195 196 197 198 199 200 201 202 203
  void RecordLevelNSlowdown(int level, uint64_t micros, bool soft) {
    if (soft) {
      stall_leveln_slowdown_soft_[level] += micros;
      ++stall_leveln_slowdown_count_soft_[level];
    } else {
      stall_leveln_slowdown_hard_[level] += micros;
      ++stall_leveln_slowdown_count_hard_[level];
    }
  }

  void AddCFStats(InternalCFStatsType type, uint64_t value) {
    cf_stats_value_[type] += value;
    ++cf_stats_count_[type];
I
Igor Canadi 已提交
204 205
  }

206 207
  void AddDBStats(InternalDBStatsType type, uint64_t value) {
    db_stats_[type] += value;
I
Igor Canadi 已提交
208 209
  }

210 211 212 213
  uint64_t GetBackgroundErrorCount() const { return bg_error_count_; }

  uint64_t BumpAndGetBackgroundErrorCount() { return ++bg_error_count_; }

214 215
  bool GetStringProperty(DBPropertyType property_type, const Slice& property,
                         std::string* value);
I
Igor Canadi 已提交
216

217 218
  bool GetIntProperty(DBPropertyType property_type, uint64_t* value,
                      DBImpl* db) const;
219 220 221

  bool GetIntPropertyOutOfMutex(DBPropertyType property_type, Version* version,
                                uint64_t* value) const;
222

I
Igor Canadi 已提交
223
 private:
224
  void DumpDBStats(std::string* value);
225
  void DumpCFStats(std::string* value);
226 227 228 229 230 231 232 233 234 235 236 237 238

  // Per-DB stats
  std::vector<uint64_t> db_stats_;
  // Per-ColumnFamily stats
  std::vector<uint64_t> cf_stats_value_;
  std::vector<uint64_t> cf_stats_count_;
  // Per-ColumnFamily/level compaction stats
  std::vector<CompactionStats> comp_stats_;
  // These count the number of microseconds for which MakeRoomForWrite stalls.
  std::vector<uint64_t> stall_leveln_slowdown_hard_;
  std::vector<uint64_t> stall_leveln_slowdown_count_hard_;
  std::vector<uint64_t> stall_leveln_slowdown_soft_;
  std::vector<uint64_t> stall_leveln_slowdown_count_soft_;
I
Igor Canadi 已提交
239 240

  // Used to compute per-interval statistics
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
  struct CFStatsSnapshot {
    // ColumnFamily-level stats
    CompactionStats comp_stats;
    uint64_t ingest_bytes;            // Bytes written to L0
    uint64_t stall_us;                // Stall time in micro-seconds
    uint64_t stall_count;             // Stall count

    CFStatsSnapshot()
        : comp_stats(0),
          ingest_bytes(0),
          stall_us(0),
          stall_count(0) {}
  } cf_stats_snapshot_;

  struct DBStatsSnapshot {
    // DB-level stats
    uint64_t ingest_bytes;            // Bytes written by user
    uint64_t wal_bytes;               // Bytes written to WAL
    uint64_t wal_synced;              // Number of times WAL is synced
    uint64_t write_with_wal;          // Number of writes that request WAL
I
Igor Canadi 已提交
261 262
    // These count the number of writes processed by the calling thread or
    // another thread.
263 264 265 266 267 268 269 270 271 272 273 274 275
    uint64_t write_other;
    uint64_t write_self;
    double seconds_up;

    DBStatsSnapshot()
        : ingest_bytes(0),
          wal_bytes(0),
          wal_synced(0),
          write_with_wal(0),
          write_other(0),
          write_self(0),
          seconds_up(0) {}
  } db_stats_snapshot_;
I
Igor Canadi 已提交
276

277 278 279 280 281 282 283
  // Total number of background errors encountered. Every time a flush task
  // or compaction task fails, this counter is incremented. The failure can
  // be caused by any possible reason, including file system errors, out of
  // resources, or input file corruption. Failing when retrying the same flush
  // or compaction will cause the counter to increase too.
  uint64_t bg_error_count_;

284
  const int number_levels_;
I
Igor Canadi 已提交
285
  Env* env_;
286
  ColumnFamilyData* cfd_;
287
  const uint64_t started_at_;
I
Igor Canadi 已提交
288 289 290
};

}  // namespace rocksdb