文档章节

RGW性能监控及源码实现

秦牧羊
 秦牧羊
发布于 2017/06/22 14:07
字数 539
阅读 139
收藏 0

RGW性能监控及源码实现

性能计数器实现

性能计数器启动过程

#src/rgw/rgw_main.cc
int main(int argc, const char **argv)
    ...
  if (g_conf->daemonize) {
    global_init_daemonize(g_ceph_context);
  }
  Mutex mutex("main");
  SafeTimer init_timer(g_ceph_context, mutex);
  init_timer.init();
  mutex.Lock();
  init_timer.add_event_after(g_conf->rgw_init_timeout, new C_InitTimeout);
  mutex.Unlock();

  // Enable the perf counter before starting the service thread
  g_ceph_context->enable_perf_counter();
    ...
  r = rgw_perf_start(g_ceph_context); #启用rgw计数器

性能计数器参数说明

#src/rgw/rgw_common.cc
int rgw_perf_start(CephContext *cct)
{
  PerfCountersBuilder plb(cct, cct->_conf->name.to_str(), l_rgw_first, l_rgw_last);

  plb.add_u64_counter(l_rgw_req, "req", "Requests"); #处理成功请求数量
  plb.add_u64_counter(l_rgw_failed_req, "failed_req", "Aborted requests"); #处理失败请求数量

  plb.add_u64_counter(l_rgw_get, "get", "Gets"); #GET请求数量
  plb.add_u64_counter(l_rgw_get_b, "get_b", "Size of gets");
  plb.add_time_avg(l_rgw_get_lat, "get_initial_lat", "Get latency");
  plb.add_u64_counter(l_rgw_put, "put", "Puts"); #PUT请求数量
  plb.add_u64_counter(l_rgw_put_b, "put_b", "Size of puts");
  plb.add_time_avg(l_rgw_put_lat, "put_initial_lat", "Put latency");

  plb.add_u64(l_rgw_qlen, "qlen", "Queue length");
  plb.add_u64(l_rgw_qactive, "qactive", "Active requests queue");

  plb.add_u64_counter(l_rgw_cache_hit, "cache_hit", "Cache hits"); #用于缓存RGW元数据的缓存命中次数
  plb.add_u64_counter(l_rgw_cache_miss, "cache_miss", "Cache miss"); #未命中次数

  plb.add_u64_counter(l_rgw_keystone_token_cache_hit, "keystone_token_cache_hit", "Keystone token cache hits");
  plb.add_u64_counter(l_rgw_keystone_token_cache_miss, "keystone_token_cache_miss", "Keystone token cache miss");

  perfcounter = plb.create_perf_counters();
  cct->get_perfcounters_collection()->add(perfcounter);
  return 0;
}

性能计数器类型定义如下

#src/rgw/rgw_common.cc
enum {
  l_rgw_first = 15000,
  l_rgw_req,
  l_rgw_failed_req,

  l_rgw_get,
  l_rgw_get_b,
  l_rgw_get_lat,

  l_rgw_put,
  l_rgw_put_b,
  l_rgw_put_lat,

  l_rgw_qlen,
  l_rgw_qactive,

  l_rgw_cache_hit,
  l_rgw_cache_miss,

  l_rgw_keystone_token_cache_hit,
  l_rgw_keystone_token_cache_miss,

  l_rgw_last,
};

如何使用计数器

方式1

root@demo# ceph --admin-daemon /var/run/ceph-client.radosgw.en-zone1.asok perf dump
{
"cct": {
   "total_workers": 32,
   "unhealthy_workers": 0
},
"client.radosgw.en-zone1": {
   "req": 2,
   "failed_req": 2,
   "get": 0,
   "get_b": 0,
   "get_initial_lat": {
       "avgcount": 0,
       "sum": 0.000000000
   },
   "put": 0,
   "put_b": 0,
   "put_initial_lat": {
       "avgcount": 0,
       "sum": 0.000000000
   },
   "qlen": 0,
   "qactive": 0,
   "cache_hit": 0,
   "cache_miss": 2,
   "keystone_token_cache_hit": 0,
   "keystone_token_cache_miss": 0
}

方式2 (使用Dumpling以上版本)

root@demo# ceph daemon client.radosgw.en-zone1 perf dump
{
   "cct": {
       "total_workers": 32,
       "unhealthy_workers": 0
   },
   "client.radosgw.en-zone1": {
       "req": 2,
       "failed_req": 2,
       "get": 0,
       "get_b": 0,
       "get_initial_lat": {
           "avgcount": 0,
           "sum": 0.000000000
       },
       "put": 0,
       "put_b": 0,
       "put_initial_lat": {
           "avgcount": 0,
           "sum": 0.000000000
       },
       "qlen": 0,
       "qactive": 0,
       "cache_hit": 0,
       "cache_miss": 2,
       "keystone_token_cache_hit": 0,
       "keystone_token_cache_miss": 0
   },

总结

性能计数器一般人可能不太关注,但是将计数器数据推送到一些监控系统里面,同时添加一些告警策略,能够显著提升运维质量。同时通过源码自定义去扩展计数器类型,从ceph内部实现一些自定义数据的统计。

附:自定义计数器源码实例

  1. common/perf_counters: add average time for PERFCOUNTER_TIME https://github.com/ceph/ceph/pull/15478/files

  2. mds: add perf counters for file system operations https://github.com/ceph/ceph/pull/14938/files

  3. Added new counters for monitoring http status https://github.com/ceph/ceph/pull/10630/files

© 著作权归作者所有

共有 人打赏支持
秦牧羊
粉丝 73
博文 57
码字总数 28980
作品 0
广州
架构师
私信 提问
Ceph RGW bucket 自动分片介绍和存在的问题

工作中存储集群使用了 Ceph 技术,所用的是版本是 Luminous 12.2.4,因为刚刚上手 Ceph,不少概念和问题也都是头一次听说,比如这次的自动分片(auto resharding)。不得不说,Ceph 对象存储...

blackpiglet
08/14
0
0
ceph RGW接口源码解析--Rados数据操作

RGW业务处理流程: http reqest --> apache 转 FastCgi module FastCgi module --> radosgw 通过socket请求实现(未确定是否有其它方式) radosgw --> ceph集群 通过socket实现,调用rados接口......

惊浪
2014/12/11
0
0
RGW Cache类解析

RGW中的Cache由RGW Cache类实现。Cache的主要功能就是提供一个缓存,使得在缓存中的对象能够有更好的读写性能。对于客户端读写缓存中不存在的对象,则需要从Ceph集群中读取该对象信息,之后将...

linuxhunter
2016/04/20
104
0
Ceph v0.80.9 发行说明,分布式文件系统

Ceph v0.80.9 昨天正式发布:http://www.oschina.net/news/60353/ceph-0-80-9。 Ceph v0.80.9 firefly 是个 bug 修复版本,修复了 librbd 的性能回退问题;一个重要的 CRUSH 误操作;一些 RG...

oschina
2015/03/11
943
0
从传统运维到云运维演进历程之软件定义存储(五)下

上篇文章讲到了Ceph在灾备方面有三大神兵利器:故障域、RBD异地灾备、RGW异地灾备。那么本文讲述下剩下的两大利器RBD异地灾备和RGW异地灾备 关卡五:Ceph灾备神兵利器-RBD Mirroring & RGW异...

Devin
2016/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
今天
5
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
3
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
4
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部