目录
简介
Ceph 性能计数器( performance counters )是内部模块指标的收集统计器。它采集到的数据可以通过各种工具收集、聚合和绘图,可用于性能分析。
Ceph mon和 OSD 等进程的性能计数器 有专门的socket接口供其他工具连接和交互。默认情况下,每个进程的套接字文件位于 /var/run/ceph 下。性能计数器被组合到集合名称中。这些集合名称代表一个子系统或子系统的一个实例。
以下是监视器、OSD 和 RADOS 网关集合名称类别的完整列表,以及每个类别的简要说明:
一、查ceph自带的统计
1 命令格式
perf dump命令将输出 ceph中 PERF COUNTERS 的统计信息
ceph daemon xxx.id perf dump 命令
如:
ceph daemon osd.10 perf dump
ceph 提供了许多非常的工具,今天简单介绍一下获取OSD统计信息的工具 。通过该命令可以让我们更直观的看到OSD的一些信息。
输出osd.N的统计信息: ceph daemon osd.N perf dump
重置osd.N的统计信息:ceph daemon osd.N perf reset all
2 dump 命令输出结果
该命令会输出一个json格式的结果,通过对结果的分析,我们可以很好的得到osd的运行状态,比如读写操作的延时、操作队列的长度,数据恢复,操作计数等信息,部分统计字段如下:
(字段含义见后面章节)
{
"WBThrottle": {
"bytes_dirtied": 0,
"bytes_wb": 17505569440,
"ios_dirtied": 0,
"ios_wb": 12112,
"inodes_dirtied": 0,
"inodes_wb": 12112
},
"filestore": {
"journal_queue_max_ops": 50000,
"journal_queue_ops": 0,
"journal_ops": 57187,
"journal_queue_max_bytes": 33554432,
"journal_queue_bytes": 0,
"journal_bytes": 22842879961,
"journal_latency": {
"avgcount": 57187,
"sum": 322.201043018
},
"journal_wr": 52269,
"journal_wr_bytes": {
"avgcount": 52269,
"sum": 23029956608
},
"journal_full": 0,
"committing": 0,
"commitcycle": 346,
"commitcycle_interval": {
"avgcount": 346,
"sum": 5199.707915189
},
"commitcycle_latency": {
"avgcount": 346,
"sum": 7.791222630
},
"op_queue_max_ops": 25000,
"op_queue_ops": 0,
"ops": 57187,
"op_queue_max_bytes": 10485760,
"op_queue_bytes": 0,
"bytes": 22842079343,
"apply_latency": {
"avgcount": 57187,
"sum": 2242.084968391
},
"queue_transaction_latency_avg": {
"avgcount": 57187,
"sum": 70.085438088
}
},
"leveldb": {
"leveldb_get": 37522,
"leveldb_transaction": 159445,
...
"leveldb_compact_queue_len": 0
},
"objecter": {
...
},
"osd": {
...
"op_latency": {
"avgcount": 25670,
"sum": 1126.046253167
},
"subop_push": 0,
"subop_push_in_bytes": 0,
"subop_push_latency": {
"avgcount": 0,
"sum": 0.000000000
},
"pull": 0,
...
"copyfrom": 6478,
...
}
}
Ceph daemon osd perf dump 命令_刚刚好的博客-CSDN博客_ceph osd perf
二、自己添加统计
PerfCounters添加步骤,以FileStore,统计增减最终结果为例:
1、添加自己想要统计的元素
ObjectStore中有enum枚举,注意枚举中的第一个元素与最后一个元素,这是给PerfCountersBuilder使用的!
enum {
l_os_first = 84000,
l_os_jq_max_ops,
...
l_os_queue_lat,l_os_nc_used_bytes, // add by skdkjzz
l_os_last,
};
我们自己添加自己想要的元素需要注意必须在l_os_first 与 l_os_last之间添加!
2、在需要使用的cc文件中添加头文件:
#include "common/perf_counters.h"
3、在需要增加或者减少 l_os_nc_used_bytes 的地方调用函数 inc or dec
inc为增加
dec为减少
store->logger->inc(l_os_nc_used_bytes,bytes);
store->logger->dec(l_os_nc_used_bytes,bytes);
至此,完成添加!
原文链接:https://blog.csdn.net/skdkjzz/article/details/52106585
例子2:Ceph内建辅助工具实践 – Blog of Aspirer
例子3:打点 统计均值
1、在Engine.h定义计数的变量的id:l_row_flush_op_lat
enum {
l_engine_first = 100000,
……
l_row_flush_op_lat,
……
l_engine_last,
};
2、创建变量并和id绑定,创建create_perf_counters
add_u64_counter:计数的
add_time_avg:求平均时间的
void EngineService::engine_create_logger()
{
dout(2) << "engine_create_logger" << dendl;
PerfCountersBuilder engine_plb(ecct, "engine", l_engine_first, l_engine_last);
engine_plb.set_prio_default(PerfCountersBuilder::PRIO_USEFUL);
engine_plb.add_u64_counter(
l_engine_op, "op",
"Client operations",
"ops", PerfCountersBuilder::PRIO_CRITICAL);
engine_plb.add_time_avg(
l_engine_op_lat, "engine_op_latency",
"Latency of client operations (including queue time)",
"l", 9);
……
engine_plb.add_time_avg(
l_row_obj_write_lock_hold_lat, "row_obj_write_lock_hold_lat",
"Latency of row_obj_write_lock_hold_lat operation (including queue time)");
// 优先级为调试级别的时延点添加在本行代码后面
engine_plb.set_prio_default(PerfCountersBuilder::PRIO_DEBUGONLY);
logger = engine_plb.create_perf_counters();
ecct->get_perfcounters_collection()->add(logger);
}
{
#做某事前调用begin_inc
eng->logger->begin_inc(l_row_flush_op_lat);----->begin_count++;
(做某事)#做某事后调用tinc
eng->logger->tinc(l_row_flush_op_lat, ceph_clock_now() - start);--->表示把第二个参数的值累加到l_row_flush_op_lat绑定的value上,avgcount++,第3个参数=1,表示算均值
}
重复执行上面多次,最终会累加值value/次数avgcount = 均值。
void PerfCounters::begin_inc(int idx)
{
if (!m_cct->_conf->perf)
return;
assert(idx > m_lower_bound);
assert(idx < m_upper_bound);
perf_counter_data_any_d& data(m_data[idx - m_lower_bound -1]);
if (!(data.type & PERFCOUNTER_TIME))
return;
if (data.type & PERFCOUNTER_LONGRUNAVG) {
data.begin_count++;
}
}
void PerfCounters::tinc(int idx, ceph::timespan amt, uint32_t avgcount)
{
if (!m_cct->_conf->perf)
return;
assert(idx > m_lower_bound);
assert(idx < m_upper_bound);
perf_counter_data_any_d& data(m_data[idx - m_lower_bound - 1]);
if (!(data.type & PERFCOUNTER_TIME))
return;
if (data.type & PERFCOUNTER_LONGRUNAVG) {
data.avgcount++;
data.u64 += amt.count();
data.avgcount2++;
if (data.max_time < amt.count() / 1000) {
data.max_time = amt.count() / 1000;
}
if(0 != ratio_switch)
{
map<uint64_t, uint64_t>::iterator iter;
for(iter = data.latency_ratio.begin(); iter != d