1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use crate::perf_context_metrics::{
APPLY_PERF_CONTEXT_TIME_HISTOGRAM_STATIC, STORE_PERF_CONTEXT_TIME_HISTOGRAM_STATIC,
};
use crate::raw_util;
use engine_traits::{PerfContextKind, PerfLevel};
use rocksdb::set_perf_level;
use rocksdb::PerfContext as RawPerfContext;
#[macro_export]
macro_rules! report_perf_context {
($ctx: expr, $metric: ident) => {
if $ctx.perf_level != PerfLevel::Disable {
let perf_context = RawPerfContext::get();
let pre_and_post_process = perf_context.write_pre_and_post_process_time();
let write_thread_wait = perf_context.write_thread_wait_nanos();
observe_perf_context_type!($ctx, perf_context, $metric, write_wal_time);
observe_perf_context_type!($ctx, perf_context, $metric, write_memtable_time);
observe_perf_context_type!($ctx, perf_context, $metric, db_mutex_lock_nanos);
observe_perf_context_type!($ctx, $metric, pre_and_post_process);
observe_perf_context_type!($ctx, $metric, write_thread_wait);
observe_perf_context_type!(
$ctx,
perf_context,
$metric,
write_scheduling_flushes_compactions_time
);
observe_perf_context_type!($ctx, perf_context, $metric, db_condition_wait_nanos);
observe_perf_context_type!($ctx, perf_context, $metric, write_delay_time);
}
};
}
#[macro_export]
macro_rules! observe_perf_context_type {
($s:expr, $metric: expr, $v:ident) => {
$metric.$v.observe((($v) - $s.$v) as f64 / 1_000_000_000.0);
$s.$v = $v;
};
($s:expr, $context: expr, $metric: expr, $v:ident) => {
let $v = $context.$v();
$metric.$v.observe((($v) - $s.$v) as f64 / 1_000_000_000.0);
$s.$v = $v;
};
}
pub struct PerfContextStatistics {
pub perf_level: PerfLevel,
pub kind: PerfContextKind,
pub write_wal_time: u64,
pub pre_and_post_process: u64,
pub write_memtable_time: u64,
pub write_thread_wait: u64,
pub db_mutex_lock_nanos: u64,
pub write_scheduling_flushes_compactions_time: u64,
pub db_condition_wait_nanos: u64,
pub write_delay_time: u64,
}
impl PerfContextStatistics {
pub fn new(perf_level: PerfLevel, kind: PerfContextKind) -> Self {
PerfContextStatistics {
perf_level,
kind,
write_wal_time: 0,
pre_and_post_process: 0,
write_thread_wait: 0,
write_memtable_time: 0,
db_mutex_lock_nanos: 0,
write_scheduling_flushes_compactions_time: 0,
db_condition_wait_nanos: 0,
write_delay_time: 0,
}
}
pub fn start(&mut self) {
if self.perf_level == PerfLevel::Disable {
return;
}
let mut ctx = RawPerfContext::get();
ctx.reset();
set_perf_level(raw_util::to_raw_perf_level(self.perf_level));
self.write_wal_time = 0;
self.pre_and_post_process = 0;
self.db_mutex_lock_nanos = 0;
self.write_thread_wait = 0;
self.write_memtable_time = 0;
self.write_scheduling_flushes_compactions_time = 0;
self.db_condition_wait_nanos = 0;
self.write_delay_time = 0;
}
pub fn report(&mut self) {
match self.kind {
PerfContextKind::RaftstoreApply => {
report_perf_context!(self, APPLY_PERF_CONTEXT_TIME_HISTOGRAM_STATIC);
}
PerfContextKind::RaftstoreStore => {
report_perf_context!(self, STORE_PERF_CONTEXT_TIME_HISTOGRAM_STATIC);
}
}
}
}