ceph perf counter 原始碼分析及使用

2021-08-04 12:10:03 字數 4085 閱讀 4122

1     enum ;

89 perfcounterscollection *coll = g_ceph_context->get_perfcounters_collection();

1011 perfcountersbuilder test_plb(g_ceph_context, "test_perfcounter", test_perfcounter_first, test_perfcounter_last);

1213 test_plb.add_u64_counter(test_perfcounter_count, "test_count");

14 test_plb.add_time(test_perfcounter_time, "test_time", "time of system service");

15 test_plb.add_u64(test_perfcounter_sum, "test_sum", "sum of variable", "wr_bytes_sum");

1617 test_logger = test_plb.create_perf_counters();

1819 coll->add(test_plb);

2021 test_logger->

set(test_perfcounter_count, 1);

22 test_logger->tset(test_perfcounter_time, utime_t(0, 1));

23 test_logger->

set(test_perfcounter_sum, 1);

2425 test_logger->inc(test_perfcounter_count);

26 test_logger->tinc(test_perfcounter_time, utime_t());

27 test_logger->inc(test_percounter_sum, 10);

2829 test_logger->dec(test_perfcounter_count);

30 test_logger->dec(test_perfcounter_sum, 5);

3132 test_logger->reset();

3334 coll->reset(string("test_perfcounter"));

35 coll->reset(string("all"));

36 coll->remove(test_logger);

37 coll->clear();

1-7: 定義乙個列舉型,在使用perf counter的時候,每乙個couter會有乙個data size,也就是有多少個perf counter物件,所以都會定義乙個enum,enum的第乙個和最後乙個元素是必須要有的(也就是first和last),然後我們要計算perf的指標都定義在這兩個enum元素之間就ok。

9: 定義了乙個perfcountercollection物件,該類中有perf_counters_set_t m_loggers成員變數,該類是多個perfcounter子模組的集合,所有的perf counter模組都在這個集合中。

11: 定義了乙個perfcountersbuilder物件,該類中有perfcounters *m_perf_counters成員變數。

m_perf_counters變數在例項化類的時候,通過類的建構函式初始化了,初始化:new perfcounters(cct, name, first, last),例項化乙個perfcounters物件。

perfcounters類中有perf_counter_data_vec_t m_data及int m_lower_bound, int m_upper_bound, string m_name;

perfcounters類的建構函式:perfcounters::perfcounters(cephcontext *cct, const std::string &name, int lower_bound, int upper_bound),建構函式的引數中的name是計算perf子模組的名稱, 在這裡就是」test_perfcounter」, lower_bound和high_bound是我們要跟蹤計算perf的子模組的上下界限,主要是為了調整m_data(是乙個vector)的長度。

13-15:將具體的跟蹤指標(test_perfcounter_count等)加入到跟蹤子模組(test_perfcounter)中。

根據不同的指標的型別不同,呼叫的函式也不同,也是根據不同的型別來區分的。這些函式最後還是呼叫同樣的函式:add_impl(idx, name, description, nick, perfcounter_u64);只是最後這個type引數不同。目前根據time、普通數值、計量值來區分,分別有add_time()、add_u64()、add_u64_counter().

add_impl(…)函式如下:

0

perfcounters::perf_counter_data_vec_t &vec(m_perf_counters->m_data);

1perfcounters::perf_counter_data_any_d

2 &data

(vec[idx - m_perf_counters->m_lower_bound - 1]);

3 assert(data.type == perfcounter_none);

4data.name = name;

5data.description = description;

6data.nick = nick;

7data.type = (enum

perfcounter_type_d)ty;

0: 取m_data的值

1-2: 取m_data中的和具體的跟蹤指標對應index的值

4-7: 給m_data對應的index位置賦值,從上層傳下來的關於這個指標的資訊,主要是index、指標名稱、指標描述資訊、指標的別名、指標型別

17: 返回乙個完整perf counter的perfcounter型別的m_perf_counters; 上面關於perf指標的操作都是為了建立乙個完整的perfcounter物件。

1 perfcounters *perfcountersbuilder::create_perf_counters()

2 9 }

10 perfcounters *ret = m_perf_counters;

11 m_perf_counters =

null;

12return ret;

13 }

19: 將新的perf counter字模組加入perf counters集合中。

21-30: perf具體的計算函式,包括set()、tset()、inc()、tinc()、dec()

這些函式都有乙個引數: int idx, 就是前面我們定義的enum型別的具體指標。函式首字母是』t』的是關於time的處理。

set()/tset():設定乙個值。

inc()/tinc(): 增加,如果給定了增加多少,就增加具體的值;如果沒有指定增加多少,+1.

dec(): 減少,如果給定了減少的值,就減少多少;如果沒有指定,-1

32: 將test_perfcounter子模組中的所有指標都清0

34-35: 在perf counter集合的層面上清空,其實內部最後還是呼叫的perfcounter::reset(), 也就是32行的呼叫函式

perfcountercollection::reset(string name)函式中的引數如果是」all」的話,perf集合會遍歷所有的perf counter,依次呼叫reset();

引數可以是具體的perf counter子模組名,就只清空該模組, 比如reset(「test_perfcounter」)

36: 從perf counter集合中刪除某個子perf counter模組

37: 從perf counter集合中刪除所有的perf counter模組

參考ceph源**: test/perf_counters.cc

JDK類載入機制原始碼分析及原始碼分析

jvm的類載入機制主要有如下三種機制 1.全盤負責 所謂全盤負責,就是說當乙個類載入器載入個個class的時候,該class所依賴和引用的其他class也將由該類載入 器負責載入,除非使用另外乙個類載入器來載入。2.雙親委託 所謂雙親委託則是先讓parent 父 類載入器試圖載入該class 若父載...

Spring設計及原始碼分析

最近這幾天在看spring的設計與原始碼,又是把自己折磨的死去活來的。但是這麼經典的東西總是要好好體會吧,畢竟機會不多。寫一點自己的思考和感觸吧 問題1 ioc和di到底有什麼區別?之前一直認為是同乙個東西,就是從不同的角度來看的,所以有了不同的名稱 主要是從李剛的那本書上看到所理解的 但是最近去官...

LinkedHashMap原始碼分析及實現LRU演算法

ps 要先了解hashmap的實現原理hashmap原始碼分析 可以看到linkedhashmap繼承了hashmap,其實際是在hashmap基礎上,把資料節點連成乙個雙向鍊錶,遍歷的時候按鍊錶順序遍歷。小總結預設的linkedhashmap 的遍歷會按照插入的順序遍歷出來,hashmap則不保證...