利用火焰图分析ceph pg分布
前言
性能优化大神Brendan Gregg发明了火焰图来定位性能问题,通过图表就可以发现问题出在哪里,通过svg矢量图来查看性能卡在哪个点,哪个操作占用的资源最多
在查看了原始数据后,这个分析的原理是按层级来对调用进行一个计数,然后以层级去做比对,来看横向的占用的比例情况
基于这个原理,把osd tree的数据和pg数据可以做一个层级的组合,从而可以很方便的看出pg的分布情况,主机的分布情况,还可以进行搜索,在一个简单的图表内汇聚了大量的信息
实践
获取需要的数据,这个获取数据是我用一个脚本解析的osd tree 和pg dump,然后按照需要的格式进行输出
default;lab8106;osd.2;0.0 6
default;lab8106;osd.3;0.0 6
default;rack1;lab8107;osd.0;0.0 6
需要的格式是这个样的,最后一个为权重,使用的是对象数,因为对象数可能为0,所以默认在每个数值进行了加一的操作,前面就是osd的分布的位置
脚本/sbin/stackcollapse-crush内容如下:
#! /bin/python
# -*- coding: UTF-8 -*-
import os
import commands
import json
def main():
global list_all_host
list_all_host = commands.getoutput('ceph osd tree -f json-pretty 2>/dev/null')
getpgmap()
def getosd(osd):
mylist=[]
crushid={}
json_str = json.loads(list_all_host)
for item in json_str['nodes']:
if item.has_key('children'):
crushid[str(item['id'])]=str(item['name'])
for child in item['children']:
tmplist=[item['id'],child]
mylist.append(tmplist)
if item['type'] == "osd":
crushid[str(item['id'])]=str(item['name'])
listnum=len(mylist)
compareindex=0
###从数组开始跟后面的数组进行比较,如果有就改变后面的数组,然后删除当前比较的list(index),进行list更新
###如果没有改变,就把索引往后推即可
while compareindex < len(mylist):
change = False
for index,num in enumerate(mylist):
if compareindex != index and compareindex < index:
if str(mylist[compareindex][-1]) == str(num[0]):
del mylist[index][0]
mylist[index]=mylist[compareindex]+mylist[index]
change=True
if str(mylist[compareindex][0]) == str(num[-1]):
del mylist[index][-1]
mylist[index]=mylist[index]+mylist[compareindex]
change=True
if change == True:
del mylist[compareindex]
if change == False:
compareindex = compareindex + 1
for index,crushlist in enumerate(mylist):
osdcrushlist=[]
for osdlocaltion in crushlist:
local=str(crushid['%s' %osdlocaltion])
osdcrushlist.append(local)
if osdcrushlist[-1] == osd:
return osdcrushlist
def getpgmap():
list_all_host = commands.getoutput('ceph pg ls --format json-pretty 2>/dev/null')
json_str = json.loads(list_all_host)
for item in json_str:
for osdid in item['up']:
osd="osd."+str(osdid)
b=""
for a in getosd(osd):
b=b+str(a)+";"
print b+item['pgid']+" "+str(item['stat_sum']['num_objects']+1)
if __name__ == '__main__':
main()
获取数据
/sbin/stackcollapse-crush > /tmp/mydata
解析数据
获取解析脚本,这个脚本是Brendan Gregg写好的,这地方托管到我的github里面了
wget -O /sbin/flamegraph https://bash.githubusercontent.com/zphj1987/cephcrushflam/master/flamegraph.pl
对数据进行解析
/sbin/flamegraph --title "Ceph crush flame graph" --width "1800" --countname "num" /tmp/mydata > /tmp/mycrush.svg
将/tmp/mycrush.svg拷贝到windows机器,然后用浏览器打开即可,推荐chrome
效果图如下
Example :
[
- 通过颜色来区分比例占用的区别
- 支持搜索
- tree方式,可以清楚看到分布
- 可以查看pg对象数目
- 可以查看osd上面有哪些pg,主机上有哪些osd
总结
通过ceph osd tree可以查到整个的信息,但是一个屏幕的信息量有限,而通过滚屏或者过滤进行查询的信息,需要做一下关联,而这种可以缩放的svg位图的方式,可以包含大量的信息,如果是做分析的时候还是能比较直观的看到,上面的难点在于获取数据部分,而绘图的部分是直接用的现有的处理,比自己重新开发一个要简单的多,类似的工具还有个桑基图方式,这个在inkscope这个管理平台里面有用到
本篇就是在最小的视野里容纳尽量多的信息量一个实例,其他的数据有类似模型的也可以做相似的处理
变更记录
| Why | Who | When |
|---|---|---|
| 创建 | 武汉-运维-磨渣 | 2017-07-18 |
利用火焰图分析ceph pg分布的更多相关文章
- 用 CPI 火焰图分析 Linux 性能问题
https://yq.aliyun.com/articles/465499 用 CPI 火焰图分析 Linux 性能问题 yangoliver 2018-02-11 16:05:53 浏览1076 ...
- 火焰图分析openresty性能瓶颈
注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...
- 火焰图分析CPU性能问题
1.找出应用程序或内核消耗CPU的PID 2.执行perf record 命令,记录该PID的行为 perf record -a -g -p 14851 -- sleep 30 --30秒后退出 3. ...
- Skynet服务热点火焰图分析
最近花了一周时间对场景服务进行热点分析,利用以前的火焰图工具做了一点微小的贡献,分享下心得(仓库地址在https://github.com/spin6lock/skynet_systemtap_set ...
- 如何利用火焰图定位 Java 的 CPU 性能问题
常见 CPU 性能问题 你所负责的服务(下称:服务)是否遇到过以下现象: 休息的时候,手机突然收到大量告警短信,提示服务的 99.9 line 从 20ms 飙升至 10s: 正在敲代码实现业务功能 ...
- perf + Flame Graph火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
- [转]perf + 火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
- perf + 火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
- 使用arthas 生成火焰图分析jvm
arthas 是阿里巴巴开源的强大的jvm 应该分析工具,以下是使用arthas 生成jvm 火焰图的一个学习 项目使用docker-compose 运行,对于生成的火焰图使用nginx 提供一个访问 ...
随机推荐
- pycharm2018.3.5 下载激活(windows平台)
软件下载: 百度网盘下载 提取码: 73p7 激活操作: 1.下载jar包 JetbrainsCrack-4.2-release-enc.jar 链接:https://pan.baidu.com/s/ ...
- 如何对数据进行MD5加密
前端进行加密 /** * jQuery MD5 hash algorithm function * * <code> * Calculate the md5 hash of a Strin ...
- 来自朋友最近阿里、腾讯、美团等P7岗位面试题
来自年初和最近朋友的大厂面试题. 阿里巴巴 对象如何进行深拷贝,除了clone happen-before原则 jvm调优的实践 单例对象会被jvm的gc时回收吗 redis如果list较大,怎么优化 ...
- vue中iframe加载慢,给它加loading效果
js框架:vue ui框架:element 因为iframe加载慢,所以在它加载完成前添加loading效果,loading用的是element家的加载效果 <template> < ...
- U137971 公司搬迁 - 并查集 奇偶性
题目描述 因为人员规模扩大,T公司准备搬到新的写字楼去,写字楼分为A座和B座,n名不同工号的员工x(p1,p2,p3...pn) 按照下面两个规则确定在A座或者B座进行办公:(1)如果工号为x的员工在 ...
- 04 . Go+Vue开发一个线上外卖应用(用户名密码和图形验证码)
图形化验证码生成和验证 功能介绍 在使用用户名和密码登录功能时,需要填写验证码,验证码是以图形化的方式进行获取和展示的. 验证码使用原理 验证码的使用流程和原理为:在服务器端负责生成图形化验证码,并以 ...
- kube-proxy实现原理
1.service概念 service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod.service会为这个LB提供一个IP,一般称为cluster IP.kube-pr ...
- .netcore3.1使用log4net/nlog记录日志
.netcore3.1使用log4net/nlog记录日志 .netcore3.1与2.x之间很是有不少差异的.本来想通过ctrl+c,ctrl+v将在2.2中实现的简单日志记录搬到.netcore3 ...
- 别走!这里有个笔记:图文讲解 AQS ,一起看看 AQS 的源码……(图文较长)
前言 AbstractQueuedSynchronizer 抽象队列同步器,简称 AQS .是在 JUC 包下面一个非常重要的基础组件,JUC 包下面的并发锁 ReentrantLock CountD ...
- c# 表达式树(一)
前言 打算整理c# 代码简化史系列,所以相关的整理一下,简单的引出一下概念. 什么是表达式树呢? 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的 ...