RGW性能监控及源码实现
时间:2022-04-25
本文章向大家介绍RGW性能监控及源码实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1性能计数器实现
性能计数器启动过程
#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,
};
2如何使用计数器
方式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
},
3自定义计数器源码实例
- common/perf_counters: add average time for PERFCOUNTER_TIME https://github.com/ceph/ceph/pull/15478/files
- mds: add perf counters for file system operations https://github.com/ceph/ceph/pull/14938/files
- Added new counters for monitoring http status https://github.com/ceph/ceph/pull/10630/files
4总结
性能计数器一般人可能不太关注,但是将计数器数据推送到一些监控系统里面,同时添加一些告警策略,能够显著提升运维质量。同时通过源码层面去扩展计数器类型,从ceph内部去实现一些自定义数据的统计,也是一个不错的功能亮点。
- Implement Domain Object in Golang
- 厚土Go学习笔记 | 04. 导入和导出的不同 用math.Pi来举例
- 厚土Go学习笔记 | 03. 数学运算的随机数
- Nodejs学习笔记(十一)--- 数据采集器示例(request和cheerio)
- 厚土Go学习笔记 | 02. 打印当前时间time.Now()时不我待
- 厚土Go学习笔记 | 01. Hello World开篇
- Golang精编100题
- IntelliJ idea配置Go开发环境
- 仰望PHPSHE1.5漏洞
- Golang负载均衡
- 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式
- Golang单例模式
- 2018,我要Axublog。
- 厚土Go学习笔记 | 16. go语言有指针 没有指针运算
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 天气APP(十九)更换新版API接口(更高、更快、更强)
- Android 天气APP(二十)增加欢迎页及白屏黑屏处理、展示世界国家/地区的城市数据
- Android 天气APP(二十二)改动些许UI、增加更多空气质量数据和生活建议数据展示
- Android 自定义View 之 RectF用法详解
- Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
- Android 天气APP(二十六)增加自动更新(检查版本、通知栏下载、自动安装)
- Android 天气APP(二十七)增加地图天气的逐小时天气、太阳和月亮数据
- Android 天气APP(二十八)地图搜索定位
- DevEco Studio项目构建讲解、编写页面、布局介绍、页面跳转
- Android 天气APP(二十九)壁纸设置、图片查看、图片保存
- Chrome 私人珍藏-stylus插件实现个性化百度界面定制
- Python 基础篇-简单的异常捕获
- Python 技巧篇-让我的程序暂停一下
- Python+selenium 技术篇-浏览器后台运行
- Python 基础篇-python3安装pyHook和pywin32库