最近在做OpenStack Cinder driver的性能调试, 之前一直是通过在driver里面加入decorator,完成driver各个接口的执行时间的统计。

其实在openstack,已经在孵化一个叫osprofiler的project,然后这个可以通过与OpenStack Ceilometer的集成,可以轻松完成性能数据的统计,大幅的节省性能调优的时间.

  • osprofiler原理:

通过在OpenStack不同Component之间使用osprofiler的trace,记录所有的wsgi,rpc,driver各个接口的开始和结束时间,然后通过rpc message把记录到的数据发送到Ceilometer数据库进行存储。

这样用户可以在执行完OpenStack的操作后,通过osprofiler的CLI接口,以html或者JSON的格式可视化的显示出各个接口的执行顺序和时间,从而发现一个call stack的瓶颈。

更多关于osprofier可以参见https://github.com/stackforge/osprofiler

[NOTE]: 有网友反映和本人自己的实验,在最新的master branch上,不能正确产生正确的osprofiler数据,error如下:

[待增加]

解决方案是使用kilo版本:

cd ~/devstack
# 保存当前的change
git stash
git checkout stable/kilo
# 重新应用change
git stash pop
# 其他配置保持不变
# 让后在./stack.sh ./stack.sh #升级python-cinderclient,安装python-ceilometerclient
sudo pip install python-cinderclient --upgrade
sudo pip install python-ceilometerclient
  • 基本的使用:
from osprofiler import profiler
# 使用前,一定要init,否则不会用任何的数据记录
profiler.init("SECRET_HMAC_KEY", base_id='sadfsdafasdfasdfas', parent_id='dsafafasdfsadf')
def some_func():
profiler.start("point_name", {"any_key": "with_any_value"})
# your code
print "I am between some_func"
profiler.stop({"any_info_about_point": "in_this_dict"}) @profiler.trace("point_name",
info={"any_info_about_point": "in_this_dict"},
hide_args=False)
def some_func2(*args, **kwargs):
# If you need to hide args in profile info, put hide_args=True
print "Hello, osprofiler"
pass def some_func3():
with profiler.Trace("point_name",
info={"any_key": "with_any_value"}):
# some code here
pass @profiler.trace_cls("point_name", info={}, hide_args=False,
trace_private=False)
class TracedClass(object): def traced_method(self):
print "Trace me"
pass def _traced_only_if_trace_private_true(self):
pass
# 把所有的记录写入到json文件里面
def send_info_to_file_collector(info, context=None):
with open("traces", "a") as f:
f.write(json.dumps(info)) notifier.set(send_info_to_file_collector)
# 下面的函数调用都会被一一记录
some_func()
some_func2(test='asdfasdf', adf=313) trace = TracedClass()
trace.traced_method()

然后,你在当前目录的 traces 文件问发现很多的log,有个问题数据的可读性比较差,那么OpenStack是怎么解决的呢?

答案是配合使用 Ceilometer. 关于Ceilometer,参考它的框架,可以帮助理解http://docs.openstack.org/developer/ceilometer/architecture.html#high-level-architecture

下面以lvm 的cinder driver为例,说明如何配置Cinder,osprofiler以及Ceilometer的集成,,

