偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

教你玩轉(zhuǎn)MyRocks/RocksDB—STATISTICS與后臺(tái)線程篇

數(shù)據(jù)庫 MySQL 開發(fā)工具
本文將介紹SHOW ENGINE ROCKSDB STATUS中關(guān)于STATISTICS統(tǒng)計(jì)值與后臺(tái)線程的實(shí)現(xiàn)原理。在了解實(shí)現(xiàn)原理的基礎(chǔ)上,便可以較容易地通過擴(kuò)展功能使它更好地為我們服務(wù)。

[[219775]]

0. Intro

在facebook的MySQL版本(以下稱為MyRocks)中,RocksDB是可選的存儲(chǔ)引擎。相比于InnoDB引擎,RocksDB的一個(gè)重要的優(yōu)勢是它使用更少的磁盤空間。在生產(chǎn)系統(tǒng)中,特別是用戶數(shù)在億級(jí)以上的互聯(lián)網(wǎng)應(yīng)用,磁盤空間是其中比較大的成本之一,而能夠使用更少的磁盤空間的RocksDB無疑是具有吸引力的。然而在生產(chǎn)系統(tǒng)中使用新的存儲(chǔ)引擎自然有它的潛在風(fēng)險(xiǎn),除了通過外部的各種benchmark工具測試得到各種性能數(shù)據(jù),全方位的內(nèi)部指標(biāo)可以幫助我們真正了解數(shù)據(jù)庫內(nèi)部正在發(fā)生的事情,對(duì)于性能調(diào)優(yōu)和開發(fā)都具有指導(dǎo)意義。而MyRocks通過SHOW ENGINE ROCKSDB STATUS和多個(gè)INFORMATION_SCHEMA表等方式提供了較為全面的內(nèi)部指標(biāo)。

本文將介紹SHOW ENGINE ROCKSDB STATUS中關(guān)于STATISTICS統(tǒng)計(jì)值與后臺(tái)線程的實(shí)現(xiàn)原理。在了解實(shí)現(xiàn)原理的基礎(chǔ)上,便可以較容易地通過擴(kuò)展功能使它更好地為我們服務(wù)。

調(diào)用SHOW ENGINE ROCKSDB STATUS指令會(huì)返回多行數(shù)據(jù),其中包括:

  • STATISTICS:RocksDB引擎所有線程的所有操作的各類count/time的累加,比如rocksdb.block.cache.hit和rocksdb.db.write.micros。
  • BG_THREADS: 后臺(tái)線程的狀態(tài)。
  • DBSTATS: 數(shù)據(jù)庫操作的統(tǒng)計(jì)。
  • CF_COMPACTION: 各個(gè)Column family進(jìn)行compaction的相關(guān)指標(biāo)統(tǒng)計(jì)。
  • MEMORY_STATS: 內(nèi)存使用情況。

調(diào)用SHOW ENGINE ROCKSDB STATUS會(huì)返回若干行數(shù)據(jù),然而這些數(shù)據(jù)并非事先存儲(chǔ)于某個(gè)表格中,而是通過調(diào)用位于rocksdb/ha_rocksdb.cc文件中的rocksdb_show_status函數(shù)將內(nèi)存中對(duì)應(yīng)的數(shù)值進(jìn)行規(guī)整返回給用戶。

1. STATISTICS

根據(jù)RocksDB官方相關(guān)文檔介紹STATISTICS,開啟STATISTICS會(huì)增加增加5%-10%額外開銷。

STATISTICS統(tǒng)計(jì)值記錄著RocksDB引擎所有線程的所有操作的各類count/time的累加。RocksDB引擎在它的各類操作如Put/Get/Delete中的代碼都設(shè)立了很多埋點(diǎn)。

以函數(shù)GetEntryFromCache為例,它的作用是返回可用的block cache。特別地,可以看到statistics是GetEntryFromCache和block_cache->Lookup的一個(gè)參數(shù)。沒錯(cuò),就是靠著statistics這個(gè)參數(shù)它到處收集數(shù)據(jù)。

