Ceph-blkin+lttng+zipkin性能追踪工具




部署

参考:
– http://docs.ceph.com/docs/master/dev/blkin/
– https://zipkin.io/pages/quickstart.html
– https://github.com/openzipkin/zipkin/blob/master/zipkin-server/README.md#cassandra-storage
– https://github.com/openzipkin/zipkin/tree/master/zipkin-storage/mysql-v1
– https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
– http://cassandra.apache.org/download/
– https://blog.csdn.net/vbirdbest/article/details/77802031

环境要求

  1. ceph-luminous版本编译环境
  2. Debian9.1 + 4.9.65内核
  3. 已部署好ceph集群

部署ceph+blkin

步骤

  1. 修改do_cmake.sh,在cmake那行加上”-DWITH_BLKIN=ON”打开blkin编译选项
  2. ./do_cmake.sh; cd build; make; make install
  3. 修改ceph.conf,打开blkin相关配置项:

部署babeltrace-zipkin

这个项目的用途是把blkin配合lttng收集的trace数据转换并发送给zipkin的数据采集器,zipkin聚合后存储起来供后续web查询使用。

步骤

  1. git clone https://github.com/vears91/babeltrace-zipkin
  2. cd babeltrace-zipkin/setup; 找到 ubuntu.sh,注意这个脚本里面会安装依赖包,以及编译并安装blkin-lib,下载zipkin.jar,最后还会git pull更新下babeltrace-zipkin,由于github clone项目时快时慢,因此建议直接在PC上下载项目的压缩包,单独手工安装,这个很快
  3. 提取出ubuntu.sh里面的pip3 install和apt-get install相关命令,直接手工安装即可

部署lttng

直接apt安装即可:

安装完毕后有如下几个包:

具体哪几个有用我也不完全确定,lttng-tools这个肯定用到的,lttng-modules-dkms这个内核态的应该用不到,ceph都是用户态的。

部署zipkin

zipkin部署非常简单,只需要有jre环境,就可以通过下载可独立执行的zipkin.jar包即可运行。最新稳定版下载链接:
– https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec

zipkin的存储后端有多种:
– memory(默认):内存存储,非持久化,重启zipkin进程后数据丢失,需要重新导入
– MySQL:不解释
– Cassandra(官方推荐,最初支持的方案):个人理解是一种类似influxdb的时序数据库
– Elasticsearch:参考官网介绍,是一个分布式、RESTful 风格的搜索和数据分析引擎

我这边验证了前面3种方式,因此需要增加部署MySQL(mariadb)或者Cassandra数据库。

memory方式

直接执行java -jar zipkin.jar即可,web端口默认是9411,浏览器打开http://$IP:9411即可访问zipkin web页面。

注意内存方式下trace数据是非持久化的,重启后丢失。

mariadb方式

部署mariadb:
1. 使用apt安装包:apt-get install mariadb-common mariadb-server
2. 创建用户并添加权限(默认的root用户会连接失败):GRANT ALL PRIVILEGES ON *.* TO 'zipkin'@'%' IDENTIFIED BY 'admin123' WITH GRANT OPTION; FLUSH PRIVILEGES;
3. 创建数据库和schema:直接使用官方的sql脚本创建,https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql ,保存脚本到zipkin.sql并执行mysql -Dzipkin < zipkin.sql
4. 如果数据库和zipkin不在一个节点上,还需要修改mariadb的监听地址段并重启服务,/etc/mysql/mariadb.conf.d/50-server.cnf的bind-address配置项

启动zipkin+mariadb:STORAGE_TYPE=mysql MYSQL_USER=zipkin MYSQL_HOST=127.0.0.1 MYSQL_PASS=admin123 java -jar zipkin.jar

相关环境变量:https://github.com/openzipkin/zipkin/blob/master/zipkin-server/README.md#mysql-storage

导入数据后,可以用mysql命令查看数据:

