Ceph内建辅助工具实践




admin socket

client及server、osd及mon

创建流程

注册命令hook函数

线程创建及启动

命令处理

功能用途

查询版本/配置项信息/限流/性能计数器数据/reopen log/dump log/dump_mempools/dump_objectstore_kv_stats/dump_historic_ops等

使用场景举例:

Paxos耗时监控

peering耗时监控

overflow巡检脚本

修改配置项

单实例配置项修改

实现:参考上面的admin socket创建注册流程,会有针对config set命令的处理函数。

多实例配置项修改

实现:
在/usr/bin/ceph中检测tell命令的后续参数,如果是指定了target(如osd.0)则直接发送injectargs message给osd.0,由osd进程的tp_osd_cmd线程调用do_command函数对其进行处理(L版本代码流程),之后调用md_config_t::injectargs进行实际的配置项修改,最后handle_conf_change执行配置项修改的side effect相关操作。

如果指定的是osd.*,则先通过mon获取所有osd id列表,然后对每个osd循环执行上面的操作。

性能分析相关

性能概览

ceph osd perf

查看osd的FileStore时延信息

ceph -s

ceph osd pool stat

这些数据是由osd定期上报给mon(OSD::tick->OSD::do_mon_report->OSD::send_pg_stats:m->osd_stat),然后mon直接dump出来即可,不是特别实时。

perf counter

perf counter的初始化过程

代码流程:ceph_osd.cc:main->OSD::init->OSD::create_recoverystate_perf/OSD::create_logger

  • add_u64/add_u64_counter:累加值

  • add_u64_avg:总/平均值

  • add_time:累加值

  • add_time_avg:平均值

perf counter使用方法

perf counter结果获取

举例:peering各阶段耗时、写journal耗时、慢盘检查等

op tracker

op tracker初始化

op事件记录

op事件查看

slow request达到阈值也会打印到日志里。

基于op tracker的slow op日志改进

痛点:op history无法长期保存

解决方法:修改代码,把耗时较长的op history信息持久化到日志文件

2019-04-26 06:25:05.454228 7f0ac2c17700 0 — op tracker — slow op: osd_op(client.544152.0:3674314 rbd_data.2af5f6b8b4567.0000000000000065 [write 961608~4096] 0.8c5714c5 snapc 5=[] ondisk+write+known_if_redirected e57939), start at: 2019-04-26 06:25:05.343005, duration: 0.111196, history: (0ms: initiated) (0ms: queued_for_pg) (0ms: reached_pg) (0ms: started) (0ms: waiting for subops from 1,2) (23ms: commit_queued_for_journal_write) (43ms: write_thread_in_journal_buffer) (38ms: sub_op_commit_rec) (0ms: filestore_queued_op) (0ms: journaled_completion_queued) (0ms: op_commit) (0ms: sub_op_commit_rec) (4ms: commit_sent) (0ms: filestore_do_op) (0ms: filestore_do_op_end) (0ms: op_applied) (0ms: done)

举例:线上IO抖动问题分析

萧山A云主机系统盘util频繁100%性能问题分析过程记录

blkin+lttng

举例:rbd卷读写全链路时延分析

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

tcmalloc支持

ceph tell osd.0 heap start_profiler/dump/stats/release

举例:L版本EC OSD内存占用分析

Ceph CPU&MEMORY profiling

mempool(L版本)

打开debug开关可以dump更详细的信息:

mempool介绍

在src\include\mempool.h头文件里有详细的使用方法介绍。引入mempool的主要目的是统计内存占用情况,绝大部分占用内存的组件或对象都已经加入mempool的管理中。

rocksdb内存及其他统计信息获取(L版本)

需要打开rocksdb_perf配置项才可以使用。

还有rocksdb本身的一些统计信息,都是从rocksdb自身的统计接口里获取的数据。这些信息需要打开rocksdb_collect_memory_stats、rocksdb_collect_extended_stats、rocksdb_collect_compaction_stats配置项。

dump数据流程

异常问题分析相关

signal处理/assert打印调用栈

线程健康状态监控及调用栈打印(当前及其他线程)

Ceph中的信号处理、调用栈打印机制分析

Ceph OSD IO线程健康状态检查机制

valgrind

ceph在teuthology集成了valgrind测试(并且有专门的配置文件:src/valgrind.sup),在跑用例过程中同时监控osd、mon的内存使用情况,发现内存泄露问题可以报出来。

https://blog.dachary.org/2013/08/14/howto-valgrind-ceph-with-teuthology/

crash dump或者正常退出可以打印保存在内存缓冲区的日志

默认内存缓冲区日志级别比较高,可以打印更多日志。

wireshark ceph协议支持

  • https://docs.ceph.com/docs/master/dev/wireshark/
  • https://www.wireshark.org/docs/dfref/c/ceph.html
  • http://aspirer.wang/?p=1312 (第三节:使用tcpdump+wireshark解析Ceph网络包)

rbd客户端

krbd

使用

原理

与rbd-nbd类似,只是把用户态的nbd server转发librbd,改为在内核态直接发送到librbd,相当于实现了一个内核态的librbd client。

注意事项

  • krbd方式需要卷的feature只有layering一个,如含有其他feature则无法映射卷到物理机的块设备
  • 对内核版本有要求,随内核版本更新,更新缓慢,不支持新功能
  • 调试不便

rbd-nbd是为了解决上述问题而开发的。

rbd-nbd

使用

原理

rbd-nbd

注意事项

有一些内核bug:
– nbd设备设置IO超时时间无效
– 4.9.65内核nbd设备+ext4文件系统mount状态resize后端盘大小导致文件系统异常
– 4.9.65内核umount一个断开连接的nbd设备挂载目录导致内核oops

fio支持

rbd

objectstore

fio测试ceph的filestore

对比

fio+librbd与krbd接近,但librbd方式对用户态CPU资源占用较多,rbd-nbd性能稍差

死锁检查

  • 支持mutex、rwlock的死锁检查
  • 可以打印加锁、解锁操作和锁的调用栈
  • 可以记录等待锁的耗时信息

配置项lockdep/lockdep_force_backtrace/mutex_perf_counter

pg锁增加等待耗时统计

throttle限流

查看限流统计信息

throttle使用

缺陷

目前只支持按op数量和大小进行限制,只用在了正常io处理流程,异常恢复等流程还没有实现。

日志相关

日志级别

日志子模块

集群日志

日志回滚

kill -HUP/log reopen

举例:logrotate(reload)

也可以直接使用ceph daemon osd.X log reopen

全链路日志跟踪(优化目标)

痛点:跨节点、跨进程的日志无法串联起来,分析比较困难,需要对IO流程代码非常熟悉

解决方法:参考blkin流程,在日志里增加全局request id,从客户端到osd,以及osd内部的各子模块pg、journal、FileStore等统一使用request id来区分客户端io请求。

数据编解码

ceph-objectstore-tool

Ceph高级工具介绍之ceph-objectstore-tool的使用

ceph-dencoder

Ceph高级工具介绍之ceph-dencoder的使用

在ceph-dencoder中增加修改osd superblock中oldest_map字段功能

安装部署

ceph-deploy

ceph-deploy

crush rule编辑工具

pg balance

Mgr Balancer

开发者工具

vstart

使用vstart搭建ceph开发环境

blackhole开关

异常(延时)注入

kill/error/心跳异常/ms异常/injectdataerr等: