zoukankan      html  css  js  c++  java
  • 利用火焰图分析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 :
    [Example

    • 通过颜色来区分比例占用的区别
    • 支持搜索
    • tree方式,可以清楚看到分布
    • 可以查看pg对象数目
    • 可以查看osd上面有哪些pg,主机上有哪些osd

    总结

    通过ceph osd tree可以查到整个的信息,但是一个屏幕的信息量有限,而通过滚屏或者过滤进行查询的信息,需要做一下关联,而这种可以缩放的svg位图的方式,可以包含大量的信息,如果是做分析的时候还是能比较直观的看到,上面的难点在于获取数据部分,而绘图的部分是直接用的现有的处理,比自己重新开发一个要简单的多,类似的工具还有个桑基图方式,这个在inkscope这个管理平台里面有用到

    本篇就是在最小的视野里容纳尽量多的信息量一个实例,其他的数据有类似模型的也可以做相似的处理

    变更记录

    Why Who When
    创建 武汉-运维-磨渣 2017-07-18
  • 相关阅读:
    软件测试第五次作业
    第四次博客作业(第一题)
    实验二
    安全开发
    代码审计入门
    破壳笔记-渗透测试
    Libra的思考
    深度学习构建视频人脸识别模型
    tensorflow
    数据结构(长期)
  • 原文地址:https://www.cnblogs.com/zphj1987/p/13575451.html
Copyright © 2011-2022 走看看