Cassandra方式

部署Cassandra:

启动及相关默认路径:

时序数据库一般不需要特殊的schema配置,直接使用即可:STORAGE_TYPE=cassandra3 java -jar zipkin.jar

导入数据后可以用cqlsh命令查看数据库内容:

参考官网:http://cassandra.apache.org/download/

最终部署架构

ceph-blkin-zipkin

使用

  1. 确保lttng服务正常运行:systemctl status lttng-sessiond.service
  2. 停止ceph服务,包括所有服务端进程以及客户端进程(如果是客户端与服务端不再一个节点,也要单独部署lttng和使用打开了blkin的ceph)
  3. 创建lttng session,并添加trace event:

  1. 启动所有ceph进程,以及客户端进程,并进行相关测试
  2. lttng stop停止session,其他可用命令:lttng list/status/view/destroy
  3. 使用babeltrace-zipkin工具导入数据到zipkin:cd /mnt/babeltrace-zipkin-master/; python3 babeltrace_zipkin.py ~/lttng-traces/blkin-wp2-20181218-160516/ust/uid/0/64-bit/ -p 9411 -s 127.0.0.1,其中-p 9411是zipkin的数据接收端口(也是web端口),-s是zipkin服务监听地址。数据导入过程比较耗时,需要等待,开始导入和导入完成都会有日志提示:

  1. 导入过程中如果出错可以查看zipkin的日志(前台执行的话看控制台输出就可以了)。
  2. 使用web进行数据查询:浏览器打开http://$IP:9411即可访问zipkin web页面。需要注意的是,查询页面的时间参数是指lttng日志文件里的采集时间,而非数据导入到zipkin的时间,另外还要注意数量参数,经过实测仅搜索指定数量的trace event数据,然后对这些数据进行排序后展示,而不是对所有数据排序后进行截取展示,因此建议时间采用自定义时间段方式,缩小时间段,减少数据量之后再适当设置较大的数量进行查找。

zipkin

zipkin

自定义扩展

相关名词

  1. trace event:跟踪事件类型如zipkin:timestamp、zipkin:keyval_integer、zipkin:keyval_string
  2. service:跟踪服务类型如osd.1、pg 1.0、messenger、objecter、librbd-855346e482f5-test-blkin-vol1等,对应代码中的trace_endpoint,ZTracer::Endpoint类型
  3. span:service的子项,标记一个跨度,跨函数使用,例如librbd里面有多个跨度,从ImageRequestWQ的“wq: write”到“writeback”等,osd默认只有一个“osd op”,pg有“pg op”和“replicated op”,对应代码中的osd_trace、pg_trace、journal_trace等,ZTracer::Trace类型,可以用ZTracer::Trace::init函数来初始化,通过在初始化时指定parent span来构建调用链关系,parent可以跨service,顶级span的id跟traceId相同,可以理解为第一个span的ID就是traceId
  4. annotation:span的子项,基本上是在同一个函数里面使用,ZTracer::Trace::event即可创建

参考:https://blog.csdn.net/manzhizhen/article/details/52811600、https://blog.csdn.net/manzhizhen/article/details/53865368

ceph扩展相关trace类型

service类型一般不需要扩展,已经基本全部包含了,这里重点介绍span和annotation两种类型的扩展方法。
span:

src\common\TrackedOp.h::class TrackedOp类里有如下定义:

我们只需要模仿它们来定义我们自己的span名称即可。

src\osd\OSD.cc::void OSD::ms_fast_dispatch(Message *m)中会对osd_trace进行初始化,可以参考他的初始化过程来初始化我们自己的span:

实际上我们需要扩展span的场景也很少,因为这几个span已经差不多可以包含所有关键流程了。

扩展完span就可以通过往span中添加annotation来进行实际的时间戳记录了,添加annotation也非常简单:

keyval类型的annotation可以用来观察系统运行过程中某些关键变量的值,如关键运行参数等。