【ceph】ceph性能分析工具之perf dump代码打点调试统计

本文介绍了Ceph性能计数器的使用,特别是`perf dump`命令,用于分析OSD的统计信息。通过示例展示了如何添加自定义统计,并分析了IO耗时,揭示了性能瓶颈可能存在于客户端到OSD的通信阶段。作者还分享了代码修改和验证的过程,以提高IOPS性能。
摘要由CSDN通过智能技术生成

目录

简介

一、查ceph自带的统计

1 命令格式

2 dump 命令输出结果

二、自己添加统计

三、分析案例

io耗时初分析

继续分析

进一步分析

代码修改和验证

四、报错记录 

五、附录

1、代码修改和验证


简介

Ceph 性能计数器( performance counters )是内部模块指标的收集统计器。它采集到的数据可以通过各种工具收集、聚合和绘图,可用于性能分析。

Ceph mon和 OSD 等进程的性能计数器 有专门的socket接口供其他工具连接和交互。默认情况下,每个进程的套接字文件位于 /var/run/ceph 下。性能计数器被组合到集合名称中。这些集合名称代表一个子系统或子系统的一个实例。
以下是监视器、OSD 和 RADOS 网关集合名称类别的完整列表,以及每个类别的简要说明:

https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/1.3/html/administration_guide/performance_counters

一、查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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值