第四章 压力测试
我们都知道,互联网应用必须要做的一步就是压力测试,因为每天互联网应用都要面对成千上万的请求。虽然Odoo的定位是企业内部应用,但一旦企业规模变大,服务器也面临着并发带来的压力,因此压力测试也是Odoo运维过程中必不可少的环节之一。本章将带领读者使用Python的压力测试工具Locust来对我们的Odoo应用进行压力测试评估。
任何系统不论如何优化,都会又一个性能的瓶颈,我们做压力测试的目的就是想要知道在一定标准的范围内,服务器经过最优优化后的极限性能在哪,以便我们在预估服务器到达性能极限之前及时对软硬件进行升级,以应对即将到来的压力挑战。
Locust简介
Locust是Python写的压力测试工具,拥有简单明了的UI控制界面和图形报表,而且支持分布式测试。写一个Locust测试脚步也非常简单。
首先,我们安装这个工具:
pip install locustio
启动命令:
locust -f locust_files/my_locust_file.py --host=http://example.com
f 参数指明脚本文件所在目录 host 参数为web访问地址,通常设置为ip地址或者0.0.0.0即可。
启动后可以看到日志输出:
kevin@kevin:~/codes/script/python/locust_test$ locust -f odoo_test.py --host=http://0.0.0.0
[2019-08-26 13:07:40,330] kevin/INFO/locust.main: Starting web monitor at *:8089
[2019-08-26 13:07:40,331] kevin/INFO/locust.main: Starting Locust 0.11.0
[2019-08-26 13:07:48,618] kevin/INFO/locust.runners: Hatching and swarming 200 clients at the rate 1 clients/s...
[2019-08-26 13:12:31,373] kevin/INFO/locust.runners: All locusts hatched: Tester: 200
编写脚步测试文件
我们新建了一个Controller,用于接收Locust发出的请求,简单起见没有做登陆认证。
class LocustTest(http.Controller):
@http.route('/locust_test/locust_test/', auth='public')
def index(self, **kw):
return "Hello, world"
@http.route('/locust_test/locust_test/write/', auth='public')
def list(self, **kw):
# return http.request.render('locust_test.listing', {
# 'root': '/locust_test/locust_test',
# 'objects': http.request.env['locust_test.locust_test'].search([]),
# })
sale_obj = request.env["sale.order"].sudo()
# 创建订单
order = sale_obj.create({
"partner_id":7,
"order_line":[(0,0,{
"product_id":1,
})]
})
# 删除订单
order.unlink()
return "Test Done"
然后我们编写压力测试脚本:
from locust import HttpLocust,TaskSet,task
class TestOdoo(TaskSet):
def on_start(self):
self.test_sale_order()
@task(1)
def test_sale_order(self):
self.client.get("http://192.168.23.129:8070/locust_test/locust_test/write/")
class Tester(HttpLocust):
task_set = TestOdoo
min_wait = 50
max_wait = 200
启动测试
我们打开Locust控制页面:
我的测试虚拟机1核2G内存,200用户1并发的结果如下:
也可以看到请求曲线:
可以看到我的小服务器能够支持每秒8个请求的处理。