OpenStack性能测试工具Rally实践和分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiahaojie1984/article/details/52043274


1       Rally介绍

1.1    概述

Rally是OpenStack社区推出开源测试工具,可用于对OpenStack各个组件进行性能测试。通过使用Rally组件,用户可完成OpenStack云计算平台的安装部署、功能验证、大规模负载测试(性能测试)、输出测试报告等一系列动作。对于我们环境中性能测试来说,由于我们的网络平台和Neutron的API接口基本一致,所以可以直接拿来测试我们的网络平台系统。

以下为官方网站上面的图片,展示了Rally强大的功能:


1.2    应用场景

对于不同的使用场景,Rally在测试中的流程也有所不同,主要支持以下三种场景:

1)  开发测试,可以评估处于开发阶段的OpenStack系统的性能,能够完成安装部署、仿真测试并输出测试结果等一系列动作;

2)  开发运维测试,可以基于现有的OpenStack云平台,对已经安装部署的云平台进行仿真测试并输出测试结果;

3)  CI/CD场景测试,可以将Rally集成到CI/CD系统。

以下为三种主要场景的使用流程:


1.3    架构

Rally内部架构如下:


2       Rally安装

2.1    自动化安装

有多种方式安装Rally组件,如下是官方推荐的3种方法,这三种方法都要求你的安装环境能够访问Internet(如果很不幸,你的环境不能访问外网,请查看下2.2小节):

1.      自动化独立安装

这个是全自动化,省事省力,如下命令即可搞定,如果是缺少什么软件,会自动下载安装。

wget -q -O-https://raw.githubusercontent.com/openstack/rally/master/install_rally.sh |bash

# or using curl

curlhttps://raw.githubusercontent.com/openstack/rally/master/install_rally.sh |bash

安装完成后,执行以下命令构建rally数据库:
rally-manage db recreate

2.      和DevStack allinone一起安装

git clonehttps://git.openstack.org/openstack-dev/devstack

git clonehttps://github.com/openstack/rally

cd devstack

cp samples/local.conflocal.conf

编辑local.conf文件,在[[local|localrc]]段里面新增如下行:

enable_plugin rally https://github.com/openstack/rally master

之后执行:

./stack.sh

3.      使用Docker方式安装

docker build -t myrally .

sudo mkdir/var/lib/rally_container

sudo chown 65500 /var/lib/rally_container

docker run -it -v/var/lib/rally_container:/home/rally rallyforge/rally

 

如有疑问,可查阅官方安装文档:

https://rally.readthedocs.io/en/latest/install.html

2.2    源码安装

如果安装环境不能访问外网环境,那么只能采用手工方式进行源码安装了,这种方式费时费力,经常会遇到莫名其名的坑,但是一步步排雷下来,相信会对系统有更深的理解。以下是源码安装过程:

1.      首先下载一份Rally源码(我用的是Rally-0.4.0),将源码拷贝到安装机器上面;

2.      修改pbr/packaging.py文件(等安装完成后再修改回来)

vim/usr/lib/python2.7/site-packages/pbr/packaging.py

在get_version函数中新增如下代码(红色字体):

    if version:

        return version

    return '0.4.0'   #我使用了rally的0.4.0版本

    raise Exception("Versioning for thisproject requires either an sdist"

                    " tarball, or accessto an upstream git repository."

                    " Are you sure thatgit is installed?")

3.      安装sphinx软件(可使用yum內源方式安装或者rpm安装)

yum install *sphinx

yum install subunit*

4.      进入rally源码目录,可看到里面有setup.py文件,执行如下命令:

cd rally-0.4.0/

python setup.py install

5.      为rally新建mysql数据库

mysql -u root -proot -e"CREATE DATABASErally;"

mysql -u root -proot -e"GRANT ALL PRIVILEGES ON rally.* TO 'rally'@'localhost' IDENTIFIED BY'rally';"

mysql -u root -proot -e"GRANT ALL PRIVILEGES ON rally.* TO 'rally'@'%' IDENTIFIED BY'rally';"