(注意,我enable了Ceilometer和Neutron的所有组件,在使用这个文件时,要把HOST_IP, SERVICE_HOST改为本机的IP

[[local|localrc]]
HOST_IP=192.168.14.128
SERVICE_HOST=192.168.14.128
ADMIN_PASSWORD=welcome
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD
DEST=/opt/stack
LOGFILE=$DEST/logs/stack.sh.log
SCREEN_LOGDIR=$DEST/logs/screen
OFFLINE=False
RECLONE=False
LOG_COLOR=False
disable_service horizon
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
enable_service neutron
# Enable the ceilometer metering services
enable_service ceilometer-acompute ceilometer-acentral ceilometer-anotification ceilometer-collector # Enable the ceilometer alarming services
enable_service ceilometer-alarm-evaluator,ceilometer-alarm-notifier # Enable the ceilometer api services
enable_service ceilometer-api
# 这个profiler一定要加,是cinder的性能信息记录到Ceilometer的关键
CEILOMETER_NOTIFICATION_TOPICS=notifications,profiler
disable_service n-net
disable_service tempest
disable_service h-eng,h-api,h-api-cfn,h-api-cw
PHYSICAL_NETWORK=physnet1
FIXED_RANGE=192.168.106.0/
FIXED_NETWORK_SIZE=
NETWORK_GATEWAY=192.168.106.1
[[post-config|$CINDER_CONF]]
[profiler]
profiler_enabled = True
trace_sqlalchemy = False
[[post-config|/$Q_PLUGIN_CONF_FILE]]
[ml2]
tenant_network_types = vlan [ml2_type_vlan]
network_vlan_ranges = physnet1:: [ovs]
bridge_mappings = physnet1:br-eth1
enable_tunneling = False

然后就是执行 ./stack.sh

  • 产生与收集Cinder操作的性能数据:
peter@ubuntu:~/devstack$ cinder --profile SECRET_KEY create --name peter
+---------------------------------------+--------------------------------------+
| Property | Value |
+---------------------------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| consistencygroup_id | None |
| created_at | --04T14::51.000000 |
| description | None |
| encrypted | False |
| id | --445d-a60b-3b91295c31e8 |
| metadata | {} |
| multiattach | False |
| name | peter |
| os-vol-host-attr:host | None |
| os-vol-mig-status-attr:migstat | None |
| os-vol-mig-status-attr:name_id | None |
| os-vol-tenant-attr:tenant_id | ade7584debc54964b4fef737e56e062d |
| os-volume-replication:driver_data | None |
| os-volume-replication:extended_status | None |
| replication_status | disabled |
| size | |
| snapshot_id | None |
| source_volid | None |
| status | creating |
| user_id | 56aac792735046dea02e12e85e0d1a03 |
| volume_type | lvmdriver- |
+---------------------------------------+--------------------------------------+
Trace ID: aa4903cc-fd0c-42ef-96f1-bd1c5a1740f1
To display trace use next command:
osprofiler trace show --html aa4903cc-fd0c-42ef-96f1-bd1c5a1740f1
  • 导出性能测试的数据为HTML格式
osprofiler trace show --html aa4903cc-fd0c-42ef-96f1-bd1c5a1740f1 --out test.html

html内容如下(需要翻墙,这个页面需要访问google.com ^_^)

  • 查看各个接口的执行时间,下图给出了每个被统计的接口在不同的service之间的执行时间

  • 查看接口的参数,可以点击函数,查看具体的参数

上面的view可以很轻松的实现对openstack各个接口调用执行时间的统计,可视化的显示了特定操作的性能瓶颈在哪里。

  • Cinder driver的各个接口的性能统计:

上面的工作,还有一个问题没有解决,如果你的driver其实有多个层级的class(如driver.create_volume->AnotherClass.def1->AnotherClass.def2->AnotherClass.defn),那么我只知道入口函数driver.create_volume的执行时间,并不知道在AnotherClass内部各个接口的执行时间(def1多少时间,def2多少时间。这个就要稍微改下lvm driver的代码了,可以为lvm driver的所有class 加上如下的decorator:

@profiler.trace_cls("AnotherClass", info={}, hide_args=False,
trace_private=True)
class AnotherClass(object):
def def1:
pass def def2:
pass

这样更改代码后,然后再重启cinder service,你会得到更详细的数据


 参考文章及深入阅读:

osprofiler在openstack Cinder里的使用的更多相关文章

  1. OpenStack Cinder 与各种后端存储技术的集成叙述与实践

    先说下下loop设备 loop设备及losetup命令介绍 1. loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们 ...

  2. OpenStack Cinder源代码流程简析

    版权声明:本博客欢迎转载,转载时请以超链接形式标明文章原始出处!谢谢! 博客地址:http://blog.csdn.net/i_chips 一.概况 OpenStack的各个模块都有对应的client ...

  3. OpenStack Cinder组件支持的块存储设备表

    摘自恒天云官网:http://www.hengtianyun.com/download-show-id-18.html OpenStack的Cinder组件底层可以连接多种存储设备和方案,每一个Ope ...

  4. 八、OpenStack—Cinder组件安装

    一.安装和配置控制器节点 1.先决条件 1)创建数据库 # mysql -u root -p 2)创建cinder数据库 MariaDB [(none)]> CREATE DATABASE ci ...

  5. 【OpenStack Cinder】Cinder安装时遇到的一些坑

    最近需要安装Cinder组件,然后遇到了两个比较蛋疼的错误导致controller节点输入cinder service-list一直不能显示cinder节点上的cinder-volume服务. 错误1 ...

  6. openstack——cinder服务篇

    一.cinder 介绍:     理解 Block Storage 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文 ...

  7. OpenStack Cinder发展动态系列--Austin峰会

    在Mitaka版本,Cinder团队在多个特性和领域取得了重大进展. 本文将做一个简要的介绍:关于在Mitaka版本已经完成的功能和特性,以及讨论在Newton版本将会开发的功能和特性. 1 Cind ...

  8. ceph集成openstack cinder

    本环境ceph已经搭建,ceph搭建麻烦见本博客的其他文章 1 在cinder-volume节点安装ceph client yum install -y ceph-common 注意:glance要安 ...

  9. OpenStack (cinder存储服务)

    cinder简介 提供 OpenStack 存储块(Volume)服务,该管理模块原来也为 Nova 的一部分,即 Nova-volume,后来从 Folsom 版本开始使用 Cinder 来分离出块 ...

随机推荐

  1. Flex中处理多点触摸和手势

    在Flex中多点触摸和手势都需要利用Multitiouch类来完成:1.supportsGestureEvents:判断是否支持手势2.supportsTouchEvents:判断是否支持多点触摸可以 ...

  2. HTML5 & CSS3初学者指南(3) – HTML5新特性

    介绍 本文介绍了 HTML5 的一些新特性.主要包含以下几个方面: Web 存储 地理位置 拖放 服务器发送事件 Web存储 HTML5 Web 存储的设计与构想是一个更好的机制来存储客户端的网络数据 ...

  3. Windows 10 IoT Core环境配置中的那些坑

    我使用的设备是Raspberry Pi 3B,想来国内的嵌入式玩具应该还是树莓派最常见吧.这段时间一直在捣鼓Win10 IoT,结果发现,从安装一直到编码调试一路下来全都是坑.写这篇东西一个是为了备忘 ...

  4. 快速实现python c扩展模块

    1  python扩展模块的组成 在python中,对于一些和系统相关的模块或者对性能要求很高的模块,通常会把这个模块C化.扩展模块中主要包含下面几个部分: init函数,函数名为:init+模块名, ...

  5. react构建淘票票webapp,及react与vue的简单比较。

    前言 前段时间使用vue2.0构建了淘票票页面,并写了一篇相关文章vue2.0构建淘票票webapp,得到了很多童鞋的支持,因此这些天又使用react重构了下这个项目,目的无他,只为了学习和共同进步! ...

  6. Centos 7安装oracle 11g R2问题及解决方法汇总

    自己新博客的链接:http://www.pythonsite.com/2017/02/14/centos-7%E5%AE%89%E8%A3%85oracle-11g-r2%E9%97%AE%E9%A2 ...

  7. 手动加支付宝遇到的错误--iOS

    前言 之前调通了支付宝demo,开始往自己工程拖东西吧,我为什么觉得我可能把所以的问题都遇到了呢+_+,赶紧把问题记录下来 不然下次弄还费劲,加一句,要不真的用ping++吧

  8. C语言memset学习

    #include <stdio.h> #include <memory.h> ]); //函数声明 void main(){ ]={{,,},{,,},{,,},{,,}};/ ...

  9. 用9种办法解决 JS 闭包经典面试题之 for 循环取 i

    2017-01-06 Tomson JavaScript 转自 https://segmentfault.com/a/1190000003818163 闭包 1.正确的说,应该是指一个闭包域,每当声明 ...

  10. ubuntu ssh-keygen Permission denied

    ubuntu下生成github上的ssh keys,执行: ssh-keygen 直接执行: sudo chown user1:user1 /home/user1/.ssh -R 成功生成.