教你玩转MyRocks/RocksDB—STATISTICS与后台线程篇数据库

来源:互联网 / 作者:SKY / 2018-02-07 20:32 / 点击:
本文将介绍SHOW ENGINE ROCKSDB STATUS中关于STATISTICS统计值与后台线程的实现原理。在了解实现原理的基础上,便可以较容易地通过扩展功能使它更好地为我们服务

教你玩转MyRocks/RocksDB—STATISTICS与后台线程篇

0. Intro

在facebook的MySQL版本(以下称为MyRocks)中,RocksDB是可选的存储引擎。相比于InnoDB引擎,RocksDB的一个重要的优势是它使用更少的磁盘空间。在生产系统中,特别是用户数在亿级以上的互联网应用,磁盘空间是其中比较大的成本之一,而能够使用更少的磁盘空间的RocksDB无疑是具有吸引力的。然而在生产系统中使用新的存储引擎自然有它的潜在风险,除了通过外部的各种benchmark工具测试得到各种性能数据,全方位的内部指标可以帮助我们真正了解数据库内部正在发生的事情,对于性能调优和开发都具有指导意义。而MyRocks通过SHOW ENGINE ROCKSDB STATUS和多个INFORMATION_SCHEMA表等方式提供了较为全面的内部指标。

本文将介绍SHOW ENGINE ROCKSDB STATUS中关于STATISTICS统计值与后台线程的实现原理。在了解实现原理的基础上,便可以较容易地通过扩展功能使它更好地为我们服务。

调用SHOW ENGINE ROCKSDB STATUS指令会返回多行数据,其中包括:

STATISTICS:RocksDB引擎所有线程的所有操作的各类count/time的累加,比如rocksdb.block.cache.hit和rocksdb.db.write.micros。

BG_THREADS: 后台线程的状态。

DBSTATS: 数据库操作的统计。

CF_COMPACTION: 各个Column family进行compaction的相关指标统计。

MEMORY_STATS: 内存使用情况。

调用SHOW ENGINE ROCKSDB STATUS会返回若干行数据,然而这些数据并非事先存储于某个表格中,而是通过调用位于rocksdb/ha_rocksdb.cc文件中的rocksdb_show_status函数将内存中对应的数值进行规整返回给用户。

1. STATISTICS

根据RocksDB官方相关文档介绍STATISTICS,开启STATISTICS会增加增加5%-10%额外开销。

STATISTICS统计值记录着RocksDB引擎所有线程的所有操作的各类count/time的累加。RocksDB引擎在它的各类操作如Put/Get/Delete中的代码都设立了很多埋点。

以函数GetEntryFromCache为例,它的作用是返回可用的block cache。特别地,可以看到statistics是GetEntryFromCache和block_cache->Lookup的一个参数。没错,就是靠着statistics这个参数它到处收集数据。

当有可用的block cache时,调用了三次RecordTick为其中三个统计值增加计数;没有可用的block cache,同样也为BLOCK_CACHE_MISS和block_cache_miss_ticker增加计数。

Cache::Handle* GetEntryFromCache(Cache* block_cache, const Slice& key 

                                 Tickers block_cache_miss_ticker,  

                                 Tickers block_cache_hit_ticker,  

                                 Statisticsstatistics) {  

  auto cache_handle = block_cache->Lookup(keystatistics);  

  if (cache_handle != nullptr) {  

    PERF_COUNTER_ADD(block_cache_hit_count, 1);  

    // overall cache hit  

    RecordTick(statistics, BLOCK_CACHE_HIT);  

    // total bytes read from cache  

    RecordTick(statistics, BLOCK_CACHE_BYTES_READ,  

               block_cache->GetUsage(cache_handle));  

    // block-type specific cache hit  

    RecordTick(statistics, block_cache_hit_ticker);  

  } else {  

    // overall cache miss  

    RecordTick(statistics, BLOCK_CACHE_MISS);  

    // block-type specific cache miss  

    RecordTick(statistics, block_cache_miss_ticker);  

  }  

  return cache_handle;  

 

1.1 RocksDB的STATISTICS接口

使用STATISTICS的方法也很简单。

它的头文件位于:

include/rocksdb/statistics.h  

monitoring/statistics.h  

使用方法:

Options options;  

options.statistics = rocksdb::CreateDBStatistics();  

可选统计级别:

kExceptDetailedTimers: 除去mutex等待和压缩的计时

kExceptTimeForMutex: 除去mutex等待的计时

kAll: 所有

数据统计类型分成两种:

阅读延展

1
3