6.      为rally生成alembic

cd /usr/lib/python2.7/site-packages/rally/common/db/sqlalchemy

alembic init alembic

vim alembic.ini  #编辑配置文件,修改如下行:

sqlalchemy.url =mysql://rally:rally@localhost/rally

7.      修改rally的配置文件,添加数据库访问路径

vim /etc/rally/rally.conf

[database]

connection =mysql://rally:rally@10.25.49.2/rally

8.      初始化rally数据库

rally-manage  db recreate

9.      验证rally命令是否调用成功,可以发现安装的版本是0.4.0

[root@control home]# rally--version

No handlers could be foundfor logger "oslo_config.cfg"

0.4.0

3       Rally使用

下面介绍常用的Rally命令。

3.1    创建Deployment

   如果要测试已存在的OpenStack系统,则在创建deployment直接导入环境变量即可,如果测试的OpenStack不存在,需要在创建Deployment时安装部署一套openstack,这需要配置deployment engine。我是对已经安装好的NSP进行测试,因此没有配置deployment engine.

   对于已经安装部署了OpenStack系统,有两种方式创建deployment:

1)  使用环境变量创建

rally deployment create --fromenv--name=existing

环境变量中需要存在如下变量:

    OS_USERNAME

    OS_PASSWORD

    OS_AUTH_URL

    OS_TENANT_NAME

    OS_ENDPOINT

    OS_REGION_NAME

    OS_CACERT

       OS_INSECURE

其实执行openstack各个组件都需要环境变量,如果能够执行nova/neutron等命令没有错误说明已经包含了要求的环境变量,如果执行失败,需要导入你自己的环境变量,以下是我的环境变量文件:

[root@control home]# cat /root/admin-openrc.sh

export OS_PROJECT_DOMAIN_ID=default

export OS_USER_DOMAIN_ID=default

export OS_PROJECT_NAME=admin

export OS_TENANT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=****

export OS_AUTH_URL=http://10.25.*.*:35357/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

执行. /root/admin-openrc.sh就可以将环境变量导入。

2)  使用json文件创建

rally deployment create--file=existing.json --name=existing

    existing.json文件内容如下:

{

    "type":"ExistingCloud",

    "auth_url": "http://10.25.*.*:35357/v3",

    "region_name":"RegionOne",

    "endpoint_type":"public",

    "admin": {

        "username":"admin",

        "password": "****",

        "tenant_name": "admin"

    },

    "users": [

        {

            "username": "nsp_test_1",

            "password":"password",

            "tenant_name":"nsp_tenant_1"

        },

        {

            "username":"nsp_test_2",

            "password":"password2",

            "tenant_name":"nsp_tenant_2"

        }

    ]

}

3.2    检查deployment

可检查创建的deployment各项服务是否正常,以下是执行结果

[root@controlrally_test]# rally deployment check existing


查看所有的deployment列表

[root@controlrally_test]# rally deployment list


查看已创建的deployment的详情

[root@controlrally_test]# rally deployment show existing


当存在多个deployment时,可以使用命令查看当前active的deployment,并切换deployment,如下:

    [root@control rally_test]# rally deploymentuse 25ee44af-9347-49c0-8ec9-ac9c2fbb94bb

3.3    执行Task

Task是Rally执行的一个测试单元,执行Task时需要指定入口文件,可以是json文件或者yaml文件,如下可执行一个task:

[root@control rally_test]# rally  task start nsp_test/yaml_files/network/create.yaml

其中create.yaml内容如下:

[root@control rally_test]# catnsp_test/yaml_files/network/create.yaml

 NSPNetworks.create_and_list_networks:

    -

      args:

       network_create_args: {}

        network_vlan_start:600

      runner:

        type:"constant"

        times:100

       concurrency: 10

      context:{}

NSPNetworks是新增的针对NSP性能测试的类,create_and_list_networks是该类的一个函数,args是函数需要的参数,runner中定义了运行过程参数,context定义了使用的用户数、租户数等信息,这个例子context为空,这是因为使用了预先定义好的用户和租户。

