使用gdbprof分析工具,进行Ceph性能调优

原文链接:https://my.oschina.net/u/3011935/blog/1486159

作者简介
    阿里巴巴存储专家,Ceph member,专注于分布式存储的性能调优。

1. gdbprof工具介绍
    gdbprof,是一款基于系统时间(而非cpu事件)的性能分析工具。它是基于python实现的,中间用到了gdb的python api(具体参考[1])。具体代码位置为: https://github.com/markhpc/gdbprof 该代码存在一些小的bug,以及易用性的问题,所以我fork了一份,并且做了部分优化,推荐大家clone我修改后的:
https://github.com/liupan1111/gdbprof

2. 工具的优点
    相比于perf[2],gprof等工具,具有如下优点:
1) 基于系统时间。对于Ceph这种io密集型的存储软件,系统时间可以更好的看出程序的状态,如io等待,网络拥塞等等。
2) 分线程统计,每次会输出所有各个线程的性能统计信息。最终性能的瓶颈,未必来自于整体cpu利用率,可能会是某几个线程,cpu利用率接近90%,甚至更多。这种情况下,该线程就成了瓶颈。
3) 代码开源,实现简单。代码只有一个gbdprof.py,200多行code。用户完全可以根据自己的需求,直接修改。

3. 使用方法
1) 把需要分析的进程,启动起来。此处我们以ceph-osd为例。
2) sudo gdb -ex ‘set pagination off’ -ex ‘attach <pid>’ -ex ‘source /home/ubuntu/src/markhpc/gdbprof/gdbprof.py’ -ex ‘profile begin’ -ex ‘quit’ 其中,请把<pid>换成实际的pid值
3) 脚本运行到一定时间(2000秒),会自动退出,然后打印出结果。不要使用ctr+c之类的中断退出。 如果想修改运行时间,可以修改代码: 输入图片说明

4. 结果展示
    截取了Thread 42的统计: ![![![输入图片说明](https://static.oschina.net/uploads/img/201707/24123921_bAqw.png "在这里输入图片标题")](https://static.oschina.net/uploads/img/201707/24123921_bAqw.png "在这里输入图片标题")](https://static.oschina.net/uploads/img/201707/24123921_bAqw.png "在这里输入图片标题")
可以看到,pthread_cond_wait,占据了samples的91%,验证了确实统计的是系统时间。

5. 原理说明
    gdbprof也是基于sampling的方式进行性能统计的。每个period(默认为0.1秒),给gdb发送sigint信号,然后循环每个thread,根据该thread的call trace,统计函数的调用情况。 例如,下图为Thread 0中,从TOP开始的调用关系,括号为该函数自己(不包含子函数)的sample数量:

所以:
A的总sample = A(3) + C(5) + D(3)= 17
B的总sample = B(2) + E(4) = 6
TOP的总sample = A的总sample + B的总sample = 17

gdbprof生成的结果图为: 输入图片说明.

6. BlueStore性能分析
    我是用gdbprof,对bluestore使用CPU最多的两个线程进行了分析,发现绝大多数时间都在rocksdb上。如何提升rocksdb相关的性能,是提升整个bluestore性能的关键。结果在链接中:
http://paste.openstack.org/show/615386/

7 结论
    gdbprof该工具后续还会加入更多的统计信息、选项等,欢迎大家提交PR,我们一起来优化这个工具。

Leave a Comment

电子邮件地址不会被公开。