Rally是OpenStack社区推出开源测试工具,可用于对OpenStack各个组件进行性能测试。通过使用Rally组件,用户可完成OpenStack云计算平台的安装部署、功能验证、大规模负载测试(性能测试)、输出测试报告等一系列动作。对于我们环境中性能测试来说,由于我们的网络平台和Neutron的API接口基本一致,所以可以直接拿来测试我们的网络平台系统。
以下为官方网站上面的图片,展示了Rally强大的功能:
对于不同的使用场景,Rally在测试中的流程也有所不同,主要支持以下三种场景:
1) 开发测试,可以评估处于开发阶段的OpenStack系统的性能,能够完成安装部署、仿真测试并输出测试结果等一系列动作;
2) 开发运维测试,可以基于现有的OpenStack云平台,对已经安装部署的云平台进行仿真测试并输出测试结果;
3) CI/CD场景测试,可以将Rally集成到CI/CD系统。
以下为三种主要场景的使用流程:
Rally内部架构如下:
有多种方式安装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
如果安装环境不能访问外网环境,那么只能采用手工方式进行源码安装了,这种方式费时费力,经常会遇到莫名其名的坑,但是一步步排雷下来,相信会对系统有更深的理解。以下是源码安装过程:
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:[email protected]/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
下面介绍常用的Rally命令。
如果要测试已存在的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"
}
]
}
可检查创建的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
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执行完成后,会打印出执行结果信息,如下:
可使用rally task list [task_id],来列出已经执行的task:
可以指定task id进行查看执行的结果:
[root@controlrally_test]# rally task results 93aa3f32-7c70-4791-9010-ea6361e483b4
使用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网址:
替换为可以访问的bootcss静态库的libs网址,如下:
之后就可以打开了。或者直接将report.html模板文件的对应行修改掉,这样生成的报告web页面都会自动替换。
模板文件位置:/usr/lib/python2.7/site-packages/rally/ui/templates/task/report.html
Rally测试数据主要是根据REST API的请求和响应时间进行统计时间,由于OpenStack的API是异步的,当API返回时,其请求的资源未必真正完成创建,因此Rally没有办法测试出资源从开始创建到最后创建完成整个流程需要的时间。而在我们的场景下,Rally也是只是测试NSP的API响应时间,无法测试出NSP给Service-engine下发消息的时间,也无法测试出Service-engine组件调用AC 接口创建相关网络资源的时间。
从改善用户体验角度来说,测试API的响应时间非常关键,科学研究表明,对于一个人机交互系统来说,用户等待时间 >4s而不给任何响应则会给人的体验非常差。从这个意义上来说,Rally的测试非常有必要,也很有价值。但是API返回结果,未必意味着用户的资源已经准备好,从整个流程的优化来看,还需要统计出Service-engine组件调用AC 接口创建相关网络资源的时间,这是下一步的工作。