如下的例子展示了context不为空的情况,这个时候用户和租户都是在测试过程中Rally临时创建的,等测试结束后会自动删除。

  NSPNetworks.create_and_delete_networks:

    -

      args:

        network_create_args: {}

        network_vlan_start: 600

      runner:

        type: "constant"

        times: 10

        concurrency: 3

      context:

        users:

          tenants: 1

          users_per_tenant: 1

        quotas:

          neutron:

            network: -1

   上面这些例子是针对NSP定制的,引入了network_vlan_start参数,初学者也可参考原生的rallytask实例,位于rally安装包中(路径:rally-0.4.0/samples/tasks/scenarios/)。

 Task执行完成后,会打印出执行结果信息,如下:

 

3.4    查看Task

可使用rally  task list  [task_id],来列出已经执行的task:


可以指定task  id进行查看执行的结果:

    [root@controlrally_test]# rally task results 93aa3f32-7c70-4791-9010-ea6361e483b4

3.5    生成Web测试报告

使用rally task report[task_id] --out=[outfile.html]可以生成web格式的测试报告,如下:

[root@controlhtml_report]# rally task report93aa3f32-7c70-4791-9010-ea6361e483b4 --out=report.html

上面的命令执行成功,可以看到生成的Html文件,在浏览器中可查看Html文件。展示效果如下:


查看web报告问题错误排查:

在查看测试报告文件时,遇到了一个奇怪的现象,我发现在公司电脑上面打不开report.html文件,但是在另外一个同事Mac电脑上面却可以正常打开。后来我在家里用个人电脑上查看report.html文件,发现当打开翻墙功能就可以查看,但是关闭翻墙功能就不能正常查看。于是查看html源代码,发现report.html文件中使用了一些css、js库,而这些库放在了google网站上,因此才会出现这么奇怪的现象。

需要将report.html里面如下四行中的libs网址:

  <link rel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.1.15-beta/nv.d3.min.css">

  <script type="text/javascript"src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular.min.js"></script>

  <script type="text/javascript"src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.13/d3.min.js"></script>

  <script type="text/javascript"src="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.1.15-beta/nv.d3.min.js"></script>

替换为可以访问的bootcss静态库的libs网址,如下:

  <link rel="stylesheet"href="http://cdn.bootcss.com/nvd3/1.1.15-beta/nv.d3.css">

  <script type="text/javascript"src="http://cdn.bootcss.com/angular.js/1.3.3/angular.min.js"></script>

  <script type="text/javascript"src="http://cdn.bootcss.com/d3/3.4.13/d3.min.js"></script>

  <script type="text/javascript"src="http://cdn.bootcss.com/nvd3/1.1.15-beta/nv.d3.min.js"></script>

之后就可以打开了。或者直接将report.html模板文件的对应行修改掉,这样生成的报告web页面都会自动替换。

模板文件位置:/usr/lib/python2.7/site-packages/rally/ui/templates/task/report.html

4.    Rally测试的局限性

  Rally测试数据主要是根据REST API的请求和响应时间进行统计时间,由于OpenStack的API是异步的,当API返回时,其请求的资源未必真正完成创建,因此Rally没有办法测试出资源从开始创建到最后创建完成整个流程需要的时间。而在我们的场景下,Rally也是只是测试NSP的API响应时间,无法测试出NSP给Service-engine下发消息的时间,也无法测试出Service-engine组件调用AC 接口创建相关网络资源的时间。

   从改善用户体验角度来说,测试API的响应时间非常关键,科学研究表明,对于一个人机交互系统来说,用户等待时间 >4s而不给任何响应则会给人的体验非常差。从这个意义上来说,Rally的测试非常有必要,也很有价值。但是API返回结果,未必意味着用户的资源已经准备好,从整个流程的优化来看,还需要统计出Service-engine组件调用AC 接口创建相关网络资源的时间,这是下一步的工作。


(本文由jiahaojie完成,欢迎各位专家交流分享)

阅读更多

没有更多推荐了,返回首页