前言

性能优化大神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分布的更多相关文章

  1. 用 CPI 火焰图分析 Linux 性能问题

    https://yq.aliyun.com/articles/465499 用 CPI 火焰图分析 Linux 性能问题   yangoliver 2018-02-11 16:05:53 浏览1076 ...

  2. 火焰图分析openresty性能瓶颈

    注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...

  3. 火焰图分析CPU性能问题

    1.找出应用程序或内核消耗CPU的PID 2.执行perf record 命令,记录该PID的行为 perf record -a -g -p 14851 -- sleep 30 --30秒后退出 3. ...

  4. Skynet服务热点火焰图分析

    最近花了一周时间对场景服务进行热点分析,利用以前的火焰图工具做了一点微小的贡献,分享下心得(仓库地址在https://github.com/spin6lock/skynet_systemtap_set ...

  5. 如何利用火焰图定位 Java 的 CPU 性能问题

     常见 CPU 性能问题 你所负责的服务(下称:服务)是否遇到过以下现象: 休息的时候,手机突然收到大量告警短信,提示服务的 99.9 line 从 20ms 飙升至 10s: 正在敲代码实现业务功能 ...

  6. perf + Flame Graph火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  7. [转]perf + 火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  8. perf + 火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  9. 使用arthas 生成火焰图分析jvm

    arthas 是阿里巴巴开源的强大的jvm 应该分析工具,以下是使用arthas 生成jvm 火焰图的一个学习 项目使用docker-compose 运行,对于生成的火焰图使用nginx 提供一个访问 ...

随机推荐

  1. Asp常见函数

    ASP语言的特点: 1.允许使用VBscript或java script简易Script语言,并可在文件中结合Html: 2.无需编译,由WEBserver执行产生: 3.与任何ActiveX Scr ...

  2. ssh登录二次验证,让服务器更安全。

    码云地址 sshdTwoVerification 介绍 ssh登录二次验证 问题:现在很多人的Linux服务器可能会被攻击,只校验一次后台用户名密码登录变得不再保险. 当然大家首先要做的是修改ssh服 ...

  3. 【树形DP】JSOI BZOJ4472 salesman

    题目内容 vjudge链接 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇 之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收 益.这些 ...

  4. swoole 客户端和服务端不断通信

    server.php <?php class Chat { const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问 const PART = 9501; ...

  5. 联赛模拟测试22 D. 简单计算

    题目描述 分析 \(\sum_{i=0}^p[(p|qi)?0:1]=\sum_{i=0}^p[(p/gcd(p,q)|qi/gcd(p,q))?0:1]=\sum_{i=0}^p[(p/gcd(p, ...

  6. 【问题记录】—.NetCore 编译问题

    最近在协助验证Jenkins自动编译发布时,对一些.Net Core编译问题进行了解决:特记录一下 一.编译生成netcoreapp目录问题 问题现象 .net core项目编译输出目录总是包含在[n ...

  7. vue-cli3搭建的vue项目中使用jquery

    装包:npm install jquery --save 方式一 全局使用 1)main.js中引入 // jquery import $ from 'jquery' Vue.prototype.$ ...

  8. 云计算之路-出海记:蹭一张 aws 船票

    出海记开篇之后,在 aws 上搭建博客园海外站的出海计划今天开始迈出第一步 -- 注册一个 aws 海外区域账号. aws 现在针对新注册用户提供12个月免费套餐(正在园子里推广并提供了专属注册通道) ...

  9. Java学习的第八天

    1.求平均值 冒泡法 选择排序 插入排序 快速排序 二分法查找 使用工具排序 工具二分法查找 生成随机数 2.在二分法时,没有强调要先排序才可以二分法.递归没太看明白. 3.明天学习综合实例和第四章开 ...

  10. Java实现评论回复功能

    目录 一.分类方式 1.单一型 2.嵌套型 3.两层型 二.实现原理 1.单一型 2.嵌套型 3.两层型 使用递归循环开发评论回复功能,适用于大部分的简单单体应用 评论功能或许是大多数的单体应用之中会 ...