在分析ceph性能的时候,发现OSD处理线程等待PG lock
的时间比较长,当时就想能不能像ceph perf counter一样,统计下PG lock
上的等待时间?(后来分析代码知道了PG lock
互斥的原因:Ceph PGLock and RWState)
虽然最后证明这样的办法不可靠,不方便分析,但本次尝试也给出了在ceph代码中添加tracepoint
的方法和步骤,记录如下;
ceph perf counter
现在ceph系统支持perf counter统计mutex花费的时间
1 | OPTION(mutex_perf_counter, OPT_BOOL, false) |
这个能统计出一段时间内所有mutex lock花费的时间,但是不能显示具体某一个mutex lock的花费时间。
mutex添加tracepoint
添加tracepoint到mutex实现中,通过tracepoint log来分析具体某一个mutex lock的花费时间。
src/tracing目录添加对应的mutex.tp文件
1 | #include "include/int_types.h" |
修改src/common/Mutex.cc文件
添加:
1 | #ifdef WITH_LTTNG |
修改src/tracing/Makefile.am文件
1 | 14d13 |
修改src/Makefile-env.am文件
1 | 添加: |
修改src/common/Makefile.am文件
添加:
1 | if WITH_LTTNG |
修改src/test/Makefile.am文件
添加:
1 | if WITH_LTTNG |
修改PG lock
添加PG lock的perf counter统计。
修改:
1 | PG::PG(OSDService *o, OSDMapRef curmap, |
编译测试
最终编译出来的安装包中,rbd命令不能执行,报以下错误:
1 | # rbd |
上述问题是PG lock的命名重复导致的,可以先忽略,ceph是能正常工作的,也能通过lttng搜集出来mutex log的trace;
但是因为mutex太多地方用到,这个log太多了,没办法分析,需要寻求别的方法追踪PG lock。