當(dāng)有可用的block cache時(shí),調(diào)用了三次RecordTick為其中三個(gè)統(tǒng)計(jì)值增加計(jì)數(shù);沒有可用的block cache,同樣也為BLOCK_CACHE_MISS和block_cache_miss_ticker增加計(jì)數(shù)。

 

  1. Cache::Handle* GetEntryFromCache(Cache* block_cache, const Slice& key 
  2.                                  Tickers block_cache_miss_ticker,  
  3.                                  Tickers block_cache_hit_ticker,  
  4.                                  Statisticsstatistics) {  
  5.   auto cache_handle = block_cache->Lookup(keystatistics);  
  6.   if (cache_handle != nullptr) {  
  7.     PERF_COUNTER_ADD(block_cache_hit_count, 1);  
  8.     // overall cache hit  
  9.     RecordTick(statistics, BLOCK_CACHE_HIT);  
  10.     // total bytes read from cache  
  11.     RecordTick(statistics, BLOCK_CACHE_BYTES_READ,  
  12.                block_cache->GetUsage(cache_handle));  
  13.     // block-type specific cache hit  
  14.     RecordTick(statistics, block_cache_hit_ticker);  
  15.   } else {  
  16.     // overall cache miss  
  17.     RecordTick(statistics, BLOCK_CACHE_MISS);  
  18.     // block-type specific cache miss  
  19.     RecordTick(statistics, block_cache_miss_ticker);  
  20.   }  
  21.   return cache_handle;  
  22.  

1.1 RocksDB的STATISTICS接口

使用STATISTICS的方法也很簡單。

它的頭文件位于: 

  1. include/rocksdb/statistics.h  
  2. monitoring/statistics.h  

使用方法: 

  1. Options options;  
  2. options.statistics = rocksdb::CreateDBStatistics();  

可選統(tǒng)計(jì)級(jí)別:

  • kExceptDetailedTimers: 除去mutex等待和壓縮的計(jì)時(shí)
  • kExceptTimeForMutex: 除去mutex等待的計(jì)時(shí)
  • kAll: 所有

數(shù)據(jù)統(tǒng)計(jì)類型分成兩種:

  • ticker:計(jì)數(shù),類型是64位無符號(hào)整型。用于度量counters (e.g. “rocksdb.block.cache.hit”), cumulative bytes (e.g. “rocksdb.bytes.written”) 或者 time (e.g. “rocksdb.l0.slowdown.micros”)。
  • histogram:統(tǒng)計(jì)數(shù)據(jù)的統(tǒng)計(jì)分布,包括***值、最小值、平均值、中位數(shù)、標(biāo)準(zhǔn)差。

統(tǒng)計(jì)函數(shù)的接口:

  • MeasureTime:函數(shù)名有歧義。實(shí)際上是把value記錄到histogram中。
  • RecordTick:累加ticker。

獲取結(jié)果的接口:

  • Statistics::getTickerCount:指定ticker type獲得count。
  • Statistics::histogramData:指定Histograms type,返回一個(gè)HistogramData結(jié)構(gòu)體,成員是統(tǒng)計(jì)值,包括***值、最小值、平均值、中位數(shù)、標(biāo)準(zhǔn)差。
  • Statistics::getHistogramString:指定Histograms type,返回直方圖可讀的字符串。
  • Statistics::ToString():返回可讀的字符串,包括所有的ticker和histogram。

1.2 RocksDB的STATISTICS實(shí)現(xiàn)

RocksDB實(shí)現(xiàn)了StatisticsImpl類,繼承了Statistics的接口。

  • 主要接口:
  • getTickerCount
  • histogramData
  • getHistogramString
  • getAndResetTickerCount
  • recordTick
  • measureTime
  • ToString

成員變量:

  • TickerInfo tickers_[INTERNAL_TICKER_ENUM_MAX];
  • HistogramInfo histograms_[INTERNAL_HISTOGRAM_ENUM_MAX];

這里的TickerInfo和HistogramInfo類型的數(shù)據(jù)結(jié)構(gòu)是相似的:一個(gè)線程局部的counter或者time;加上一個(gè)非線程局部的統(tǒng)計(jì)值用來累加counter或者time。

TickerInfo類型包含兩個(gè)參數(shù):

ThreadLocalPtr類型(真實(shí)類型ThreadTickerInfo)的thread_value,包含:

  • 整型類型的value
  • 指向merged_sum的指針
  • 整型類型的merged_sum
  • HistogreamInfo類型包含兩個(gè)參數(shù):

ThreadLocalPtr類型(真實(shí)類型ThreadHistogramInfo)的thread_value,包含:

  • HistogramImpl類型的value
  • 指向merged_hist的指針
  • 指向merge_lock的指針
  • HistogramImpl類型的merged_hist
  • Mutex類型的merge_lock

事實(shí)上,STATISTICS相關(guān)實(shí)現(xiàn)是比較巧妙的,也是使用STATISTICS僅增加5%-10%的關(guān)鍵。為了避免線程間共享數(shù)據(jù)導(dǎo)致CPU的cache頻繁失效,merged_sum和merged_hist初始化時(shí)都是空的,而且當(dāng)且僅當(dāng)線程退出時(shí),才調(diào)用mergeThreadValue函數(shù)將TickerInfo和HistogreamInfo中的線程局部變量累加到merged_sum和merged_hist。

1.3 MyRocks的使用

MyRocks使用了RocksDB提供的接口進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。通過聲明了變量rocksdb_stats,并且隨著RocksDB引擎啟動(dòng)時(shí)通過rocksdb_init_func函數(shù)進(jìn)行初始化。 

  1. rocksdb_stats = rocksdb::CreateDBStatistics();  
  2. rocksdb_db_options->statistics = rocksdb_stats;  

除了使用所有RocksDB引擎層的統(tǒng)計(jì),MyRocks還通過定義了 

  1. commit_latency_stats = new rocksdb::HistogramImpl(); 

在rocksdb_commit_by_xid和rocksdb_commit兩個(gè)函數(shù)中通過計(jì)時(shí)的方式,統(tǒng)計(jì)了每一次commit所花費(fèi)的時(shí)間。 

  1. rocksdb::StopWatchNano timer(rocksdb::Env::Default(), true);  
  2. ...  
  3. commit_latency_stats->Add(timer.ElapsedNanos() / 1000);  

在rocksdb_show_status函數(shù)中,輸出Statistics統(tǒng)計(jì)的過程如下:

如果定義rocksdb_stats,則調(diào)用rocksdb_stats->ToString()將統(tǒng)計(jì)值轉(zhuǎn)化為可讀的字符串;

commit_latency_stats是直方圖的類型,輸出對(duì)應(yīng)的50%, 95%, 99%, 100%四個(gè)位點(diǎn)的對(duì)應(yīng)的值。

假如定義了is-write-stopped或者actual-delayed-write-rate等Property變量,同樣會(huì)將它們輸出。

2 后臺(tái)線程

通過調(diào)用SHOW ENGINE ROCKSDB STATUS可以得到與BG_THREADS相關(guān)結(jié)果,它的輸出結(jié)果類似于: 

  1. Type: BG_THREADS  
  2. Name: 140173379593984  
  3. Status:  
  4. thread_type: Low Pri##  
  5. cf_name: default  
  6. operation_type: Compaction  
  7. operation_stage: CompactionJob::ProcessKeyValueCompaction  
  8. elapsed_time_ms: 6172.244 ms  
  9. BaseInputLevel: 0  
  10. BytesRead: 992806363  
  11. BytesWritten: 992071408  
  12. IsDeletion: 0  
  13. IsManual: 0  
  14. IsTrivialMove: 0  
  15. JobID: 1936  
  16. OutputLevel: 5  
  17. TotalInputBytes: 1586832446  
  18. state_type:  

可以看到較多的信息量:這個(gè)線程正在進(jìn)行Compaction,處于CompactionJob::ProcessKeyValueCompaction階段,已經(jīng)耗時(shí)6172.244 ms,讀取的字節(jié)數(shù)為992806363,寫出的字節(jié)數(shù)為992071408。然而并不包括可能感興趣的正在進(jìn)行Compaction的源文件和目標(biāo)文件等信息。正如文章開頭提到的,了解實(shí)現(xiàn)原理能夠使我們更好地進(jìn)行擴(kuò)展。

2.1 thread status的接口與實(shí)現(xiàn)

MyRocks中的SHOW ENGINE ROCKSDB STATUS指令展示BG_THREAD的機(jī)制使用了RocksDB中關(guān)于thread status的接口。

它的頭文件位于: 

  1. include/rocksdb/env.h  
  2. include/rocksdb/thread_status.h  
  3. util/thread_operation.h  
  4. monitoring/thread_status_updater.h  
  5. monitoring/thread_status_util.h  

關(guān)鍵類:

  • ThreadStatusUpdater:存儲(chǔ)了各自后臺(tái)線程的狀態(tài)和所有后臺(tái)線程狀態(tài)的指針。
  • ThreadStatusUtil:該類只有靜態(tài)變量和靜態(tài)方法,推薦通過該類的方法去更新ThreadStatusUpdater中的狀態(tài)。

使用方法:

  • 將該線程的統(tǒng)計(jì)加入ThreadStatusUpdater:調(diào)用ThreadStatusUtil::RegisterThread
  • 將該線程的統(tǒng)計(jì)從ThreadStatusUpdater刪除:調(diào)用ThreadStatusUtil::UnregisterThread
  • 其他修改thread status的函數(shù):見monitoring/thread_status_util.h

通過調(diào)用env的GetThreadList()函數(shù)可以獲得當(dāng)前后臺(tái)線程的狀態(tài),狀態(tài)的狀態(tài)值存放于一個(gè)vector中。將其中的內(nèi)容展現(xiàn)出來,類似于下圖:

從代碼中可以看到,實(shí)現(xiàn)thread status的目的展示flush和compaction的運(yùn)行狀態(tài)。當(dāng)然,我們也可以將用戶線程的狀態(tài)存儲(chǔ)到thread status,通過調(diào)用SHOW ENGINE ROCKSDB STATUS指令展示。

特別地,可以看到compaction特有的狀態(tài)值有: 

  1. enum CompactionPropertyType : int {  
  2.     COMPACTION_JOB_ID = 0,  
  3.     COMPACTION_INPUT_OUTPUT_LEVEL,  
  4.     COMPACTION_PROP_FLAGS,  
  5.     COMPACTION_TOTAL_INPUT_BYTES,  
  6.     COMPACTION_BYTES_READ,  
  7.     COMPACTION_BYTES_WRITTEN,  
  8.     NUM_COMPACTION_PROPERTIES  
  9.   };  

flush特有的狀態(tài)值有: 

  1. enum FlushPropertyType : int {  
  2.    FLUSH_JOB_ID = 0,  
  3.    FLUSH_BYTES_MEMTABLES,  
  4.    FLUSH_BYTES_WRITTEN,  
  5.    NUM_FLUSH_PROPERTIES  
  6.  };  

2.2 MyRocks/RocksDB的使用

在RocksDB的線程池實(shí)現(xiàn)中,每一個(gè)啟動(dòng)的后臺(tái)線程都會(huì)通過調(diào)用ThreadStatusUtil::RegisterThread加入被觀測的后臺(tái)線程的集合中。 

  1. ThreadPoolImpl::Impl::StartBGThreads-->BGThreadWrapper-->ThreadStatusUtil::RegisterThread 

在rocksdb_show_status函數(shù)中,輸出BG_THREAD的過程如下:

  • 通過調(diào)用GetThreadList(&thread_list)獲得所有后臺(tái)線程的ThreadStatus的集合。
  • 通過遍歷ThreadStatus的集合將每一個(gè)后臺(tái)線程的狀態(tài)依次輸出。

3. 小結(jié) 

本文章介紹了SHOW ENGINE ROCKSDB STATUS指令中關(guān)于STATISTICS與BG_THREAD的相關(guān)內(nèi)容。 

 

責(zé)任編輯:龐桂玉 來源: 騰訊云數(shù)據(jù)庫內(nèi)核專欄
相關(guān)推薦

2011-08-10 15:58:12

WPS符號(hào)欄

2018-05-12 16:26:17

互聯(lián)網(wǎng)VPC子網(wǎng)

2024-04-09 12:08:51

Next組件Next.js

2021-05-18 14:42:55

PythonMySQL

2013-03-13 09:56:10

2013-09-10 10:20:12

數(shù)據(jù)大數(shù)據(jù)大數(shù)據(jù)應(yīng)用

2015-03-23 12:33:28

2014-06-13 16:52:11

2012-04-17 14:33:00

牛排New iPad

2011-01-28 15:47:15

webOS 2.1

2021-12-10 08:39:50

SQLPLUS Oracle 數(shù)據(jù)庫

2011-06-09 11:39:04

噴墨打印機(jī)技巧

2014-08-19 09:10:45

IT運(yùn)維

2016-11-17 16:58:01

華為 手機(jī)

2015-02-11 11:27:13

網(wǎng)絡(luò)釣魚網(wǎng)絡(luò)犯罪賽門鐵克

2017-10-11 15:17:42

sklearn機(jī)器學(xué)習(xí)pandas

2017-07-21 11:45:12

Windows 10Windows聚焦功能

2015-10-15 17:05:21

移站通

2022-09-29 00:30:03

元宇宙科技營銷

2015-07-22 16:44:51

HTML5優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)