osprofiler在OpenStack Cinder里的使用

其实在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,参考它的框架,可以帮助理解

下面以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/24 FIXED_NETWORK_SIZE=32 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:100:110 [ovs] bridge_mappings = physnet1:br-eth1 enable_tunneling = False

然后就是执行 ./stack.sh

产生与收集Cinder操作的性能数据:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/267c8193e15df4c9c4fb9c252caa054f.html