Skip to content

Commit 7c5a00a

Browse files
authored
Merge pull request #2201 from yangby-cryptape/pr/use-metric-for-memory-tracker
refactor: replace logs by metrics for memory tracker
2 parents b81d9ac + 3140311 commit 7c5a00a

5 files changed

Lines changed: 45 additions & 77 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

util/memory-tracker/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ license = "MIT"
77

88
[dependencies]
99
ckb-logger = { path = "../logger" }
10+
ckb-metrics = { path = "../metrics" }
1011
ckb-db = { path = "../../db" }
1112

1213
# TODO Why don't disable this crate by "target.*" in the crates which are dependent on this crate?

util/memory-tracker/src/process.rs

Lines changed: 17 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use std::{sync, thread, time};
22

3-
use ckb_logger::{debug, error, info};
3+
use ckb_logger::{error, info};
4+
use ckb_metrics::metrics;
45
use futures::executor::block_on;
56
use heim::units::information::byte;
67
use jemalloc_ctl::{epoch, stats};
78

8-
use crate::{rocksdb::TrackRocksDBMemory, utils::HumanReadableSize};
9+
use crate::rocksdb::TrackRocksDBMemory;
910

1011
macro_rules! je_mib {
1112
($key:ty) => {
@@ -21,7 +22,7 @@ macro_rules! je_mib {
2122
macro_rules! mib_read {
2223
($mib:ident) => {
2324
if let Ok(value) = $mib.read() {
24-
HumanReadableSize::from(value as u64)
25+
value as i64
2526
} else {
2627
error!("failed to read jemalloc stats for {}", stringify!($mib));
2728
return;
@@ -58,17 +59,19 @@ pub fn track_current_process<Tracker: 'static + TrackRocksDBMemory + Sync + Send
5859
.name("MemoryTracker".to_string())
5960
.spawn(move || {
6061
if let Ok(process) = block_on(heim::process::current()) {
61-
let pid = process.pid();
6262
loop {
6363
if je_epoch.advance().is_err() {
6464
error!("failed to refresh the jemalloc stats");
6565
return;
6666
}
6767
if let Ok(memory) = block_on(process.memory()) {
6868
// Resident set size, amount of non-swapped physical memory.
69-
let rss: HumanReadableSize = memory.rss().get::<byte>().into();
69+
let rss = memory.rss().get::<byte>() as i64;
7070
// Virtual memory size, total amount of memory.
71-
let virt: HumanReadableSize = memory.vms().get::<byte>().into();
71+
let vms = memory.vms().get::<byte>() as i64;
72+
73+
metrics!(gauge, "ckb-sys.mem.process", rss, "type" => "rss");
74+
metrics!(gauge, "ckb-sys.mem.process", vms, "type" => "vms");
7275

7376
let allocated = mib_read!(allocated);
7477
let resident = mib_read!(resident);
@@ -77,56 +80,15 @@ pub fn track_current_process<Tracker: 'static + TrackRocksDBMemory + Sync + Send
7780
let retained = mib_read!(retained);
7881
let metadata = mib_read!(metadata);
7982

83+
metrics!(gauge, "ckb-sys.mem.jemalloc", allocated, "type" => "allocated");
84+
metrics!(gauge, "ckb-sys.mem.jemalloc", resident, "type" => "resident");
85+
metrics!(gauge, "ckb-sys.mem.jemalloc", active, "type" => "active");
86+
metrics!(gauge, "ckb-sys.mem.jemalloc", mapped, "type" => "mapped");
87+
metrics!(gauge, "ckb-sys.mem.jemalloc", retained, "type" => "retained");
88+
metrics!(gauge, "ckb-sys.mem.jemalloc", metadata, "type" => "metadata");
89+
8090
if let Some(tracker) = tracker_opt.clone() {
81-
let stats = tracker.gather_memory_stats();
82-
debug!(
83-
"CurrentProcess {{ \
84-
pid: {}, rss: {}, virt: {}, \
85-
Jemalloc: {{ \
86-
allocated: {}, resident: {}, \
87-
active: {}, mapped: {}, retained: {}, \
88-
metadata: {} }}, \
89-
RocksDB: {{ \
90-
total: {}, cache: {}, readers: {}, \
91-
memtables: {}, pinned: {}, \
92-
cache-capacity: {} \
93-
}} \
94-
}}",
95-
pid,
96-
rss,
97-
virt,
98-
allocated,
99-
resident,
100-
active,
101-
mapped,
102-
retained,
103-
metadata,
104-
stats.total_memory,
105-
stats.block_cache_usage,
106-
stats.estimate_table_readers_mem,
107-
stats.cur_size_all_mem_tables,
108-
stats.block_cache_pinned_usage,
109-
stats.block_cache_capacity,
110-
);
111-
} else {
112-
debug!(
113-
"CurrentProcess {{ \
114-
pid: {}, rss: {}, virt: {}, \
115-
Jemalloc: {{ \
116-
allocated: {}, resident: {}, \
117-
active: {}, mapped: {}, retained: {}, \
118-
metadata: {} }} \
119-
}}",
120-
pid,
121-
rss,
122-
virt,
123-
allocated,
124-
resident,
125-
active,
126-
mapped,
127-
retained,
128-
metadata,
129-
);
91+
let _ignored = tracker.gather_memory_stats();
13092
}
13193
} else {
13294
error!("failed to fetch the memory information about current process");

util/memory-tracker/src/rocksdb.rs

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,33 @@
11
use ckb_db::internal::ops::{GetColumnFamilys, GetProperty, GetPropertyCF};
2-
use ckb_logger::trace;
2+
use ckb_metrics::metrics;
33

44
use crate::utils::{sum_int_values, PropertyValue};
55

66
// Ref: https://github.com/facebook/rocksdb/wiki/Memory-usage-in-RocksDB
77
pub struct RocksDBMemoryStatistics {
8-
pub total_memory: PropertyValue<u64>,
9-
pub block_cache_usage: PropertyValue<u64>,
108
pub estimate_table_readers_mem: PropertyValue<u64>,
9+
pub size_all_mem_tables: PropertyValue<u64>,
1110
pub cur_size_all_mem_tables: PropertyValue<u64>,
12-
pub block_cache_pinned_usage: PropertyValue<u64>,
1311
pub block_cache_capacity: PropertyValue<u64>,
12+
pub block_cache_usage: PropertyValue<u64>,
13+
pub block_cache_pinned_usage: PropertyValue<u64>,
1414
}
1515

1616
pub trait TrackRocksDBMemory {
1717
fn gather_memory_stats(&self) -> RocksDBMemoryStatistics {
18-
let block_cache_usage = self.gather_int_values("rocksdb.block-cache-usage");
19-
let estimate_table_readers_mem =
20-
self.gather_int_values("rocksdb.estimate-table-readers-mem");
21-
let cur_size_all_mem_tables = self.gather_int_values("rocksdb.cur-size-all-mem-tables");
22-
let block_cache_pinned_usage = self.gather_int_values("rocksdb.block-cache-pinned-usage");
23-
let total_memory = sum_int_values(&[
24-
block_cache_usage.clone(),
25-
estimate_table_readers_mem.clone(),
26-
cur_size_all_mem_tables.clone(),
27-
block_cache_pinned_usage.clone(),
28-
]);
29-
let block_cache_capacity = self.gather_int_values("rocksdb.block-cache-capacity");
18+
let estimate_table_readers_mem = self.gather_int_values("estimate-table-readers-mem");
19+
let size_all_mem_tables = self.gather_int_values("size-all-mem-tables");
20+
let cur_size_all_mem_tables = self.gather_int_values("cur-size-all-mem-tables");
21+
let block_cache_capacity = self.gather_int_values("block-cache-capacity");
22+
let block_cache_usage = self.gather_int_values("block-cache-usage");
23+
let block_cache_pinned_usage = self.gather_int_values("block-cache-pinned-usage");
3024
RocksDBMemoryStatistics {
31-
total_memory,
32-
block_cache_usage,
3325
estimate_table_readers_mem,
26+
size_all_mem_tables,
3427
cur_size_all_mem_tables,
35-
block_cache_pinned_usage,
3628
block_cache_capacity,
29+
block_cache_usage,
30+
block_cache_pinned_usage,
3731
}
3832
}
3933
fn gather_int_values(&self, key: &str) -> PropertyValue<u64>;
@@ -54,11 +48,11 @@ where
5448
fn gather_int_values(&self, key: &str) -> PropertyValue<u64> {
5549
let mut values = Vec::new();
5650
for (cf_name, cf) in self.get_cfs() {
57-
let value_col = self
58-
.property_int_value_cf(cf, key)
51+
let value_col: PropertyValue<u64> = self
52+
.property_int_value_cf(cf, &format!("rocksdb.{}", key))
5953
.map_err(|err| format!("{}", err))
6054
.into();
61-
trace!("{}({}): {}", key, cf_name, value_col);
55+
metrics!(gauge, "ckb-sys.mem.rocksdb", value_col.as_i64(), "type" => key.to_owned(), "cf" => cf_name.to_owned());
6256
values.push(value_col);
6357
}
6458
sum_int_values(&values)

util/memory-tracker/src/utils.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ pub enum PropertyValue<T> {
3636
Error(String),
3737
}
3838

39+
impl PropertyValue<u64> {
40+
pub(crate) fn as_i64(&self) -> i64 {
41+
match self {
42+
Self::Value(v) => *v as i64,
43+
Self::Null => -1,
44+
Self::Error(_) => -2,
45+
}
46+
}
47+
}
48+
3949
impl fmt::Display for PropertyValue<u64> {
4050
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4151
match self {

0 commit comments

Comments
 (0)