一、Ceph磁盘流量统计实现方法
Ceph提供perf counters统计工具(src/common/perf_counters.h)方便各个模块(块设备客户端、文件系统客户端、对象存储网关客户端等)调用。
Perf counters主要提供6种统计器,需使用PerfCountersBuilder提供的方法生成,包括:整数单值记录(add_u64)、整数总数统计(add_u64_counter)、整数平均值统计(add_u64_avg)、整数条形图统计(add_u64_counter_histogram)、时间单值记录(add_time)、时间平均值统计(add_time_avg)。
每次请求完成时,客户端调用以上统计器提供的数据更新方法,对统计指标进行更新。
此外, PerfCounters提供dump_formatted方法,可对所有统计值进行统一的格式化输出。
目前Ceph的块设备客户端对读写请求的统计指标主要如下:读写请求总字节数,读写请求总次数、总时延、平均时延。
块设备客户端的所有统计指标在src/librbd/Types.h中定义,统计器在src/librbd/ImageCtx.h的perf_start方法中调用PerfCountersBuilder提供的方法生成。块设备客户端以单个块设备为单位对以上指标分别进行统计。
在ceph.conf配置文件的client域,配置admin socket参数指定socket文件路径,然后通过以下命令可打印以JSON格式呈现的时延统计信息:
# ceph --admin-daemon <socket_file> perf dump
相关代码实现在src/common/ceph_context.cc中。
在ceph.conf配置文件的client域,配置log file参数指定日志文件路径,配置debug rbd参数指定日志级别(建议设置为5)。
代码中调用ldout方法(在src/common/dout.h中定义)可指定日志级别进行日志输出。
二、Qemu磁盘流量统计实现方法
Qemu并没有一个公共的统计工具,对于访问块设备的请求,在block/accounting.h中进行统计,每次请求完成时,在block_account_one_io方法中对统计指标进行更新。
此外,在block/accounting.h中并未提供公共的方法对所有统计值进行格式化输出。
目前qemu对读写请求的统计指标主要如下:读写请求总字节数,读写请求总次数、总时延(平均时延可通过计算得到)。此外,通过QMP命令进行设置,可支持按时延区间的读写请求数统计(命令为x-block-latency-histogram-set,参数包括块设备名称以及区间边界)。
Qemu的所有统计指标在block/accounting.h中的BlockAcctStats结构体中定义,Qemu同样以单个块设备为单位对以上指标分别进行统计。
Qemu提供QMP命令方式对指标进行访问,命令为query-blockstats(连接Qemu Monitor的socket文件可能被libvirtd占用,对于通过libvirt启动的Qemu虚拟机,通过QMP命令进行指标访问,需要通过停止libvirtd服务或其它方式释放对socket文件的占用),代码实现在block/qapi.c的qmp_query_blockstats方法中。
Qemu日志路径通过命令行参数指定(对于通过libvirt启动的Qemu虚拟机,日志路径在libvirt中指定,默认在/var/log/libvirt/qemu目录下)。
在代码中,打印日志的方法定义在util/qemu-error.c中,可使用info_report、warn_report、error_report打印不同级别的日志。