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則不保證...